天天看點

FFT實體意義【轉載】

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為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。可見,從頻譜分析出來

的幅度是正确的。

然後再來計算相位資訊。直流信号沒有相位可言,不用管

它。先計算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/2就是對應該頻率下的信号的幅度(對于直流信号是除以

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 模值');

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('幅度-頻率曲線圖');

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('相位-頻率曲線圖');

“Enter through the narrow gate. For wide is the gate and broad is the road that leads to destruction, and many enter through it. But small is the gate and narrow the road that leads to life, and only a few find it.”

.

OPTIMISM, PASSION & HARDWORK