快速傅立葉變換FFT的學習筆記二:深入實踐
阿新 • • 發佈:2018-11-22
快速傅立葉變換FFT的學習筆記二:深入實踐
快速傅立葉變換(Fast Fourier Transform)是離散傅立葉變換的一種快速演算法,簡稱FFT,通過FFT可以將一個訊號從時域變換到頻域。
資料結構
- 通過AD採集到一串時域上的資料點,一個int型的陣列
unsigned int input[SAMPLE_LEN];
- fft變換點,是一個float型的實部,一個float型的虛部。組成一串頻域的資料點。
typedef struct //複數型別 { float real; //實部 float imag; //虛部 }complex; complex fft_buff[FFT_LEN];
時域轉頻域
- 時域的資料點存入fft的實部,fft的虛部為0。
for(index = 0; index < FFT_LEN; index++)
{
fft_buff[index].real = input[index];
fft_buff[index].imag = 0;
}
- 然後進行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/π)