對於FFT這個IP核,我其實對它真的是又愛又恨,因為它真的耗費了我太多時間,但是隨着研究的深入,遇到的問題一點點給消化解決,終於不用帶着問題睡覺了,哈哈,有時候真的挺佩服自己的,遇到不懂的,不了解的,真的不允許自己留一點疑惑,必須深挖到底,一點含糊都不留給自己,其實,不知道大家有沒有這樣的疑惑,現在不懂的,懶得去研究的,估計過不了多久這個知識點又會兜回來找你的。我有時候也會僥幸自己能逃過不會做的任務,但是真的過不了多久,我越是不會的東西就越是會來找我,感覺今天的話有點多,趕緊回到正題上來。FFT是什么?我也曾經花了大半個月的時間去研究過它的原理,還手寫代碼不調用IP核去實現它的計算,這個實現過程還是挺復雜的,所以最簡單易上手的還是好好學會調用IP核吧,這個IP核真的忒好用呢。
FFT其實本質上就是用來做頻譜分析的,我給你一堆混雜的頻譜,你知道里面有哪些頻率嗎?你不知道,但是FFT知道,它能幫你分析混雜頻譜中有哪些頻率成分。說得官方一點就是:FFT是離散傅立葉變換的快速算法,可以將一個信號變換到頻域,有些信號在時域上是很難看出什么特征的,但是如果變換到頻域之后,就很容易看出特征了,這就是很多信號分析采用FFT變換的原因。簡單來說,FFT的作用就是對信號進行頻譜分析。
我們首先結合MATALB這個強大的數學分析軟件來生動闡釋下FFT這個概念,它可以拿來做什么?它是如何實現頻譜分析的?一個模擬信號,經過ADC采樣之后,就變成了數字信號,我們就可以拿采樣得到的數字信號,做FFT變換。N個采樣點,經過FFT之后,就可以得到N個點的FFT結果。為了方便進行FFT運算,通常N取2的整數次方。 例如某點n所表示的頻率為:Fn=(n-1)*Fs/N。由這條公式可以看出,Fn所能分辨到的頻率為Fs/N,舉例來說如果采樣頻率Fs為1024Hz,采樣點數為1024點,則可以分辨到1Hz。1024Hz的采樣率采樣1024點,剛好是1秒,也就是說,采樣1秒時間的信號並做FFT,則結果可以分析到1Hz,如果采樣2秒時間的信號並做FFT,那這個對應的時間序列點數就是2048,則結果可以分析到0.5Hz。所以如果要提高頻率分辨力,則必須增加采樣點數,也即采樣時間。頻率分辨率和采樣時間是倒數關系。由於FFT結果的對稱性,通常我們只使用前半部分的結果,即小於采樣頻率一半的結果。
2)信號幅值對比:
預測猜想:按照我們的原始頻率輸入,第1個點、第51個點、第76個點的幅度值分別是2、3、1.5;
Matlab輸出結果:

3)相位輸出驗證:
預測猜想:第1個點直流分量沒有相位輸出,不管,第51個點、第76個點的幅度值分別是-30,90;
Matlab輸出結果:

1 %知識點補充: 2 % 假設經過FFT處理之后,某點n用復數a+bi表示,那么這個復數的模就是An=sqrt(a*a+b*b),幅度值=An/(N/2)(對於直流信號是除以N),相位=atan2(b,a)。 3 %1、假設某一點頻率為Fn=(n-1)*Fs/N,那Fn所能分辨到的頻率為Fs/N,舉例來說如果采樣頻率Fs為1024Hz,采樣點數為1024點,則可以分辨到1Hz。 4 %2、以1024Hz的采樣率采樣1024點,剛好是1秒,也就是頻率分辨率是1Hz,如果是以采樣2秒的時間做FFT也就是說對應的時間序列點數就是2048,則頻率分辨率可以提高至0.5Hz。 5 %3、要提高頻率分辨力,則必須增加采樣點數,也即采樣時間。 6 %4、頻率分辨率和采樣時間是倒數關系,由於FFT結果的對稱性,通常我們只使用前半部分的結果,即小於采樣頻率一半的結果。 7 8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9 close all; 10 Adc=2; %直流分量幅度 11 A1=3; %頻率F1信號的幅度 12 A2=1.5; %頻率F2信號的幅度 13 F1=50; %信號1頻率(Hz) 14 F2=75; %信號2頻率(Hz) 15 Fs=256; %采樣頻率(Hz) 16 P1=-30; %信號1相位(度) 17 P2=90; %信號相位(度) 18 N=256; %采樣點數 19 t=[0:1/Fs:N/Fs]; %采樣時刻 20 21 %信號 22 S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180) 23 %顯示原始信號 24 plot(S); 25 title('原始信號'); 26 27 figure; 28 Y = fft(S,N) ;%做FFT變換 29 Ayy = (abs(Y));%取模 30 plot(Ayy(1:N)); %顯示原始的FFT模值結果 31 title('FFT 模值'); 32 33 figure; 34 Ayy=Ayy/(N/2); %換算成實際的幅度 35 Ayy(1)=Ayy(1)/2;%直流信號幅度值 36 37 F=([1:N]-1)*Fs/N; %換算成實際的頻率值 38 plot(F(1:N/2),Ayy(1:N/2)); %顯示換算后的FFT模值結果 39 title('幅度-頻率曲線圖'); 40 41 figure; 42 Pyy=[1:N/2]; 43 for i=1:N/2; 44 Pyy(i)=phase(Y(i)); %計算相位 45 Pyy(i)=Pyy(i)*180/pi; %換算為角度 46 end; 47 plot(F(1:N/2),Pyy(1:N/2)); %顯示相位圖 48 title('相位-頻率曲線圖'); 49 50 num=[1 3 5];den=[2 5 7 8 3]; 51 sys=tf(num,den); 52 bode(sys);grid on;
