6 #include <schroedinger/schro.h>
7 #include <schroedinger/schrowavelet.h>
8 #include <schroedinger/schrooil.h>
9 #include <liboil/liboil.h>
21 int filtershift
[] = { 1, 1, 1, 0, 1, 0, 1 };
23 void synth(int16_t *a
, int filter
, int n
);
24 void split (int16_t *a
, int filter
, int n
);
25 void synth_schro_ext (int16_t *a
, int filter
, int n
);
26 void split_schro_ext (int16_t *a
, int n
, int filter
);
27 void deinterleave (int16_t *a
, int n
);
28 void interleave (int16_t *a
, int n
);
29 void dump (int16_t *a
, int n
);
30 void dump_cmp (int16_t *a
, int16_t *b
, int n
);
36 gain_test(int filter
, int level
, int n_levels
)
53 for(i
=0;i
<N
>>n_levels
;i
++){
54 a
[i
]=rint(100 * random_std());
57 for(i
=N
>>(n_levels
-level
+1);i
<N
>>(n_levels
-level
);i
++){
58 a
[i
]=rint(100 * random_std());
65 for(i
=0;i
<n_levels
;i
++){
66 interleave(a
,N
>>(n_levels
-1-i
));
67 synth_schro_ext(a
,N
>>(n_levels
-1-i
),filter
);
77 //printf("%d %g %g\n", level, gain/10000, sqrt(gain/10000));
79 return sqrt(gain
/10000);
83 main (int argc
, char *argv
[])
92 filter
= strtol(argv
[1], NULL
, 0);
101 for(n_levels
=1;n_levels
<=4;n_levels
++){
102 printf("n_levels=%d:\n", n_levels
);
103 for(i
=0;i
<=n_levels
;i
++){
104 a
[i
] = gain_test (filter
, i
, n_levels
);
106 for(i
=0;i
<=n_levels
;i
++){
107 printf("%d %5.3f\n", i
, a
[i
]);
110 b
[0] = a
[0] * a
[0] / (1<<(n_levels
*filtershift
[filter
]));
111 for(i
=0;i
<n_levels
;i
++){
112 b
[i
*2+1] = a
[i
+0] * a
[i
+1] / (1<<((n_levels
-i
)*filtershift
[filter
]));
113 b
[i
*2+2] = a
[i
+1] * a
[i
+1] / (1<<((n_levels
-i
)*filtershift
[filter
]));
117 for(i
=0;i
<n_levels
*2+1;i
++){
118 if (b
[i
] < min
) min
= b
[i
];
121 for(i
=0;i
<n_levels
*2+1;i
++){
122 printf("%d %5.3f %5.3f %d\n", i
, b
[i
], b
[i
]/min
, gain_to_quant_index(b
[i
]/min
));
131 interleave (int16_t *a
, int n
)
136 tmp2
[i
*2 + 1] = a
[n
/2 + i
];
144 deinterleave (int16_t *a
, int n
)
149 tmp2
[n
/2 + i
] = a
[i
*2+1];
157 split_schro_ext (int16_t *a
, int n
, int filter
)
159 int16_t tmp1
[2000], *hi
;
160 int16_t tmp2
[2000], *lo
;
165 oil_deinterleave2_s16 (hi
, lo
, a
, n
/2);
168 case SCHRO_WAVELET_DESLAURIERS_DUBUC_9_7
:
169 schro_split_ext_desl93 (hi
, lo
, n
/2);
171 case SCHRO_WAVELET_LE_GALL_5_3
:
172 schro_split_ext_53 (hi
, lo
, n
/2);
174 case SCHRO_WAVELET_DESLAURIERS_DUBUC_13_7
:
175 schro_split_ext_135 (hi
, lo
, n
/2);
177 case SCHRO_WAVELET_HAAR_0
:
178 case SCHRO_WAVELET_HAAR_1
:
179 schro_split_ext_haar (hi
, lo
, n
/2);
181 case SCHRO_WAVELET_FIDELITY
:
182 schro_split_ext_fidelity (hi
, lo
, n
/2);
184 case SCHRO_WAVELET_DAUBECHIES_9_7
:
185 schro_split_ext_daub97(hi
, lo
, n
/2);
188 oil_interleave2_s16 (a
, hi
, lo
, n
/2);
193 synth_schro_ext (int16_t *a
, int n
, int filter
)
195 int16_t tmp1
[2000], *hi
;
196 int16_t tmp2
[2000], *lo
;
201 oil_deinterleave2_s16 (hi
, lo
, a
, n
/2);
204 case SCHRO_WAVELET_DESLAURIERS_DUBUC_9_7
:
205 schro_synth_ext_desl93 (hi
, lo
, n
/2);
207 case SCHRO_WAVELET_LE_GALL_5_3
:
208 schro_synth_ext_53 (hi
, lo
, n
/2);
210 case SCHRO_WAVELET_DESLAURIERS_DUBUC_13_7
:
211 schro_synth_ext_135 (hi
, lo
, n
/2);
213 case SCHRO_WAVELET_HAAR_0
:
214 case SCHRO_WAVELET_HAAR_1
:
215 schro_synth_ext_haar (hi
, lo
, n
/2);
217 case SCHRO_WAVELET_FIDELITY
:
218 schro_synth_ext_fidelity (hi
, lo
, n
/2);
220 case SCHRO_WAVELET_DAUBECHIES_9_7
:
221 schro_synth_ext_daub97(hi
, lo
, n
/2);
225 oil_interleave2_s16 (a
, hi
, lo
, n
/2);