NE10_INLINE void ne10_mixed_radix_r2c_butterfly_float32_c ( ne10_fft_cpx_float32_t * Fout, const ne10_fft_cpx_float32_t * Fin, const ne10_int32_t * factors, const ne10_fft_cpx_float32_t * twiddles, ne10_fft_cpx_float32_t * buffer) { // PRINT_POINTERS_INFO(Fin,Fout,buffer,twiddles); ne10_int32_t fstride, mstride, nfft; ne10_int32_t radix; ne10_int32_t stage_count; // init fstride, mstride, radix, nfft stage_count = factors[0]; fstride = factors[1]; mstride = factors[ (stage_count << 1) - 1 ]; radix = factors[ stage_count << 1 ]; nfft = radix * fstride; // PRINT_STAGE_INFO; if (stage_count % 2 == 0) { ne10_swap_ptr (buffer, Fout); } // the first stage if (radix == 8) // length of FFT is 2^n (n is odd) { // PRINT_POINTERS_INFO(Fin,Fout,buffer,twiddles); ne10_radix8_r2c_c (Fout, Fin, fstride, mstride, nfft); } else if (radix == 4) // length of FFT is 2^n (n is even) { // PRINT_POINTERS_INFO(Fin,Fout,buffer,twiddles); ne10_radix4_r2c_c (Fout, Fin, fstride, mstride, nfft); } // end of first stage // others for (; fstride > 1;) { fstride >>= 2; ne10_swap_ptr (buffer, Fout); // PRINT_POINTERS_INFO(Fin,Fout,buffer,twiddles); ne10_radix4_r2c_with_twiddles_c (Fout, buffer, fstride, mstride, nfft, twiddles); twiddles += 3 * mstride; mstride <<= 2; } // other stage }
NE10_INLINE void ne10_mixed_radix_c2r_butterfly_float32_c ( ne10_fft_cpx_float32_t * Fout, const ne10_fft_cpx_float32_t * Fin, const ne10_int32_t * factors, const ne10_fft_cpx_float32_t * twiddles, ne10_fft_cpx_float32_t * buffer) { // PRINT_POINTERS_INFO(Fin,Fout,buffer,twiddles); ne10_int32_t fstride, mstride, nfft; ne10_int32_t radix; ne10_int32_t stage_count; // init fstride, mstride, radix, nfft stage_count = factors[0]; fstride = factors[1]; mstride = factors[ (stage_count << 1) - 1 ]; radix = factors[ stage_count << 1 ]; nfft = radix * fstride; // fstride, mstride for the last stage fstride = 1; mstride = nfft >> 2; // PRINT_STAGE_INFO; if (stage_count % 2 == 1) { ne10_swap_ptr (buffer, Fout); } // last butterfly -- inversed if (stage_count > 1) { twiddles -= 3 * mstride; // PRINT_STAGE_INFO; // PRINT_POINTERS_INFO(Fin,Fout,buffer,twiddles); ne10_radix4_c2r_with_twiddles_c (buffer, Fin, fstride, mstride, nfft, twiddles); fstride <<= 2; mstride >>= 2; stage_count --; }
static inline void ne10_mixed_radix_generic_butterfly_float32_impl_c (ne10_fft_cpx_float32_t *Fout, const ne10_fft_cpx_float32_t *Fin, const ne10_int32_t *factors, const ne10_fft_cpx_float32_t *twiddles, ne10_fft_cpx_float32_t *buffer, const ne10_int32_t is_inverse, const ne10_int32_t is_scaled) { ne10_int32_t fstride, mstride, radix; ne10_int32_t stage_count; ne10_int32_t nfft; // init fstride, mstride, radix, nfft stage_count = factors[0]; fstride = factors[1]; mstride = 1; radix = factors[stage_count << 1]; // radix of first stage nfft = fstride * radix; if (stage_count % 2 == 0) { ne10_swap_ptr (buffer, Fout); } // first stage switch (radix) { case 2: ne10_radix_2_butterfly_float32_c (Fout, Fin, NULL, fstride, 1, nfft, 1, is_inverse, is_scaled); break; case 4: ne10_radix_4_butterfly_float32_c (Fout, Fin, NULL, fstride, 1, nfft, 1, is_inverse, is_scaled); break; case 3: ne10_radix_3_butterfly_float32_c (Fout, Fin, NULL, fstride, 1, nfft, 1, is_inverse, is_scaled); break; case 5: ne10_radix_5_butterfly_float32_c (Fout, Fin, NULL, fstride, 1, nfft, 1, is_inverse, is_scaled); break; case 8: ne10_radix_8_butterfly_float32_c (Fout, Fin, NULL, fstride, 1, nfft, 1, is_inverse, is_scaled); default: ne10_radix_generic_butterfly_float32_c (Fout, Fin, twiddles, radix, fstride, 1, is_inverse, is_scaled); break; } stage_count--; if (!stage_count) // finish { return; } if (radix % 2) { twiddles += radix; } // other stges while (stage_count > 0) { ne10_swap_ptr (buffer, Fout); mstride *= radix; // update radix radix = factors[stage_count << 1]; assert ((radix > 1) && (radix < 6)); fstride /= radix; switch (radix) { case 2: ne10_radix_2_butterfly_float32_c (Fout, buffer, twiddles, fstride, mstride, nfft, 0, is_inverse, 0); // Only scaling in the first stage. break; case 3: ne10_radix_3_butterfly_float32_c (Fout, buffer, twiddles, fstride, mstride, nfft, 0, is_inverse, 0); // Only scaling in the first stage. break; case 4: ne10_radix_4_butterfly_float32_c (Fout, buffer, twiddles, fstride, mstride, nfft, 0, is_inverse, 0); // Only scaling in the first stage. break; case 5: ne10_radix_5_butterfly_float32_c (Fout, buffer, twiddles, fstride, mstride, nfft, 0, is_inverse, 0); // Only scaling in the first stage. break; } // switch (radix) twiddles += mstride * (radix - 1); stage_count--; } // while (stage_count) }