1. 程式人生 > >快速傅立葉變換FFT的學習筆記二:深入實踐

快速傅立葉變換FFT的學習筆記二:深入實踐

快速傅立葉變換FFT的學習筆記二:深入實踐

快速傅立葉變換(Fast Fourier Transform)是離散傅立葉變換的一種快速演算法,簡稱FFT,通過FFT可以將一個訊號從時域變換到頻域。

資料結構

  1. 通過AD採集到一串時域上的資料點,一個int型的陣列
unsigned int input[SAMPLE_LEN];
  1. fft變換點,是一個float型的實部,一個float型的虛部。組成一串頻域的資料點。
typedef struct //複數型別
{
  float real;		//實部
  float imag;		//虛部
}complex;

complex fft_buff[FFT_LEN];

時域轉頻域

  1. 時域的資料點存入fft的實部,fft的虛部為0。
for(index = 0; index < FFT_LEN; index++)
    {
    	fft_buff[index].real = input[index];
    	fft_buff[index].imag = 0;
    }
  1. 然後進行FFT變換
	fft(FFT_LEN, fft_buff);

計算結果

求頻率:Fn=(n-1)*Fs/N

FFT轉換後是一串複數結果,代表頻域上的引數。
Fs是取樣頻率,N是取樣點數,Fn表示第n點的頻率。
其中Fs和N都是固定的,假設:Fs=2048 kHz,N=2048。
則F1是直流分量(頻率為0),F2是1kHz,F3是2kHz…

求幅值:複數模*2/N

  • 首先,直流分量的幅值 = 複數模/N
  • 其次,該頻率需要在我們FFT轉換結果頻率內。比如上述的引數下,我們能計算1kHz,2kHz,3kHz…2047kHz頻率點的幅值 = 複數模*2/N
  • 對應頻率點的複數模 = √(實部^2 +虛部^2)

求相位: atan( 實部/虛部 )

瞭解兩個公式即可。

  • b = atan(a)
  • a = tan(b*180/π)

在這裡插入圖片描述