- // [0] = exp(2 * i * pi / 5), [1] = exp(2 * i * pi * 2 / 5)
- static const FFTComplex fact[] = { { 0.30901699437494745, 0.95105651629515353 },
- { -0.80901699437494734, 0.58778525229247325 } };
-
- FFTComplex z[4][4];
-
- CMUL2(z[0][0], z[0][3], in[1 * stride], fact[0]);
- CMUL2(z[0][1], z[0][2], in[1 * stride], fact[1]);
- CMUL2(z[1][0], z[1][3], in[2 * stride], fact[0]);
- CMUL2(z[1][1], z[1][2], in[2 * stride], fact[1]);
- CMUL2(z[2][0], z[2][3], in[3 * stride], fact[0]);
- CMUL2(z[2][1], z[2][2], in[3 * stride], fact[1]);
- CMUL2(z[3][0], z[3][3], in[4 * stride], fact[0]);
- CMUL2(z[3][1], z[3][2], in[4 * stride], fact[1]);
-
- out[0].re = in[0].re + in[stride].re + in[2 * stride].re + in[3 * stride].re + in[4 * stride].re;
- out[0].im = in[0].im + in[stride].im + in[2 * stride].im + in[3 * stride].im + in[4 * stride].im;
-
- out[1].re = in[0].re + z[0][0].re + z[1][1].re + z[2][2].re + z[3][3].re;
- out[1].im = in[0].im + z[0][0].im + z[1][1].im + z[2][2].im + z[3][3].im;
-
- out[2].re = in[0].re + z[0][1].re + z[1][3].re + z[2][0].re + z[3][2].re;
- out[2].im = in[0].im + z[0][1].im + z[1][3].im + z[2][0].im + z[3][2].im;
-
- out[3].re = in[0].re + z[0][2].re + z[1][0].re + z[2][3].re + z[3][1].re;
- out[3].im = in[0].im + z[0][2].im + z[1][0].im + z[2][3].im + z[3][1].im;
-
- out[4].re = in[0].re + z[0][3].re + z[1][2].re + z[2][1].re + z[3][0].re;
- out[4].im = in[0].im + z[0][3].im + z[1][2].im + z[2][1].im + z[3][0].im;
+ FFTComplex z0[4], t[6];
+
+ t[0].re = in[3].re + in[12].re;
+ t[0].im = in[3].im + in[12].im;
+ t[1].im = in[3].re - in[12].re;
+ t[1].re = in[3].im - in[12].im;
+ t[2].re = in[6].re + in[ 9].re;
+ t[2].im = in[6].im + in[ 9].im;
+ t[3].im = in[6].re - in[ 9].re;
+ t[3].re = in[6].im - in[ 9].im;
+
+ out[0].re = in[0].re + in[3].re + in[6].re + in[9].re + in[12].re;
+ out[0].im = in[0].im + in[3].im + in[6].im + in[9].im + in[12].im;
+
+ t[4].re = exptab[0].re * t[2].re - exptab[1].re * t[0].re;
+ t[4].im = exptab[0].re * t[2].im - exptab[1].re * t[0].im;
+ t[0].re = exptab[0].re * t[0].re - exptab[1].re * t[2].re;
+ t[0].im = exptab[0].re * t[0].im - exptab[1].re * t[2].im;
+ t[5].re = exptab[0].im * t[3].re - exptab[1].im * t[1].re;
+ t[5].im = exptab[0].im * t[3].im - exptab[1].im * t[1].im;
+ t[1].re = exptab[0].im * t[1].re + exptab[1].im * t[3].re;
+ t[1].im = exptab[0].im * t[1].im + exptab[1].im * t[3].im;
+
+ z0[0].re = t[0].re - t[1].re;
+ z0[0].im = t[0].im - t[1].im;
+ z0[1].re = t[4].re + t[5].re;
+ z0[1].im = t[4].im + t[5].im;
+
+ z0[2].re = t[4].re - t[5].re;
+ z0[2].im = t[4].im - t[5].im;
+ z0[3].re = t[0].re + t[1].re;
+ z0[3].im = t[0].im + t[1].im;
+
+ out[1].re = in[0].re + z0[3].re;
+ out[1].im = in[0].im + z0[0].im;
+ out[2].re = in[0].re + z0[2].re;
+ out[2].im = in[0].im + z0[1].im;
+ out[3].re = in[0].re + z0[1].re;
+ out[3].im = in[0].im + z0[2].im;
+ out[4].re = in[0].re + z0[0].re;
+ out[4].im = in[0].im + z0[3].im;