22 #if defined (_MSC_VER)
23 #pragma pack (push, 8)
39 : _bit_rev_lut (int (floor (logf (length) / logf (2) + 0.5f)))
40 , _trigo_lut (int (floor (logf (length) / logf (2) + 0.5f)))
41 , _sqrt2_2 (
flt_t (sqrtf (2) * 0.5f))
43 , _nbr_bits (int (floor (logf (length) / logf (2) + 0.5f)))
117 const long rev_index_0 = bit_rev_lut_ptr [coef_index];
118 const long rev_index_1 = bit_rev_lut_ptr [coef_index + 1];
119 const long rev_index_2 = bit_rev_lut_ptr [coef_index + 2];
120 const long rev_index_3 = bit_rev_lut_ptr [coef_index + 3];
122 flt_t *
const df2 = df + coef_index;
123 df2 [1] = x [rev_index_0] - x [rev_index_1];
124 df2 [3] = x [rev_index_2] - x [rev_index_3];
126 const flt_t sf_0 = x [rev_index_0] + x [rev_index_1];
127 const flt_t sf_2 = x [rev_index_2] + x [rev_index_3];
129 df2 [0] = sf_0 + sf_2;
130 df2 [2] = sf_0 - sf_2;
145 sf [coef_index] = df [coef_index] + df [coef_index + 4];
146 sf [coef_index + 4] = df [coef_index] - df [coef_index + 4];
147 sf [coef_index + 2] = df [coef_index + 2];
148 sf [coef_index + 6] = df [coef_index + 6];
150 v = (df [coef_index + 5] - df [coef_index + 7]) * sqrt2_2;
151 sf [coef_index + 1] = df [coef_index + 1] + v;
152 sf [coef_index + 3] = df [coef_index + 1] - v;
154 v = (df [coef_index + 5] + df [coef_index + 7]) * sqrt2_2;
155 sf [coef_index + 5] = v + df [coef_index + 3];
156 sf [coef_index + 7] = v - df [coef_index + 3];
167 nbr_coef = 1 << pass;
168 h_nbr_coef = nbr_coef >> 1;
169 d_nbr_coef = nbr_coef << 1;
174 const flt_t *
const sf1r = sf + coef_index;
175 const flt_t *
const sf2r = sf1r + nbr_coef;
176 flt_t *
const dfr = df + coef_index;
177 flt_t *
const dfi = dfr + nbr_coef;
180 dfr [0] = sf1r [0] + sf2r [0];
181 dfi [0] = sf1r [0] - sf2r [0];
182 dfr [h_nbr_coef] = sf1r [h_nbr_coef];
183 dfi [h_nbr_coef] = sf2r [h_nbr_coef];
186 const flt_t *
const sf1i = sf1r + h_nbr_coef;
187 const flt_t *
const sf2i = sf1i + nbr_coef;
188 for (i = 1; i < h_nbr_coef; ++ i)
190 const flt_t c = cos_ptr [i];
191 const flt_t s = cos_ptr [h_nbr_coef - i];
194 v = sf2r [i] * c - sf2i [i] * s;
195 dfr [i] = sf1r [i] + v;
196 dfi [-i] = sf1r [i] - v;
198 v = sf2r [i] * s + sf2i [i] * c;
199 dfi [i] = v + sf1i [i];
200 dfi [nbr_coef - i] = v - sf1i [i];
203 coef_index += d_nbr_coef;
209 flt_t *
const temp_ptr = df;
226 f [1] = x [0] - x [2];
227 f [3] = x [1] - x [3];
229 const flt_t b_0 = x [0] + x [2];
230 const flt_t b_2 = x [1] + x [3];
239 f [0] = x [0] + x [1];
240 f [1] = x [0] - x [1];
300 for (pass =
_nbr_bits - 1; pass >= 3; --pass)
303 nbr_coef = 1 << pass;
304 h_nbr_coef = nbr_coef >> 1;
305 d_nbr_coef = nbr_coef << 1;
310 const flt_t *
const sfr = sf + coef_index;
311 const flt_t *
const sfi = sfr + nbr_coef;
312 flt_t *
const df1r = df + coef_index;
313 flt_t *
const df2r = df1r + nbr_coef;
316 df1r [0] = sfr [0] + sfi [0];
317 df2r [0] = sfr [0] - sfi [0];
318 df1r [h_nbr_coef] = sfr [h_nbr_coef] * 2;
319 df2r [h_nbr_coef] = sfi [h_nbr_coef] * 2;
322 flt_t *
const df1i = df1r + h_nbr_coef;
323 flt_t *
const df2i = df1i + nbr_coef;
324 for (i = 1; i < h_nbr_coef; ++ i)
326 df1r [i] = sfr [i] + sfi [-i];
327 df1i [i] = sfi [i] - sfi [nbr_coef - i];
329 const flt_t c = cos_ptr [i];
330 const flt_t s = cos_ptr [h_nbr_coef - i];
331 const flt_t vr = sfr [i] - sfi [-i];
332 const flt_t vi = sfi [i] + sfi [nbr_coef - i];
334 df2r [i] = vr * c + vi * s;
335 df2i [i] = vi * c - vr * s;
337 coef_index += d_nbr_coef;
344 flt_t *
const temp_ptr = df;
361 df [coef_index] = sf [coef_index] + sf [coef_index + 4];
362 df [coef_index + 4] = sf [coef_index] - sf [coef_index + 4];
363 df [coef_index + 2] = sf [coef_index + 2] * 2;
364 df [coef_index + 6] = sf [coef_index + 6] * 2;
366 df [coef_index + 1] = sf [coef_index + 1] + sf [coef_index + 3];
367 df [coef_index + 3] = sf [coef_index + 5] - sf [coef_index + 7];
369 const flt_t vr = sf [coef_index + 1] - sf [coef_index + 3];
370 const flt_t vi = sf [coef_index + 5] + sf [coef_index + 7];
372 df [coef_index + 5] = (vr + vi) * sqrt2_2;
373 df [coef_index + 7] = (vi - vr) * sqrt2_2;
384 const flt_t * sf2 = df;
388 const flt_t b_0 = sf2 [0] + sf2 [2];
389 const flt_t b_2 = sf2 [0] - sf2 [2];
390 const flt_t b_1 = sf2 [1] * 2;
391 const flt_t b_3 = sf2 [3] * 2;
393 x [bit_rev_lut_ptr [0]] = b_0 + b_1;
394 x [bit_rev_lut_ptr [1]] = b_0 - b_1;
395 x [bit_rev_lut_ptr [2]] = b_2 + b_3;
396 x [bit_rev_lut_ptr [3]] = b_2 - b_3;
399 const flt_t b_0 = sf2 [4] + sf2 [6];
400 const flt_t b_2 = sf2 [4] - sf2 [6];
401 const flt_t b_1 = sf2 [5] * 2;
402 const flt_t b_3 = sf2 [7] * 2;
404 x [bit_rev_lut_ptr [4]] = b_0 + b_1;
405 x [bit_rev_lut_ptr [5]] = b_0 - b_1;
406 x [bit_rev_lut_ptr [6]] = b_2 + b_3;
407 x [bit_rev_lut_ptr [7]] = b_2 - b_3;
412 bit_rev_lut_ptr += 8;
428 const flt_t b_0 = f [0] + f [2];
429 const flt_t b_2 = f [0] - f [2];
431 x [0] = b_0 + f [1] * 2;
432 x [2] = b_0 - f [1] * 2;
433 x [1] = b_2 + f [3] * 2;
434 x [3] = b_2 - f [3] * 2;
440 x [0] = f [0] + f [1];
441 x [1] = f [0] - f [1];
490 length = 1L << nbr_bits;
491 _ptr =
new long [length];
495 for (cnt = 1; cnt < length; ++cnt)
499 while (((br_index ^= bit) & bit) == 0)
504 _ptr [cnt] = br_index;
533 total_len = (1L << (nbr_bits - 1)) - 4;
534 _ptr =
new flt_t [total_len];
536 const double PI = atanf (1) * 4;
537 for (
int level = 3; level < nbr_bits; ++level)
539 const long level_len = 1L << (level - 1);
540 flt_t *
const level_ptr =
const_cast<flt_t *
> (get_ptr (level));
541 const double mul = PI / (level_len << 1);
543 for (
long i = 0; i < level_len; ++ i)
545 level_ptr [i] = (
flt_t) cos (i * mul);
561 #if defined (_MSC_VER)