47 #include "NE10_types.h"
48 #include "NE10_macros.h"
61 ne10_int32_t ne10_factor (ne10_int32_t n,
62 ne10_int32_t * facbuf,
63 ne10_int32_t ne10_factor_flags)
67 assert (NE10_MAXFACTORS >= 32);
77 ne10_int32_t stage_num = 0;
78 ne10_int32_t stride_max = n;
81 ne10_int32_t alg_flag = NE10_FFT_ALG_24;
89 if ((ne10_factor_flags & NE10_FACTOR_EIGHT)
90 && ((n==8) || (n==40) || (n==24)))
99 alg_flag = NE10_FFT_ALG_ANY;
103 alg_flag = NE10_FFT_ALG_ANY;
107 else if ((n % 4) == 0)
111 else if ((n % 2) == 0)
115 else if ((n % 5) == 0)
118 alg_flag = NE10_FFT_ALG_ANY;
120 else if ((n % 3) == 0)
123 alg_flag = NE10_FFT_ALG_ANY;
128 alg_flag = NE10_FFT_ALG_ANY;
133 facbuf[2 * i + 1] = n;
138 facbuf[0] = stage_num;
139 facbuf[1] = stride_max / p;
148 facbuf[2 * i] = alg_flag;
156 const ne10_int32_t mstride,
157 const ne10_int32_t fstride,
158 const ne10_int32_t radix,
159 const ne10_int32_t nfft)
162 ne10_float32_t phase;
163 const ne10_float64_t pi = NE10_PI;
165 for (j = 0; j < mstride; j++)
167 for (k = 1; k < radix; k++)
169 phase = -2 * pi * fstride * k * j / nfft;
170 twiddles[mstride * (k - 1) + j].r = (ne10_float32_t) cos (phase);
171 twiddles[mstride * (k - 1) + j].i = (ne10_float32_t) sin (phase);
181 void ne10_fft_generate_twiddles_line_transposed_float32 (
183 const ne10_int32_t mstride,
184 const ne10_int32_t fstride,
185 const ne10_int32_t radix,
186 const ne10_int32_t nfft)
189 ne10_float32_t phase;
190 const ne10_float64_t pi = NE10_PI;
192 for (j = 0; j < mstride; j++)
194 for (k = 1; k < radix; k++)
196 phase = -2 * pi * fstride * k * j / nfft;
197 twiddles[(radix - 1) * j + k - 1].r = (ne10_float32_t) cos (phase);
198 twiddles[(radix - 1) * j + k - 1].i = (ne10_float32_t) sin (phase);
207 const ne10_int32_t mstride,
208 const ne10_int32_t fstride,
209 const ne10_int32_t radix,
210 const ne10_int32_t nfft)
213 ne10_float32_t phase;
214 const ne10_float64_t pi = NE10_PI;
216 for (j = 0; j < mstride; j++)
218 for (k = 1; k < radix; k++)
220 phase = -2 * pi * fstride * k * j / nfft;
224 tw->r = (ne10_int32_t) floor (0.5f + NE10_F2I32_MAX * cos(phase));
225 tw->i = (ne10_int32_t) floor (0.5f + NE10_F2I32_MAX * sin(phase));
231 const ne10_int32_t * factors,
232 const ne10_int32_t nfft )
234 ne10_int32_t stage_count = factors[0];
235 ne10_int32_t fstride = factors[1];
236 ne10_int32_t mstride;
237 ne10_int32_t cur_radix;
240 cur_radix = factors[2 * stage_count];
244 ne10_fft_generate_twiddles_line_int32 (twiddles, 1, fstride, cur_radix, nfft);
245 twiddles += cur_radix - 1;
250 for (; stage_count > 0; stage_count--)
252 cur_radix = factors[2 * stage_count];
253 fstride /= cur_radix;
254 mstride = factors[2 * stage_count + 1];
255 ne10_fft_generate_twiddles_line_int32 (twiddles, mstride, fstride, cur_radix, nfft);
256 twiddles += mstride * (cur_radix - 1);
269 line_generator_float32 generator,
271 const ne10_int32_t * factors,
272 const ne10_int32_t nfft)
274 ne10_int32_t stage_count = factors[0];
275 ne10_int32_t fstride = factors[1];
276 ne10_int32_t mstride;
277 ne10_int32_t cur_radix;
280 cur_radix = factors[2 * stage_count];
286 generator (twiddles, 1, fstride, cur_radix, nfft);
287 twiddles += cur_radix - 1;
292 for (; stage_count > 0; stage_count --)
294 cur_radix = factors[2 * stage_count];
295 fstride /= cur_radix;
296 mstride = factors[2 * stage_count + 1];
297 generator (twiddles, mstride, fstride, cur_radix, nfft);
298 twiddles += mstride * (cur_radix - 1);
305 const ne10_int32_t * factors,
306 const ne10_int32_t nfft )
308 line_generator_float32 generator = ne10_fft_generate_twiddles_line_float32;
309 twiddles = ne10_fft_generate_twiddles_impl_float32(generator,
310 twiddles, factors, nfft);
316 const ne10_int32_t * factors,
317 const ne10_int32_t nfft)
319 line_generator_float32 generator =
320 ne10_fft_generate_twiddles_line_transposed_float32;
321 twiddles = ne10_fft_generate_twiddles_impl_float32(generator,
322 twiddles, factors, nfft);
348 +
sizeof (ne10_int32_t) * (NE10_MAXFACTORS * 2)
351 + NE10_FFT_BYTE_ALIGNMENT;
366 NE10_BYTE_ALIGNMENT (address, NE10_FFT_BYTE_ALIGNMENT);
367 st->factors = (ne10_int32_t*) address;
369 st->buffer = st->twiddles + nfft;
373 st->last_twiddles = NULL;
376 if (nfft % NE10_FFT_PARA_LEVEL == 0)
379 st->nfft /= NE10_FFT_PARA_LEVEL;
380 st->last_twiddles = st->twiddles + nfft / NE10_FFT_PARA_LEVEL;
383 ne10_int32_t result = ne10_factor (st->nfft, st->factors, NE10_FACTOR_DEFAULT);
386 if (result == NE10_ERR)
393 ne10_int32_t stage_count = st->factors[0];
394 ne10_int32_t algorithm_flag = st->factors[2 * (stage_count + 1)];
397 if (algorithm_flag == NE10_FFT_ALG_ANY)
399 result = ne10_factor (st->nfft, st->factors, NE10_FACTOR_EIGHT);
400 if (result == NE10_ERR)
405 ne10_fft_generate_twiddles_float32 (st->twiddles, st->factors, st->nfft);
409 st->last_twiddles = NULL;
411 result = ne10_factor (st->nfft, st->factors, NE10_FACTOR_DEFAULT);
412 ne10_fft_generate_twiddles_float32 (st->twiddles, st->factors, st->nfft);
417 if (nfft % NE10_FFT_PARA_LEVEL == 0)
420 ne10_fft_generate_twiddles_line_float32 (st->last_twiddles,
446 +
sizeof (ne10_int32_t) * (NE10_MAXFACTORS * 2)
449 + NE10_FFT_BYTE_ALIGNMENT;
460 NE10_BYTE_ALIGNMENT (address, NE10_FFT_BYTE_ALIGNMENT);
461 st->factors = (ne10_int32_t*) address;
463 st->buffer = st->twiddles + nfft;
467 st->last_twiddles = NULL;
470 if (nfft % NE10_FFT_PARA_LEVEL == 0)
473 st->nfft /= NE10_FFT_PARA_LEVEL;
474 st->last_twiddles = st->twiddles + nfft / NE10_FFT_PARA_LEVEL;
477 ne10_int32_t result = ne10_factor (st->nfft, st->factors, NE10_FACTOR_DEFAULT);
480 if (result == NE10_ERR)
487 ne10_int32_t stage_count = st->factors[0];
488 ne10_int32_t algorithm_flag = st->factors[2 * (stage_count + 1)];
491 if (algorithm_flag == NE10_FFT_ALG_ANY)
493 result = ne10_factor (st->nfft, st->factors, NE10_FACTOR_EIGHT);
494 if (result == NE10_ERR)
499 ne10_fft_generate_twiddles_int32 (st->twiddles, st->factors, st->nfft);
503 st->last_twiddles = NULL;
505 result = ne10_factor (st->nfft, st->factors, NE10_FACTOR_DEFAULT);
506 ne10_fft_generate_twiddles_int32 (st->twiddles, st->factors, st->nfft);
511 if (nfft % NE10_FFT_PARA_LEVEL == 0)
514 ne10_fft_generate_twiddles_line_int32 (st->last_twiddles,