为了对照结果,我把整数改成了虚部和实部都改成了 float
void NuFFT(float *pi32RealBuffer, float *pi32ImageBuffer, uint32_t u32Len)
{
const uint32_t N = u32Len;
const uint32_t u32TotalStage = log(N) / log(2);
uint32_t u32Stage, u32Span, u32Node, u32Twiddle;
float i32X1Real, i32X1Image, i32X2Real, i32X2Image;
// 添加位反转重排调用
bitReverseReorder(pi32RealBuffer, pi32ImageBuffer, N);
/* Iterations for log2(N) FFT butterfly stages */
for (u32Stage = 0; u32Stage < u32TotalStage; u32Stage++)
{
// Span indicates the buffer index for constituting a butterfly matrix
u32Span = 1 << u32Stage;
for (u32Twiddle = 0; u32Twiddle < u32Span; u32Twiddle++) {
// 计算旋转因子的角度
#if DEBUG
double angle = 2 * M_PI * u32Twiddle / (2 * u32Span);
#else
double angle = -2 * M_PI * u32Twiddle / (2 * u32Span);
#endif
for (u32Node = u32Twiddle; u32Node < N; u32Node += 2 * u32Span) {
/* Get the real and image part of the input variable X1 */
i32X1Real = pi32RealBuffer[u32Node];
i32X1Image = pi32ImageBuffer[u32Node];
/* Get the real and image part of the input variable X2 */
i32X2Real = pi32RealBuffer[u32Node + u32Span];
i32X2Image = pi32ImageBuffer[u32Node + u32Span];
#if DEBUG
/* Y1 = X1 + X2 * twiddle factor , 注意这里是 -angle
* The real part is real * cos() + image * sin()
* The image part is -real * sin() + image * cos()
*/
pi32RealBuffer[u32Node] = i32X1Real + RESCALE(i32X2Real * cos(angle)) + RESCALE(i32X2Image * sin(angle));
pi32ImageBuffer[u32Node] = i32X1Image - RESCALE(i32X2Real * sin(angle)) + RESCALE(i32X2Image * cos(angle));
/* Y2 = X1 - X2 * twiddle factor
* The real part is -real * cos() - image * sin()
* The image part is real * sin() - image * cos()
*/
pi32RealBuffer[u32Node + u32Span] = i32X1Real - RESCALE(i32X2Real * cos(angle)) - RESCALE(i32X2Image * sin(angle));
pi32ImageBuffer[u32Node + u32Span] = i32X1Image + RESCALE(i32X2Real * sin(angle)) - RESCALE(i32X2Image * cos(angle));
#else
uint32_t x2_tw_real = RESCALE(i32X2Real * cos(angle)) - RESCALE(i32X2Image * sin(angle));
uint32_t x2_tw_imag = RESCALE(i32X2Real * sin(angle)) + RESCALE(i32X2Image * cos(angle));
pi32RealBuffer [u32Node] = i32X1Real + x2_tw_real ;
pi32ImageBuffer[u32Node] = i32X1Image + x2_tw_imag ;
pi32RealBuffer [u32Node + u32Span] = i32X1Real - x2_tw_real ;
pi32ImageBuffer[u32Node + u32Span] = i32X1Image - x2_tw_imag ;
#endif
}
}
}
}
必须要倒序输入
|