MATLAB訊號分析與處理---FFT(一)
1、回顧傅立葉變換的基本理論
傅立葉變換主要是在幹嘛
透過傅立葉變換,可以將時域訊號分解一系列不同頻率下的正弦/餘弦訊號,如下圖所示:
圖上所示:時域內接近於方波的訊號,透過傅立葉變換後得到的是一系列頻率不同,幅值也不大一致的正弦/餘弦訊號;可以理解為,任意一個時域訊號都可以分解為不同頻率下的正弦訊號,透過傅立葉變換,可以得到他們的頻率成分。
時域圖:橫軸是時間,縱軸是訊號值
頻譜圖:橫軸是頻率,縱軸是該頻率成分訊號的幅值。
將訊號分解為正弦訊號、餘弦訊號有以下好處:
1、正弦訊號往往比原始訊號簡單,更容易研究,且已經充分研究
2、對於線性系統,輸入正弦訊號,輸入仍是正弦訊號,只是幅值和相位會發生變化,但是頻率不會發生變化,這一點很具有工程價值。
3、在頻域上,可以分析到很多在時域圖無法分析到的結果。
傅立葉變換的週期性
連續傅立葉變換(FS):時域非週期連續訊號——頻域非週期連續頻譜
連續傅立葉級數(FT):時域週期連續訊號——頻域非週期離散頻譜
離散傅立葉變換(DTFT):時域非週期離散訊號——頻率週期連續頻譜
離散傅立葉級數(DFS):時域週期離散訊號——頻域週期離散頻譜
由於計算機只能處理離散的資料序列,要求時域和頻域序列都要是離散的,上圖中的四種變換,只有離散傅立葉級數DFS時域和頻域都是離散的,但是又因為DFS處理的均為無窮長的週期序列,也不適合計算機進行處理。不過對DFS進行改造,就能夠得到適合計算機處理的離散傅立葉變換DFT。
DFS--DFT
透過一系列推導。。。。。
DFT--FFT
按照訊號課本里的說法,一個長度為N的序列,用DFT去算,需要進行N*N次運算才可以計算出結果,如果資料量大,處理器光進行DFT計算就需要很多時間,實際應用起來很困難。
因此,又在DFT上面發展出了一種快速演算法FFT, 計算次數可以大大降低,長度為N的序列,FFT運算只要(N/2)log2(N) 次。
FFT只是加快了運算,並不是新的訊號理論。
2、在MATLAB裡進行fft(DFT)計算
MATLAB裡面提供了fft函式來進行DFT變換的數值計算。
clear
;
clc
;
close
all
x
=[
1。33
,
4。2
,
0。09
,
-
5。43
,
1。06
,
13。11
,
14。8
,
-
6。02
,
1。8
,
5。1
];
% 離散時間序列 x
N
=
length
(
x
);
% 計算訊號長度
n
=
0
:
N
-
1
;
% 序號
X
=
fft
(
x
);
% 計算出來的fft是個複數
%% 繪製頻域序列 X 的實部和虛部, 觀察頻域序列 X 的對稱性
figure
subplot
(
2
,
1
,
1
)
stem
(
n
,
real
(
X
))
;
% 繪製實部
grid
on
xlabel
(
‘序號n’
)
;
ylabel
(
‘X 實部’
)
;
subplot
(
2
,
1
,
2
)
stem
(
n
,
imag
(
X
))
% 繪製虛部
grid
on
xlabel
(
‘序號n’
)
;
ylabel
(
‘X 虛部’
)
;
繪製出來的結果如下:
從圖中可以觀察出DFT結果的兩個重要特點:
1、X(0)和X(N/2) 的虛部為零,即結果是個實數。
2、X以N/2為中心,實部偶對稱,虛部奇對稱,即X以N/2為中心,互相共軛。
還是以上述序列為例,資料經過fft計算後,得到的是複數序列,從複數序列我們可以得到幅值和相位角。
%% 幅值和相位角
A=abs(X); %計算幅值
Pha=angle(X); %計算相位角 rad
figure
figure
subplot(2,1,1)
stem(n,A) % 繪製頻域序列 X 的幅值
grid on
xlabel(‘序號 n’)
ylabel(‘X 幅值’)
subplot(2,1,2)
stem(n,Pha) % 繪製頻域序列 X 的相角
grid on
xlabel(‘序號 Seq’)
ylabel(‘X 相角’)
幅值和相角同樣存在著對稱性。
3、頻率刻度計算
上面畫出來的圖,橫座標不是頻率,還不算頻譜圖,需要將橫座標轉換為頻率。
假設上述例子中,十個點都是均勻取樣的,取樣時間間隔是Ts=0。01s,則取樣頻率是100hz,
序列的長度是N=10,則取樣頻率間隔是10hz,頻率範圍是[-50,50]hz, 考慮到負頻率只有統計意義沒有物理意義,捨棄負頻率。
又由於正頻率部分與負頻率部分具有對稱性,故將正負頻率成對合並起來,重新按照正的頻率範圍來繪圖。
Ts
=
0。01
;
Fs
=
1
/
Ts
;
%頻率
df
=
Fs
/
N
;
%頻率間隔
f
=(
0
:
1
:
N
/
2
)
*
df
;
% 頻率刻度
Y
=
X
(
1
:
N
/
2
+
1
);
% 提取正頻率的部分
Y
(
2
:
end
-
1
)=
2
*
Y
(
2
:
end
-
1
);
% 負頻率合併到正頻
A
=
abs
(
Y
);
% 計算頻域序列Y的幅值
Pha
=
angle
(
Y
);
% 計算頻域序列Y的相角 弧度
figure
subplot
(
2
,
1
,
1
)
stem
(
f
,
A
)
% 繪製頻域序列Y的幅頻圖
grid
on
xlabel
(
‘頻率 [Hz]’
)
ylabel
(
‘幅值’
)
subplot
(
2
,
1
,
2
)
stem
(
f
,
Pha
)
% 繪製頻域序列Y的相頻圖
grid
on
xlabel
(
‘頻率 [Hz]’
)
ylabel
(
‘相角’
)