0

我有一个有效的 FFT,但我的问题是如何将其转换为 IFFT?有人告诉我,IFFT 应该就像您使用的 FFT 一样。那么如何从 fft ic# 制作 ifft 呢?有人告诉我,应该只做一些改变才能得到结果。

我试着自己做,但我没有得到与我输入的相同的值......

所以我创建了一个值数组并将其放入 fft,然后放入 ifft,我无法获得与放入相同的值...

所以我认为我没有以正确的方式改变它。

这是我的 FFT:

    public Complex[] FFT(Complex[] x )
   {
       int N2 = x.Length;
       Complex[] X = new Complex[N2];
       if (N2 == 1)
       {
           return x;
       }
       Complex[] odd = new Complex[N2 / 2];
       Complex[] even = new Complex[N2 / 2];
       Complex[] Y_Odd = new Complex[N2 / 2];
       Complex[] Y_Even = new Complex[N2 / 2];
       for (int t = 0; t < N2 / 2; t++)
       {
           even[t] = x[t * 2];    
           odd[t] = x[(t * 2) + 1];
       }
       Y_Even = FFT(even);
       Y_Odd = FFT(odd);
       Complex temp4;

       for (int k = 0; k < (N2 / 2); k++)
       {
           temp4 = Complex1(k, N2);
           X[k] = Y_Even[k] + (Y_Odd[k] * temp4);
           X[k + (N2 / 2)] = Y_Even[k] - (Y_Odd[k] * temp4);  
           }
       return X;
   }



    public Complex Complex1(int K, int N3)
    {
        Complex W = Complex.Pow((Complex.Exp(-1 * Complex.ImaginaryOne * (2.0 * Math.PI / N3))), K);
        return W;

    }
4

1 回答 1

0

根据 FFT,您可能必须将整个复数向量(将输入或结果向量相乘,而不是两者相乘)乘以 1/N(FFT 的长度)。但是这个比例因子在 FFT 库之间是不同的(有些已经包含 1/sqrt(N) 因子)。

然后取输入向量的复共轭,对其进行FFT,再做一个复共轭,得到IFFT结果。这相当于使用 -i 而不是 i 作为基向量指数进行 FFT。

此外,通常情况下,从计算的 IFFT(FFT()) 中得到的值与输入的值不同,因为算术舍入至少会给结果添加一些低级别的数字噪声。

于 2014-07-23T19:08:59.243 回答