FFT的详细解释,相信你看了就明白了
前半部分內容轉自:http://www.ilovematlab.cn/thread-119939-1-1.html
FFT是離散傅立葉變換的快速算法,可以將一個信號變換到頻域。有些信號在時域上是很難看出什么特征的,但是如果變換到頻域之后,就很容易看出特征了。這就是很多信號分析采用FFT變換的原因。另外,FFT可以將一個信號的頻譜提取出來,這在頻譜分析方面也是經常用的。?
? ? 雖然很多人都知道FFT是什么,可以用來做什么,怎么去做,但是卻不知道FFT之后的結果是什意思、如何決定要使用多少點來做FFT。
? ? 現在圈圈就根據實際經驗來說說FFT結果的具體物理意義。一個模擬信號,經過ADC采樣之后,就變成了數字信號。采樣定理告訴我們,采樣頻率要大于信號頻率的兩倍,這些我就不在此羅嗦了。
? ? 采樣得到的數字信號,就可以做FFT變換了。N個采樣點,經過FFT之后,就可以得到N個點的FFT結果。為了方便進行FFT運算,通常N取2的整數次方。
? ? 假設采樣頻率為Fs,信號頻率F,采樣點數為N。那么FFT之后結果就是一個為N點的復數。每一個點就對應著一個頻率點。這個點的模值,就是該頻率值下的幅度特性。
具體跟原始信號的幅度有什么關系呢?
假設原始信號的峰值為A,那么FFT的結果的每個點(除了第一個點直流分量之外)的模值就是A的N/2倍。
而第一個點就是直流分量,它的模值就是直流分量的N倍。而每個點的相位呢,就是在該頻率下的信號的相位。
第一個點表示直流分量(即0Hz),而最后一個點N的再下一個點(實際上這個點是不存在的,這里是假設的第N+1個點,也可以看做是將第一個點分做兩半分,另一半移到最后)則表示采樣頻率Fs,這中間被N-1個點平均分成N等份,每個點的頻率依次增加。
例如某點n所表示的頻率為:Fn=(n-1)*Fs/N。
由上面的公式可以看出,Fn所能分辨到頻率為為Fs/N,Fs/N也叫頻率分辨率。
如果采樣頻率Fs為1024Hz,采樣點數為1024點,則可以分辨到1Hz。1024Hz的采樣率采樣1024點,剛好是1秒,也就是說,采樣1秒時間的信號并做FFT,則結果可以分析到1Hz,如果采樣2秒時間的信號并做FFT,則結果可以分析到0.5Hz。如果要提高頻率
分辨力,則必須增加采樣點數,也即采樣時間。頻率分辨率和采樣時間是倒數關系。
??假設FFT之后某點n用復數a+bi表示,那么這個復數的模就是An=根號a*a+b*b,相位就是Pn=atan2(b,a)。根據以上的結果,就可以計算出n點(n≠1,且n<=N/2)對應的信號的表達式為:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。對于n=1點的信號,是直流分量,幅度即為A1/N。
? ? 由于FFT結果的對稱性,通常我們只使用前半部分的結果,即小于采樣頻率一半的結果。
? ? 好了,說了半天,看著公式也暈,下面圈圈以一個實際的信號來做說明。
? ? 假設我們有一個信號,它含有2V的直流分量,頻率為50Hz、相位為-30度、幅度為3V的交流信號,以及一個頻率為75Hz、相位為90度、幅度為1.5V的交流信號。用數學表達式就是如下:
S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)
? ? 式中cos參數為弧度,所以-30度和90度要分別換算成弧度。我們以256Hz的采樣率對這個信號進行采樣,總共采樣256點。
按照我們上面的分析,Fn=(n-1)*Fs/N,我們可以知道,每兩個點之間的間距就是1Hz,第n個點的頻率就是n-1。我們的信號有3個頻率:0Hz、50Hz、75Hz,應該分別在第1個點、第51個點、第76個點上出現峰值,其它各點應該接近0。
實際情況如何呢?我們來看看FFT的結果的模值如圖所示。
? ?? ?? ?? ?? ?? ?? ? 圖1 FFT結果
? ? 從圖中我們可以看到,在第1點、第51點、和第76點附近有比較大的值。我們分別將這三個點附近的數據拿上來細看:
1點: 512+0i
2點: -2.6195E-14 - 1.4162E-13i?
3點: -2.8586E-14 - 1.1898E-13i
50點:-6.2076E-13 - 2.1713E-12i
51點:332.55 - 192i
52點:-1.6707E-12 - 1.5241E-12i
75點:-2.2199E-13 -1.0076E-12i
76點:3.4315E-12 + 192i
77點:-3.0263E-14 +7.5609E-13i
? ?
?很明顯,1點、51點、76點的值都比較大,它附近的點值都很小,可以認為是0,即在那些頻率點上的信號幅度為0。接著,我們來計算各點的幅度值。分別計算這三個點的模值,結果如下:
1點: 512
51點:384
76點:192
?
按照公式,可以計算出
直流分量為:512/N=512/256=2;
50Hz信號的幅度為:384/(N/2)=384/(256/2)=3;
75Hz信號的幅度為192/(N/2)=192/(256/2)=1.5。
可見,從頻譜分析出來的幅度是正確的。(需要注意的是,由于該信號的頻率分辨率為Fs/N=1Hz,也即fft能分辨的最大的信號細節為1Hz,若模擬的cos三角信號中有小數頻段的信號時,則無法正確計算出的該頻段的幅度,同時,若該信號使用fft的階數不為信號的采樣頻率的整數倍,也會出現此類情況。這也是fft的柵欄效應導致的)
然后再來計算相位信息。直流信號沒有相位可言,不用管它。
先計算50Hz信號的相位,atan2(-192, 332.55)=-0.5236,結果是弧度,換算為角度就是180*(-0.5236)/pi=-30.0001。
再計算75Hz信號的相位,atan2(192, 3.4315E-12)=1.5708弧度,換算成角度就是180*1.5708/pi=90.0002。可見,相位也是對的。
根據FFT結果以及上面的分析計算,我們就可以寫出信號的表達式了,它就是我們開始提供的信號。
總結:
假設采樣頻率為Fs,采樣點數為N,做FFT之后,某一點n(n從1開始)表示的頻率為:Fn=(n-1)*Fs/N;
n點的模值除以N/2就是對應該頻率下的信號的幅度(對于直流信號是除以N);
n點的相位即是對應該頻率下的信號的相位。相位的計算可用函數atan2(b,a)計算。atan2(b,a)是求坐標為(a,b)點的角度值,范圍從-pi到pi。要精確到xHz,則需要采樣長度為1/x秒的信號,并做FFT。
要提高頻率分辨率,就需要增加采樣點數,這在一些實際的應用中是不現實的,需要在較短的時間內完成分析。
解決這個問題的方法有頻率細分法,比較簡單的方法是采樣比較短時間的信號,然后在后面補充一定數量的0,使其長度達到需要的點數,再做FFT,這在一定程度上能夠提高頻率分辨力。具體的頻率細分法可參考相關文獻。
[附錄:本測試數據使用的matlab程序]
close all; %先關閉所有圖片
Adc=2;??%直流分量幅度
A1=3;? ?%頻率F1信號的幅度
A2=1.5; %頻率F2信號的幅度
F1=50;??%信號1頻率(Hz)
F2=75;??%信號2頻率(Hz)
Fs=256; %采樣頻率(Hz)
P1=-30; %信號1相位(度)
P2=90;??%信號相位(度)
N=256;??%采樣點數
t=[0:1/Fs:N/Fs]; %采樣時刻
%信號
S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);
%顯示原始信號
plot(S);
title('原始信號');
figure;
Y = fft(S,N); %做FFT變換
Ayy = (abs(Y)); %取模
plot(Ayy(1:N)); %顯示原始的FFT模值結果
title('FFT 模值');
figure;
Ayy=Ayy/(N/2);? ?%換算成實際的幅度
Ayy(1)=Ayy(1)/2;
F=([1:N]-1)*Fs/N; %換算成實際的頻率值
plot(F(1:N/2),Ayy(1:N/2));? ?%顯示換算后的FFT模值結果
title('幅度-頻率曲線圖');
figure;
Pyy=[1:N/2];
for i="1:N/2"
Pyy(i)=phase(Y(i)); %計算相位
Pyy(i)=Pyy(i)*180/pi; %換算為角度
end;
plot(F(1:N/2),Pyy(1:N/2));? ?%顯示相位圖
title('相位-頻率曲線圖');
泄露與窗函數
每次FFT變換只能對有限長度的時域數據進行變換,因此,需要對時域信號進行信號截斷。信號截斷有兩種,一種是周期截斷,一種是非周期截斷,哪怕原始信號是周期信號。若周期截斷,則FFT頻譜為單一譜線,得到的頻率成分為原始信號的真實頻率,并且幅值與原始信號的幅值相等。
????若為非周期截斷,截斷后的信號起始時刻和結束時刻的幅值不等,將這個信號再進行重構,在連接處信號的幅值不連續,出現跳躍;對截斷后的信號做FFT,頻譜出現拖尾,峰值處的頻率與原始信號的頻率相近,但并不相等。另一方面,峰值處的幅值已不再等于原始信號的幅值,為原始信號幅值的64%(矩形窗的影響)。而幅值的其他部分(36%幅值)則分布在整個頻帶的其他譜線上。拖尾現象這種非常嚴重的誤差,稱為泄漏,是數字信號處理所遭遇的最嚴重誤差。現實世界中,在做FFT分析時,很難保證截斷的信號為周期信號,因此,泄漏不可避免。為了將這個泄漏誤差減少到最小程度(注意是減少,而不是消除),我們需要使用加權函數,也叫窗函數。加窗主要是為了使時域信號似乎更好地滿足FFT處理的周期性要求,減少泄漏。非周期截斷的信號與窗函數相乘得到的信號起始點與最末點達到相同(比如都為0),變成一個類似周期截斷的信號。窗函數只能減少泄漏,不能消除泄漏。
功率譜估計
功率譜密度(PSD),單位為:unit^2/Hz代表單位頻率上信號的能量,所以是密度譜,幅值代表頻段內的有效值平方。
分段加窗函數的含義。分段之后,需要補0至和原先信號一樣長,這就相當于每小段加矩形窗,矩形窗不僅有1值還有0值。在連續的世界里非常理所當然的事情,在離散的世界里就發生了變化。如果不補0到原來長度,頻率分辨率就大大降低了。
將一個信號從時域通過FFT變換到頻域,得到的直接結果就是所謂的頻譜,頻譜是復數形式,有幅值和相位。由于頻譜是復數形式,包含相位信息,當信號中包含不相關的噪聲成分時,由于噪聲成分的相位是雜亂無序的,那么多次線性平均之后,可以將不相關的噪聲平均掉。
功率譜密度PSD表征的是單位頻率上的能量分布。它等于自功率譜除以頻率分辨率,因此,它的單位為(信號單位^2/Hz)。由于自譜是實數,因此,功率譜也是實數,可進行線性平均。它只有RMS格式。
自譜或稱為自功率譜,本質是由頻譜計算得到的,它是復數頻譜乘以它的共軛。因此,自譜是實數,沒有相位信息。由于它是實數,因此可以進行線性平均。
由于它是復數頻譜與它的共軛的乘積,因此自譜有平方形式,平方形式的自譜稱為自功率譜Power。對平方形式的自譜再求平方根,對應為線性形式,稱為線性自功率譜AutoPower Linear。當用線性自譜來表示一個隨機信號的結果時,由于信號的總能量是一定的,當采用不同的頻率分辨率會導致幅值大小不一樣。因為,頻率分辨率高,則譜線越密集,因而分配到每條譜線上的能量就少,對應的幅值就低。當用PSD(PSD=自功率譜除以頻率分辨率)來表示隨機信號的結果時,由于PSD是實數,所以沒有相位信號,只有幅值信息。
PSD計算時的步驟為
1 對每一分段數據進行FFT變換,并求它的幅值譜
2 對幅值譜進行平方
3?將雙邊譜轉化為單邊譜??
4 除以頻率分辨率delt(f)=1/T=fs/nfft
舉個例子:
幅值為1,頻率為16Hz的正弦信號,使用1024Hz采樣,2048點進行功率譜密度計算,頻率分辨率為1024/2048=0.5Hz,求出的功率譜單邊譜在第32根譜線處的值為1(P1(33)=1),解釋為:信號FFT變換后得到的雙邊譜,幅值分別為0.5,平方后為0.25,轉化為單邊乘2為0.5,再除以頻率分辨率為1。將1乘以0.5(頻率分辨率),正好為該信號有效值0.707的平方。
? ?
fs=1024;
second=2;
N = second*fs;
order=2048;
dt = 1/fs;
t = 0:dt:second-dt;%時間
fw=16;
Cz = sin(2*pi*fw*t);
figure(1)
subplot(211);
plot(t, Cz)
y=Cz;
yfft = fft(y(1:N),order);
P2 = abs(yfft/N);
P1 = P2(1:N/2+1);%單邊譜
P1(2:end-1) = 2*P1(2:end-1);%由于P1(1)是直流
因為實數信號的雙邊幅值譜都是對稱的,雙邊譜中包含負頻率,在物理系統中是沒有的,因此用單邊譜就夠了,這時候把負頻率成分附加到相應的正頻率成分,也就是在雙邊譜的基礎上乘以2。
1、matlab中fft函數之后,信號幅度值變大,要得到真實幅度值大小,要將變換后結果除以N再乘以2(直流即零頻率處除以N),除以N得到雙邊頻譜,乘以2得到單邊頻譜。如果原始信號就是復數信號,則fft得到的就是單邊頻譜不用乘以2。
2、對fs采樣頻率信號,使用fft函數之后,最高頻率為采樣頻率一半,fft之后的值關于半采樣率共軛對稱。
3、對時域信號做傅里葉變換后對其值求模,得到的譜叫做頻譜的幅度譜,它的縱坐標沒有物理量綱,這個幅度譜與相位譜在一起稱為頻譜。
? ? ?再對傅里葉變換后的值做進一步處理,具體叫什么譜視縱坐標而定,如果縱坐標是能量,就叫能量頻譜即頻域能量譜,這里區分時域的能量,時域能量是時間對應的能量,能量頻譜則是頻率對應的能量;如果是功率,就叫功率頻譜即頻域功率譜。而能量頻譜與功率頻譜之間是一個線性關系,他們差了一個信號時長的倍數。
? ? ?再說功率譜密度,它和功率譜本質上是一個東西,功率譜指的是整個一個譜,是一個頻率序列,功率譜密度這是指某個具體頻率值對應的功率值。人們習慣上將二者不加區分,經常混用,都是指代頻率點處的功率值。
相關鏈接:
PSD的單位及計算方法[轉]_weixin_34273046的博客-CSDN博客
PSD的單位及計算方法[轉] - 馬語者 - 博客園
FFT 頻譜分辨率_不積跬步,無以至千里-CSDN博客_頻譜分辨率
10-11:功率譜估計及頻率分辨率 - 簡書
說說腦電信號的頻譜、能量、功率譜、功率譜密-燕山徐一 | 個人博客
總結
以上是生活随笔為你收集整理的FFT的详细解释,相信你看了就明白了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TortoiseSVN的所有使用
- 下一篇: python另存为快捷键_Python学