compute_haar_basis.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "../src/dct.h"
  4. #include "../src/filter.h"
  5. #include "../src/tf.h"
  6. #define OD_BASIS_SIZE (4*OD_BSIZE_MAX)
  7. #define OD_BASIS_PULSE 1024
  8. int main(int argc, char *argv[]) {
  9. int ln;
  10. int n;
  11. od_coeff x0[OD_BASIS_SIZE*OD_BASIS_SIZE];
  12. od_coeff *x1;
  13. od_coeff *x2;
  14. int i;
  15. int j;
  16. int k;
  17. int l;
  18. double sum[OD_NBSIZES - 1][4];
  19. (void)argc;
  20. (void)argv;
  21. for (ln = 0; ln < OD_NBSIZES - 1; ln++) {
  22. n = 4 << ln;
  23. for (j = 0; j < 2; j++) {
  24. for (i = 0; i < 2; i++) {
  25. /*printf("%i %i\n",i,j);*/
  26. OD_CLEAR(x0, OD_BASIS_SIZE*OD_BASIS_SIZE);
  27. x0[n*(j + 1)*OD_BASIS_SIZE + n*(i + 1)] = OD_BASIS_PULSE;
  28. OD_HAAR_KERNEL(x0[n*1*OD_BASIS_SIZE + n*1], x0[n*1*OD_BASIS_SIZE + n*2],
  29. x0[n*2*OD_BASIS_SIZE + n*1], x0[n*2*OD_BASIS_SIZE + n*2]);
  30. for (l = 0; l < 2; l++) {
  31. for (k = 0; k < 2; k++) {
  32. x1 = &x0[n*(l + 1)*OD_BASIS_SIZE + n*(k + 1)];
  33. OD_IDCT_2D_C[ln](x1, OD_BASIS_SIZE, x1, OD_BASIS_SIZE);
  34. }
  35. }
  36. od_postfilter_split(&x0[n*OD_BASIS_SIZE + n], OD_BASIS_SIZE, ln + 1, 0, 0, 0, 0, 1, 1);
  37. x1 = &x0[n - 2];
  38. x2 = &x0[3*n - 2];
  39. for (l = 0; l < 4*n; l++) {
  40. (*OD_POST_FILTER[0])(x1 + l*OD_BASIS_SIZE, x1 + l*OD_BASIS_SIZE);
  41. (*OD_POST_FILTER[0])(x2 + l*OD_BASIS_SIZE, x2 + l*OD_BASIS_SIZE);
  42. }
  43. x1 = &x0[(n - 2)*OD_BASIS_SIZE];
  44. x2 = &x0[(3*n - 2)*OD_BASIS_SIZE];
  45. for (k = 0; k < 4*n; k++) {
  46. od_coeff t1[4];
  47. od_coeff t2[4];
  48. for (l = 0; l < 4; l++) {
  49. t1[l] = x1[OD_BASIS_SIZE*l + k];
  50. t2[l] = x2[OD_BASIS_SIZE*l + k];
  51. }
  52. (*OD_POST_FILTER[0])(t1, t1);
  53. (*OD_POST_FILTER[0])(t2, t2);
  54. for (l = 0; l < 4; l++) {
  55. x1[OD_BASIS_SIZE*l + k] = t1[l];
  56. x2[OD_BASIS_SIZE*l + k] = t2[l];
  57. }
  58. }
  59. /*x1 = &x0[(n - 2)*OD_BASIS_SIZE + n - 2];
  60. for (l = 0; l < 2*n + 4; l++) {
  61. for (k = 0; k < 2*n + 4; k++) {
  62. printf("%5i ", x1[l*OD_BASIS_SIZE + k]);
  63. }
  64. printf("\n");
  65. }*/
  66. x1 = &x0[(n - 2)*OD_BASIS_SIZE + n - 2];
  67. sum[ln][j*2 + i] = 0;
  68. for (l = 0; l < 2*n + 4; l++) {
  69. for (k = 0; k < 2*n + 4; k++) {
  70. sum[ln][j*2 + i] += x1[OD_BASIS_SIZE*l + k]*x1[OD_BASIS_SIZE*l + k];
  71. }
  72. }
  73. }
  74. }
  75. }
  76. for (ln = 0; ln < OD_NBSIZES - 1; ln++) {
  77. for (i = 0; i < 4; i++) {
  78. printf("%s%f", i > 0 ? ", " : "", sqrt(sum[ln][i])/OD_BASIS_PULSE);
  79. }
  80. printf("\n");
  81. }
  82. printf("\n");
  83. printf("const od_coeff OD_DC_QM[OD_NBSIZES - 1][2] = {\n");
  84. for (ln = 0; ln < OD_NBSIZES - 1; ln++) {
  85. int hv_quant;
  86. int diag_quant;
  87. hv_quant = (int)(OD_BASIS_PULSE/sqrt(sum[ln][1])*16 + 0.5);
  88. diag_quant = (int)(OD_BASIS_PULSE/sqrt(sum[ln][3])*16 + 0.5);
  89. printf("%s{%i, %i}", ln > 0 ? ", " : " ", hv_quant, diag_quant);
  90. }
  91. printf("\n};\n");
  92. return EXIT_SUCCESS;
  93. }