2009-11-03 123 views
0

我已經做了一個實時獲取基本頻率和實現高通濾波器和低通濾波器。如何從fft計算ifft?

現在我希望能夠在應用過濾器後記錄到.wav文件。

首先我必須反轉fft,那是我的問題。 要做到這一點的步驟是什麼?

我使用在project中定義的FFT。

這裏是它的代碼:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace SoundLog 
{ 
    public class FourierTransform 
    { 
     static private int n, nu; 

     static private int BitReverse(int j) 
     { 
      int j2; 
      int j1 = j; 
      int k = 0; 
      for (int i = 1; i <= nu; i++) 
      { 
       j2 = j1/2; 
       k = 2 * k + j1 - 2 * j2; 
       j1 = j2; 
      } 
      return k; 
     } 

     static public double[] FFT(ref double[] x) 
     { 
      // Assume n is a power of 2 
      n = x.Length; 
      nu = (int)(Math.Log(n)/Math.Log(2)); 
      int n2 = n/2; 
      int nu1 = nu - 1; 
      double[] xre = new double[n]; 
      double[] xim = new double[n]; 
      double[] magnitude = new double[n2]; 
      double[] decibel = new double[n2]; 
      double tr, ti, p, arg, c, s; 
      for (int i = 0; i < n; i++) 
      { 
       xre[i] = x[i]; 
       xim[i] = 0.0f; 
      } 
      int k = 0; 
      for (int l = 1; l <= nu; l++) 
      { 
       while (k < n) 
       { 
        for (int i = 1; i <= n2; i++) 
        { 
         p = BitReverse(k >> nu1); 
         arg = 2 * (double)Math.PI * p/n; 
         c = (double)Math.Cos(arg); 
         s = (double)Math.Sin(arg); 
         tr = xre[k + n2] * c + xim[k + n2] * s; 
         ti = xim[k + n2] * c - xre[k + n2] * s; 
         xre[k + n2] = xre[k] - tr; 
         xim[k + n2] = xim[k] - ti; 
         xre[k] += tr; 
         xim[k] += ti; 
         k++; 
        } 
        k += n2; 
       } 
       k = 0; 
       nu1--; 
       n2 = n2/2; 
      } 
      k = 0; 
      int r; 
      while (k < n) 
      { 
       r = BitReverse(k); 
       if (r > k) 
       { 
        tr = xre[k]; 
        ti = xim[k]; 
        xre[k] = xre[r]; 
        xim[k] = xim[r]; 
        xre[r] = tr; 
        xim[r] = ti; 
       } 
       k++; 
      } 
      for (int i = 0; i < n/2; i++) 
       //magnitude[i] = (float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i]))); 
       decibel[i] = 10.0 * Math.Log10((float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i])))); 
      //return magnitude; 
      return decibel; 
     } 
    } 
} 

回答

2

圍繞如FFTW這麼多真的很好的fft實現,我強烈推薦使用它。他們也會隨身攜帶。你的,如實施,將極其緩慢。

+0

速度目前不是問題。 我需要在c#中完成,而FFTW只有C++。 你能告訴我如何轉換我發佈的plz? –

+0

正向和反向fts之間有兩個區別。逆需要按1/n進行縮放,指數爲負。因此,對於逆ft(假設我理解您的實現),更改arg的符號並將結果中的每個點乘以1/n。 –

+0

另外,通過將所有虛數設置爲零,您正在使用複數fft來表示真實數據。這在數學上是合理的但是浪費。查看數值食譜網頁(nr.com)獲取有關實際價值fft的信息。 –

-4

根據您的具體FFT和IFFT定義,所不同的僅僅是一個常數。在你的情況下確定這個常數的最簡單方法可能只是試用&錯誤。

+0

我使用這個項目中定義的FFT: http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx 你能幫我嗎? –

+0

試錯嗎? 看看我上面的評論。 –

+0

-1「試錯」! – AAT