void fft_radix4_I( int *fr, int *fi, int ldn) { const int n = (1UL<<ldn); int ldm = 0, rdx = 2; for (int i0 = 0; i0 < n; i0 += 4) { int xr,yr,ur,vr, xi,yi,ui,vi; int i1 = i0 + 1; int i2 = i1 + 1; int i3 = i2 + 1; sum_dif_I(fr[i0], fr[i1], xr, ur); sum_dif_I(fr[i2], fr[i3], yr, vi); sum_dif_I(fi[i0], fi[i1], xi, ui); sum_dif_I(fi[i3], fi[i2], yi, vr); sum_dif_I(ui, vi, fi[i1], fi[i3]); sum_dif_I(xi, yi, fi[i0], fi[i2]); sum_dif_I(ur, vr, fr[i1], fr[i3]); sum_dif_I(xr, yr, fr[i0], fr[i2]); } for (ldm = 2 * rdx; ldm <= ldn; ldm += rdx) { int m = (1UL<<ldm); int m4 = (m>>rdx); int phI0 = NWAVE / m; int phI = 0; for (int j = 0; j < m4; j++) { int c,s,c2,s2,c3,s3; s = Sinewave[ phI]; s2 = Sinewave[ 2*phI]; s3 = Sinewave[ 3*phI]; c = Sinewave[ phI + NWAVE/4]; c2 = Sinewave[ 2*phI + NWAVE/4]; c3 = Sinewave[ 3*phI + NWAVE/4]; for (int r = 0; r < n; r += m) { int i0 = j + r; int i1 = i0 + m4; int i2 = i1 + m4; int i3 = i2 + m4; int xr,yr,ur,vr, xi,yi,ui,vi; mult_shf_I( c2, s2, fr[i1], fi[i1], xr, xi); mult_shf_I( c, s, fr[i2], fi[i2], yr, vr); mult_shf_I( c3, s3, fr[i3], fi[i3], vi, yi); int t = yi - vr; yi += vr; vr = t; ur = fr[i0] - xr; xr += fr[i0]; sum_dif_I(ur, vr, fr[i1], fr[i3]); t = yr - vi; yr += vi; vi = t; ui = fi[i0] - xi; xi += fi[i0]; sum_dif_I(ui, vi, fi[i1], fi[i3]); sum_dif_I(xr, yr, fr[i0], fr[i2]); sum_dif_I(xi, yi, fi[i0], fi[i2]); } phI += phI0; } } }
void fft_radix4_I(int *fr, int *fi, int ldn) { const int n = (1UL<<ldn); int ldm = 0, rdx = 2; ldm = (ldn&1); if ( ldm!=0 ) { for (int i0=0; i0<n; i0+=8) { fft8_dit_core_p1(fr+i0, fi+i0); } } else { for (int i0 = 0; i0 < n; i0 += 4) { int xr,yr,ur,vr, xi,yi,ui,vi; int i1 = i0 + 1; int i2 = i1 + 1; int i3 = i2 + 1; sum_dif_I(fr[i0], fr[i1], &xr, &ur); sum_dif_I(fr[i2], fr[i3], &yr, &vi); sum_dif_I(fi[i0], fi[i1], &xi, &ui); sum_dif_I(fi[i3], fi[i2], &yi, &vr); sum_dif_I(ui, vi, &fi[i1], &fi[i3]); sum_dif_I(xi, yi, &fi[i0], &fi[i2]); sum_dif_I(ur, vr, &fr[i1], &fr[i3]); sum_dif_I(xr, yr, &fr[i0], &fr[i2]); } } for (ldm += 2 * rdx; ldm <= ldn; ldm += rdx) { int m = (1UL<<ldm); int m4 = (m>>rdx); int phI0 = NWAVE / m; int phI = 0; for (int j = 0; j < m4; j++) { int c,s,c2,s2,c3,s3; s = pgm_read_word(&Sinewave[ phI]); s2 = pgm_read_word(&Sinewave[ 2*phI]); s3 = pgm_read_word(&Sinewave[ 3*phI]); c = pgm_read_word(&Sinewave[ phI + NWAVE/4]); c2 = pgm_read_word(&Sinewave[ 2*phI + NWAVE/4]); c3 = pgm_read_word(&Sinewave[ 3*phI + NWAVE/4]); for (int r = 0; r < n; r += m) { int i0 = j + r; int i1 = i0 + m4; int i2 = i1 + m4; int i3 = i2 + m4; int xr,yr,ur,vr,xi,yi,ui,vi; mult_shf_I( c2, s2, fr[i1], fi[i1], &xr, &xi); mult_shf_I( c, s, fr[i2], fi[i2], &yr, &vr); mult_shf_I( c3, s3, fr[i3], fi[i3], &vi, &yi); int t = yi - vr; yi += vr; vr = t; ur = fr[i0] - xr; xr += fr[i0]; sum_dif_I(ur, vr, &fr[i1], &fr[i3]); t = yr - vi; yr += vi; vi = t; ui = fi[i0] - xi; xi += fi[i0]; sum_dif_I(ui, vi, &fi[i1], &fi[i3]); sum_dif_I(xr, yr, &fr[i0], &fr[i2]); sum_dif_I(xi, yi, &fi[i0], &fi[i2]); } phI += phI0; } } }