20 #if defined (_MSC_VER)
21 #pragma pack (push, 8)
37 : _bit_rev_lut (int (floor (logf (length) / logf (2) + 0.5f)))
38 , _trigo_lut (int (floor (logf (length) / logf (2) + 0.5f)))
39 , _sqrt2_2 (
flt_t (sqrtf (2) * 0.5f))
41 , _nbr_bits (int (floor (logf (length) / logf (2) + 0.5f)))
115 const long rev_index_0 = bit_rev_lut_ptr [coef_index];
116 const long rev_index_1 = bit_rev_lut_ptr [coef_index + 1];
117 const long rev_index_2 = bit_rev_lut_ptr [coef_index + 2];
118 const long rev_index_3 = bit_rev_lut_ptr [coef_index + 3];
120 flt_t *
const df2 = df + coef_index;
121 df2 [1] = x [rev_index_0] - x [rev_index_1];
122 df2 [3] = x [rev_index_2] - x [rev_index_3];
124 const flt_t sf_0 = x [rev_index_0] + x [rev_index_1];
125 const flt_t sf_2 = x [rev_index_2] + x [rev_index_3];
127 df2 [0] = sf_0 + sf_2;
128 df2 [2] = sf_0 - sf_2;
143 sf [coef_index] = df [coef_index] + df [coef_index + 4];
144 sf [coef_index + 4] = df [coef_index] - df [coef_index + 4];
145 sf [coef_index + 2] = df [coef_index + 2];
146 sf [coef_index + 6] = df [coef_index + 6];
148 v = (df [coef_index + 5] - df [coef_index + 7]) * sqrt2_2;
149 sf [coef_index + 1] = df [coef_index + 1] + v;
150 sf [coef_index + 3] = df [coef_index + 1] - v;
152 v = (df [coef_index + 5] + df [coef_index + 7]) * sqrt2_2;
153 sf [coef_index + 5] = v + df [coef_index + 3];
154 sf [coef_index + 7] = v - df [coef_index + 3];
165 nbr_coef = 1 << pass;
166 h_nbr_coef = nbr_coef >> 1;
167 d_nbr_coef = nbr_coef << 1;
172 const flt_t *
const sf1r = sf + coef_index;
173 const flt_t *
const sf2r = sf1r + nbr_coef;
174 flt_t *
const dfr = df + coef_index;
175 flt_t *
const dfi = dfr + nbr_coef;
178 dfr [0] = sf1r [0] + sf2r [0];
179 dfi [0] = sf1r [0] - sf2r [0];
180 dfr [h_nbr_coef] = sf1r [h_nbr_coef];
181 dfi [h_nbr_coef] = sf2r [h_nbr_coef];
184 const flt_t *
const sf1i = sf1r + h_nbr_coef;
185 const flt_t *
const sf2i = sf1i + nbr_coef;
186 for (i = 1; i < h_nbr_coef; ++ i)
188 const flt_t c = cos_ptr [i];
189 const flt_t s = cos_ptr [h_nbr_coef - i];
192 v = sf2r [i] * c - sf2i [i] * s;
193 dfr [i] = sf1r [i] + v;
194 dfi [-i] = sf1r [i] - v;
196 v = sf2r [i] * s + sf2i [i] * c;
197 dfi [i] = v + sf1i [i];
198 dfi [nbr_coef - i] = v - sf1i [i];
201 coef_index += d_nbr_coef;
207 flt_t *
const temp_ptr = df;
224 f [1] = x [0] - x [2];
225 f [3] = x [1] - x [3];
227 const flt_t b_0 = x [0] + x [2];
228 const flt_t b_2 = x [1] + x [3];
237 f [0] = x [0] + x [1];
238 f [1] = x [0] - x [1];
298 for (pass =
_nbr_bits - 1; pass >= 3; --pass)
301 nbr_coef = 1 << pass;
302 h_nbr_coef = nbr_coef >> 1;
303 d_nbr_coef = nbr_coef << 1;
308 const flt_t *
const sfr = sf + coef_index;
309 const flt_t *
const sfi = sfr + nbr_coef;
310 flt_t *
const df1r = df + coef_index;
311 flt_t *
const df2r = df1r + nbr_coef;
314 df1r [0] = sfr [0] + sfi [0];
315 df2r [0] = sfr [0] - sfi [0];
316 df1r [h_nbr_coef] = sfr [h_nbr_coef] * 2;
317 df2r [h_nbr_coef] = sfi [h_nbr_coef] * 2;
320 flt_t *
const df1i = df1r + h_nbr_coef;
321 flt_t *
const df2i = df1i + nbr_coef;
322 for (i = 1; i < h_nbr_coef; ++ i)
324 df1r [i] = sfr [i] + sfi [-i];
325 df1i [i] = sfi [i] - sfi [nbr_coef - i];
327 const flt_t c = cos_ptr [i];
328 const flt_t s = cos_ptr [h_nbr_coef - i];
329 const flt_t vr = sfr [i] - sfi [-i];
330 const flt_t vi = sfi [i] + sfi [nbr_coef - i];
332 df2r [i] = vr * c + vi * s;
333 df2i [i] = vi * c - vr * s;
335 coef_index += d_nbr_coef;
342 flt_t *
const temp_ptr = df;
359 df [coef_index] = sf [coef_index] + sf [coef_index + 4];
360 df [coef_index + 4] = sf [coef_index] - sf [coef_index + 4];
361 df [coef_index + 2] = sf [coef_index + 2] * 2;
362 df [coef_index + 6] = sf [coef_index + 6] * 2;
364 df [coef_index + 1] = sf [coef_index + 1] + sf [coef_index + 3];
365 df [coef_index + 3] = sf [coef_index + 5] - sf [coef_index + 7];
367 const flt_t vr = sf [coef_index + 1] - sf [coef_index + 3];
368 const flt_t vi = sf [coef_index + 5] + sf [coef_index + 7];
370 df [coef_index + 5] = (vr + vi) * sqrt2_2;
371 df [coef_index + 7] = (vi - vr) * sqrt2_2;
382 const flt_t * sf2 = df;
386 const flt_t b_0 = sf2 [0] + sf2 [2];
387 const flt_t b_2 = sf2 [0] - sf2 [2];
388 const flt_t b_1 = sf2 [1] * 2;
389 const flt_t b_3 = sf2 [3] * 2;
391 x [bit_rev_lut_ptr [0]] = b_0 + b_1;
392 x [bit_rev_lut_ptr [1]] = b_0 - b_1;
393 x [bit_rev_lut_ptr [2]] = b_2 + b_3;
394 x [bit_rev_lut_ptr [3]] = b_2 - b_3;
397 const flt_t b_0 = sf2 [4] + sf2 [6];
398 const flt_t b_2 = sf2 [4] - sf2 [6];
399 const flt_t b_1 = sf2 [5] * 2;
400 const flt_t b_3 = sf2 [7] * 2;
402 x [bit_rev_lut_ptr [4]] = b_0 + b_1;
403 x [bit_rev_lut_ptr [5]] = b_0 - b_1;
404 x [bit_rev_lut_ptr [6]] = b_2 + b_3;
405 x [bit_rev_lut_ptr [7]] = b_2 - b_3;
410 bit_rev_lut_ptr += 8;
426 const flt_t b_0 = f [0] + f [2];
427 const flt_t b_2 = f [0] - f [2];
429 x [0] = b_0 + f [1] * 2;
430 x [2] = b_0 - f [1] * 2;
431 x [1] = b_2 + f [3] * 2;
432 x [3] = b_2 - f [3] * 2;
438 x [0] = f [0] + f [1];
439 x [1] = f [0] - f [1];
488 length = 1L << nbr_bits;
489 _ptr =
new long [length];
493 for (cnt = 1; cnt < length; ++cnt)
497 while (((br_index ^= bit) & bit) == 0)
502 _ptr [cnt] = br_index;
531 total_len = (1L << (nbr_bits - 1)) - 4;
532 _ptr =
new flt_t [total_len];
534 const double PI = atanf (1) * 4;
535 for (
int level = 3; level < nbr_bits; ++level)
537 const long level_len = 1L << (level - 1);
538 flt_t *
const level_ptr =
const_cast<flt_t *
> (get_ptr (level));
539 const double mul = PI / (level_len << 1);
541 for (
long i = 0; i < level_len; ++ i)
543 level_ptr [i] = (
flt_t) cos (i * mul);
559 #if defined (_MSC_VER)
TrigoLUT(const int nbr_bits)
void do_fft(flt_t f[], const flt_t x[]) const
const long * get_ptr() const
void rescale(flt_t x[]) const
const TrigoLUT _trigo_lut
const flt_t * get_ptr(const int level) const
BitReversedLUT(const int nbr_bits)
const BitReversedLUT _bit_rev_lut
FFTReal(const long length)
void do_ifft(const flt_t f[], flt_t x[]) const