2016-01-29 120 views
0

我得到一个奇怪的故障在FFT图白噪声:FFT实现产生毛刺

enter image description here

我参照的程序检查,同时噪音文件似乎是罚款。 这是实施中的错误吗?

void four1(float data[], int nn, int isign) { 
    int n, mmax, m, j, istep, i; 
    float wtemp, wr, wpr, wpi, wi, theta; 
    float tempr, tempi; 

    n = nn << 1; 
    j = 1; 
    for (int i = 1; i < n; i += 2) { 
     if (j > i) { 
      tempr = data[j]; 
      data[j] = data[i]; 
      data[i] = tempr; 
      tempr = data[j + 1]; 
      data[j + 1] = data[i + 1]; 
      data[i + 1] = tempr; 
     } 
     m = n >> 1; 
     while (m >= 2 && j > m) { 
      j -= m; 
      m >>= 1; 
     } 
     j += m; 
    } 
    mmax = 2; 
    while (n > mmax) { 
     istep = 2 * mmax; 
     theta = TWOPI/(isign * mmax); 
     wtemp = sin(0.5 * theta); 
     wpr = -2.0 * wtemp * wtemp; 
     wpi = sin(theta); 
     wr = 1.0; 
     wi = 0.0; 
     for (m = 1; m < mmax; m += 2) { 
      for (i = m; i <= n; i += istep) { 
       j = i + mmax; 
       tempr = wr * data[j] - wi * data[j + 1]; 
       tempi = wr * data[j + 1] + wi * data[j]; 
       data[j] = data[i] - tempr; 
       data[j + 1] = data[i + 1] - tempi; 
       data[i] += tempr; 
       data[i + 1] += tempi; 
      } 
      wr = (wtemp = wr) * wpr - wi * wpi + wr; 
      wi = wi * wpr + wtemp * wpi + wi; 
     } 
     mmax = istep; 
    } 
} 
+0

输入数据的大小是多少? – molbdnilo

+0

@molbdnilo数据的大小是nn的两倍,每个输入数字是一对actual_real_number和0对于虚部 – defhlt

+0

@ tobi303这个问题最适合调试会话以找出它发生的原因......因为它是,我不希望任何人实际实施快速傅立叶变换,并给你确切的线路,需要修正。 – Shark

回答

2

除了一些小的改动,似乎该码被取出来的数值法C.该功能(从书中获取)的文档的第二版的规定:

如果isign被输入为1,则通过其离散傅立叶变换来替换data[1..2*nn];或者如果isign被输入为-1,则将其替换为data[1..2*nn]乘以其逆离散傅里叶变换的nn倍。 data是一个长度为nn的复杂数组,或等效长度为2*nn的真实数组。 nn必须是2的整数次幂(不检查!)。

此实现产生正确的结果,给定一个基于1的索引的输入数组。您可以选择使用相同的索引约定,方法是分配一个大小为2*nn+1的C数组,并从索引1开始填充数组。您也可以传递一个大小为2*nn的数组,该数组已从索引0开始填充,但调用four1(data-1, nn, isign)(请注意在data阵列上的-1偏移)。