本文參考了文章,一步步對乙個標準訊號進行分析,然後得到訊號的幅度、頻譜、相位資訊。一、基本概念
fftfft(fast fourier transformation)為一階快速傅利葉變換,在數字訊號處理中有著廣泛的應用。有些訊號在時域很難看到變化特徵,在頻域就很容易看得到,比如音符、線性調頻訊號。
fft把時域訊號變換到頻譜上,直觀的看出各頻率訊號的強弱。
取樣得到的數碼訊號,就可以做fft變換了。n個取樣點,經過fft之後,就可以得到n個點的fft結果。為了方便進行fft運算,通常n取2的整數次方。做fft分析時,幅值大小與fft選擇的點數有關,但是不影響分析結果。由於fft結果的對稱性,通常我們只使用前半部分的結果,即小於取樣頻率一半的結果。
奈奎斯特取樣定理
乙個模擬訊號,經過adc取樣之後,就變成了數碼訊號。取樣定理告訴我們,取樣頻率要大於訊號頻率的兩倍。
幅值和相位
假設取樣頻率為fs,訊號頻率f,取樣點數為n。那麼fft之後結果就是乙個為n點的複數。每乙個點就對應著乙個頻率點。這個點的模值,就是該頻率值下的幅度特性。
假設原始訊號的峰值為a,那麼fft的結果的每個點(除了第乙個點直流分量之外)的模值就是a的n/2倍。而第乙個點就是直流分量,它的模值就是直流分量的n倍。而每個點的相位呢,就是在該頻率下的訊號的相位。
某點n所表示的頻率為:fn=(n-1)*fs/n。
頻譜解析度
頻率解析度為:取樣頻率/取樣點數=fs/n。如果要提高頻率解析度,則必須增加取樣點數,也即取樣時間。頻率解析度和取樣時間是倒數關係。
二、matlab實現
假設有乙個訊號由如下三個分量組成:
1)乙個2v的直流分量;
2)乙個頻率為50hz、相位為-30度、幅度為3v的交流訊號;
3)乙個頻率為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度要分別換算成弧度。
clc;
clear all;
close all;
% 假設有乙個訊號由如下三個分量組成:
%1)乙個2v的直流分量;
%2)乙個頻率為50hz、相位為-
30度、幅度為3v的交流訊號;
%3)乙個頻率為75hz、相位為90度、幅度為1.5v的交流訊號。
fs =
256;
% sampling frequency
t =1
/fs;
% sampling period
n =256
;% length of signal
t =(
0:n-1)
*t;% time vector
%cos引數為弧度,所以-
30度和90度要分別換算成弧度。 s=2
+3*cos(2
*pi*
50*t-pi*30/
180)
+1.5
*cos(2
*pi*
75*t+pi*90/
180)
;figure()
plot
(s);
title
('原始訊號');
x =fft
(s,n)
%fft變換 重點關注 第1點、第51點、和第76點附近有較大值
ax =
abs(x)
figure()
plot
(ax)
;title
('fft模值');
z =(
fftshift
(x))
figure()
subplot(2
,1,1
);%二行一列第一幅圖
plot((
-n/2
:n/2-1
)*fs/n,
abs(z)*2
/n);
%實際頻率 實際幅值 計算*
2/n (直流分量其實不需要*2)
title
('幅頻特性曲線'
,'fontsize',13
);xlabel
('f/hz'
,'fontsize',13
);%橫座標顯示f/hz
ylabel
('幅值'
,'fontsize',13
);%縱座標顯示幅值
subplot(2
,1,2
);%二行一列第二幅圖
px =
angle
(fftshift
(x))
*180
/pi;
plot((
-n/2
:n/2-1
)*fs/n,px)
;title
('相位特性曲線'
,'fontsize',13
);%顯示標題
xlabel
('f/hz'
,'fontsize',13
);%橫座標顯示f/hz
ylabel
('相位/°'
,'fontsize',13
);%縱座標顯示相位/°
三、物理意義分析
假設以256hz的取樣率對這個訊號進行取樣,總共取樣256點。由前面的分析,fn=(n-1)*fs/n,可知:每兩個點之間的間距為1hz,第n個點的頻率就是n-1。訊號s有3個頻率:0hz、50hz、75hz,應該分別在第1個點、第51個點、第76個點上出現峰值,其它各點應該接近0。實際情況如何呢?我們來看看fft的結果的模值如圖所示。
列印出這三個點附近的fft復數值:
x = fft(s,n) %fft變換 重點關注 第1點、第51點、和第76點附近有較大值
x模值
第1個點
51200 + 0.0000i
512.0000
第2個點
-0.0000 - 0.0000i
0.0000
第3個點
-0.0000 - 0.0000i
0.0000
第50個點
-0.0000 - 0.0000i
0.0000
第51個點
332.55 - 192.00i
384.0000
第52個點
-0.0000 - 0.0000i
0.0000
第75個點
-0.0000 - 0.0000i
0.0000
第76個點
0.0000 + 192.00i
192.0000
第77個點
-0.0000 + 0.0000i
0.0000
幅度分析
很明顯,1點、51點、76點的值都比較大,它附近的點值都很小,可以認為是0,即在那些頻率點上的訊號幅度為0。
接著,我們來計算各點的幅度值。
由定理可知,給定模值an,
對於n!=1點的非直流訊號它對應的幅度為:an/(n/2)
對於n=1點的訊號,是直流分量,幅度即為an/n
因此,直流分量為:512/n=512/256=2;50hz訊號的幅度為:384/(n/2)=384/(256/2)=3;75hz訊號的幅度為192/(n/2)=192/(256/2)=1.5。可見,從頻譜分析出來的幅度是正確的。
相位分析
相位的計算可用函式atan2(b,a)計算。atan2(b,a)是求座標為(a,b)點的角度值,範圍從-pi到pi。
然後再來計算相位資訊。直流訊號沒有相位可言,不用管它。先計算50hz訊號的相位,atan2(-192, 332.55)=-0.5236,結果是弧度,換算為角度就是180*(-0.5236)/pi=-30.0001。再計算75hz訊號的相位,atan2(192,3.4386e-12)=1.5708弧度,換算成角度就是180*1.5708/pi=90.0002。可見,相位也是對的。
總結:假設取樣頻率為fs,取樣點數為n,做fft之後,某一點n(n從1開始)表示的頻率為:fn=(n-1)*fs/n
;該點的模值除以n/2就是對應該頻率下的訊號的幅度(對於直流訊號是除以n);該點的相位即是對應該頻率下的訊號的相位。
Matlab做快速傅利葉變換
快速傅利葉變換 fast fourier transform 是訊號處理與資料分析領域裡最重要的演算法之一。傅利葉變換在物理學 數論 組合數學 訊號處理 概率 統計 密碼學 聲學 光學等領域都有著廣泛的應用。那麼如何用matlab實現快速傅利葉變換呢?直接上 tp 0 2048 時域資料點數n yt...
快速傅利葉變換 及MATLAB函式
快速傅利葉變換實用程式 include include include define pi 3.1415926 typedef struct complexnumber cnumber void quickfft cnumber p,int n,int k,cnumber f,int l,int i...
MATLAB中快速傅利葉變換fft的應用
傅利葉變換是一種線性的積分變換,它提供了一種可以將訊號從時間幅值座標變換到頻率幅值座標的方法,其具體的定義如下 上式即為傅利葉變換的表示式。傅利葉變換將訊號分解為若干個簡諧訊號疊加的形式,通過傅利葉變換畫出頻譜圖之後就可以找到訊號中包含的頻率成分。matlab中自帶的fft 函式可以幫助我們完成傅利...