1. 程式人生 > >離散傅立葉變換-DFT(FFT基礎)

離散傅立葉變換-DFT(FFT基礎)

      本文是從最基礎的知識開始講解,力求用最通俗易懂的文字將問題將的通俗易懂,大神勿噴,多多指教啊,雖然說是從零學習FFT,但是基本的數學知識還是要有的,sincos,等。

       FFT(快速傅立葉變換)其本質就是DFT,只不過可以快速的計算出DFT結果,要弄懂FFT,必須先弄懂DFTDFT(DiscreteFourier Transform) 離散傅立葉變換的縮寫,咱們先來詳細討論DFT,因為DFT懂了之後,FFT就容易的多了

DFT(FFT)的作用:可以將訊號從時域變換到頻域,而且時域和頻域都是離散的,通俗的說,可以求出一個訊號由哪些正弦波疊加而成,求出的結果就是這些正弦波的幅度和相位,我們音樂播放器上面顯示的就是音樂

fft之後不同頻率正弦波的幅度,就像下面這張圖片:

裡面的柱狀高度就是正弦波的幅度

     那麼為什麼可以求出正弦波的幅度呢,這裡就要說一下訊號的相關性了,我們也可以利用訊號的相關性檢測訊號波中是否含有某個頻率的訊號波:把一個待檢測訊號波乘以另一個訊號波,個新的訊號波,再把這個新的訊號波所有的點進行相加,從相加的結果就可以判斷出這兩個訊號的相似程度,比如下圖:

 

        上圖中a,b圖是待檢測訊號,cd3個週期的正弦訊號,很顯然a圖含有正弦波,e=a*c,將e圖的各點相加,很顯然值是正的,這就說明a圖含頻率為3的正弦波,f=b*d,顯然將f圖中各點相加結果約等於0了,說明b圖不含有周期為

3的正弦波,這就是dft的原理,也就是離散傅立葉變換的原理,其實就是這麼簡單,只不過dft將待檢測訊號和很多不同頻率的正弦波和餘弦波相乘,也就是進行了訊號相關性檢測,從而可以計算出訊號中含有的正弦波的幅度,若含有此頻率的正弦波,那麼幅值不為0,若不含有此正弦波,那麼幅值為0,那麼幅值是如何計算出來的呢,幅值就是上面e圖和f圖各點之和(若是連續訊號的話就是兩訊號乘積求積分了,。。額,不說積分,抽象了)

下面來看個具體的例子:

上面圖一即為待檢測訊號,也就是將進行DFT變換的訊號,將它分成16個離散的點,圖2是一個頻率為1的正弦波,也分成16個點,將對應的點相乘,得到圖3,再將圖3的各個點的幅值相加,結果為

10.06,也就是說圖1中的影象含有圖2的正弦波,此時用到的dft點數就為16,10/(N/2)=10/8=1.25,含有的頻率為1的正弦波的幅度就是1.25,以此類推,若要求是否含有頻率為2的正弦波,將圖1和頻率為2的正弦波相乘再求和,。。。。

至於為什麼要除以N/2,數字訊號處理裡面有講,我就不多說了

接下來就是dft的實現了:

    DFT的公式:

  

   其中X(k)表示DFT變換後的資料,x(n)為取樣的模擬訊號,公式中的x(n)可以為覆信號,實際當中x(n)都是實訊號,即虛部為0,此時公式可以展開為:

     從這個公式可以看出,變換後的資料就是原訊號對cos和sin的相關操作,即進行相乘求和(連續訊號即為積分),為什麼我要將n\N寫在2k*pi後面呢?因為我覺得在對cos和sin進行相關操作時,k代表和頻率為多少的正弦相關,而n和N則是在一個正弦週期內取樣N個點,取樣間隔為2*pi\N,,n用來步進,一次步進2*pi\N,最後進行累加求和,就得出了X(k),《實用數字訊號處理》這本書的DFT章節詳細的解釋了此公式,並且還進行了舉例,看了以後明白了不少,另外,DFT之後的資料是對稱的,具體原因還是在那本書上面有,在FFT的章節。比如做8DFT,取樣訊號為x(n),DFT之後的資料為X(k),那麼X(0)為直流訊號,X(1), X(2), X(3), X(5), X(6), X(7),關於X(4)對稱,X(1)=X(7), X(2)=X(6),X(3)=X(5),如下圖,是對1+sin(2*PI)進行DFT變換,具體的幅值先不關心,只要知道它是對稱的就行了。

接下來就是對公式寫程式了,先將公式展開:

在計算機中可以這樣展開:

裡面有個j,不用管它,我們用兩個陣列,一個儲存sin相關,一個儲存cos相關,由於cos為實部,sin為虛部,可以定義以下兩個陣列:

float real[N];//用來儲存cos相關。

float imag[N];//用來儲存sin相關。

可以得到如下程式:

  1. for(k=0;k<N;k++)
  2. {
  3. for(n=0;n<N;n++)
  4. {
  5. real[k] = real[k] + x[n] * cos(2*PI*k*n/N) ;
  6. imag[k] = imag[k] – x[n] * sin(2*PI*k*n/N);
  7. }
  8. }

Real就是cos相關的幅值,imag就是sin相關的幅值

最後將sincos合成一個sin

就完了。。。