请大家解释一段FFT程序实现的C代码

来源:百度知道 编辑:UC知道 时间:2024/06/30 06:35:57
void FFT(float xreal [], float ximag [], int n)
{
// 快速傅立叶变换,将复数 x 变换后仍保存在 x 中,xreal, ximag 分别是 x 的实部和虚部
float wreal [N / 2], wimag [N / 2], treal, timag, ureal, uimag, arg;
int m, k, j, t, index1, index2;

bitrp (xreal, ximag, n);//实现二进制反序操作,这样变换后是从0到n的正确排序

// 计算 1 的前 n / 2 个 n 次方根的共轭复数 W'j = wreal [j] + i * wimag [j] , j = 0, 1, ... , n / 2 - 1
arg = - 2 * PI / n;
treal = cos (arg);
timag = sin (arg);
wreal [0] = 1.0;
wimag [0] = 0.0;
for (j = 1; j < n / 2; j ++)
{
wreal [j] = wreal [j - 1] * treal - wimag [j - 1] * timag;
wimag [j] = wreal [j - 1] * timag + wimag [j - 1] * treal;
}

for (m = 2; m <= n; m *= 2)
{
for (k = 0; k < n; k += m)
{
for (j = 0; j < m / 2; j ++)
{
index1 = k + j;
index2 = index1 + m / 2;
t = n * j / m; // 旋转因子 w 的实部在 wreal [] 中的下标为 t
treal

这程序内容其实也很明白, 至于为啥这么算出来的就是fft, 实际上是fft算法问题了, 这事情粗略点说也够讲两节的, 还是找本书看看吧。。。

推荐oppenheim的离散时间信号处理