DFT再理解
2015.12.18
之前學習《信號與系統》的時候,對於用fft()函數分析離散、連續時間信號的頻譜出來的結果一直一知半解,這學期學習了《數字信號處理》,學習了離散傅里葉變換(DFT),對之前的寫的程序做進一步理解。
在此之前,先將CTFS、DTFS、CTFT、DTFT的公式列出來,方便理解:
注意:這裏計算離散週期信號的傅里葉係數的公式前面少了一個N分之一,下面也會涉及到。
(一) 用DFT分析離散非週期信號的頻譜(離散非週期的DTFT爲連續週期的,以2*pi爲週期)
比較DTFT和DFT公式可以發現:
N點DFT是DTFT結果在[0,2*pi]週期內N點採樣;
所以,分析離散非週期信號的頻譜的思路如下:
(1) 對已知的信號進行截短(如果本來就是有限長的則不用);
(2) 對截短的離散信號做N點DFT(這裏的N應該大於離散信號的點數,N越大,在頻域的採樣就越密集);
(3) 將橫座標轉換爲【-pi,pi】,符合實際的情況(/N*2*pi)。
具體的解釋見下面的代碼(具體代碼粘貼在最後面)。
下面是一個例子:
運行結果如下:
(二) 用DFT分析離散週期信號的頻譜(離散週期信號的DTFS爲離散週期的,以基波週期N爲週期)
比較DTFS和DFT公式,可以發現:
如上面提到的,上面的DTFS公式與實際的相差了N倍,所以在畫頻譜的時候需要考慮進去。
離散週期信號的基波週期爲N,取其中N點做N點DFT相當於離散週期信號DTFS的一個N週期內的值。
所以,分析離散週期信號的頻譜的思路如下:
(1) 確定基波週期N;
(2) 取離散週期信號的N個點,如【0,N-1】;
(3) 做N點DFT(幅度上要除以N,原因在DTFS公式比DFT公式前面多了一項1/N);
(4) 得到離散週期信號在一個基波週期內的傅里葉係數;
下面是一個例子:
(三) 用DFT分析連續非週期信號的頻譜(連續非週期信號的CTFT爲連續非週期的)
利用採樣,將連續非週期信號,轉換成離散非週期信號,對得到的離散非週期信號做DFT,類似於(一),最後再利用模擬頻率與數字頻率的關係(模擬頻率乘以採樣週期等於數字頻率)將橫座標由數字頻率轉換爲模擬頻率:
分析連續非週期信號的頻譜的思路如下:
(1) 根據需要截短(如果連續信號是無限長的);
(2) 估計信號的最高頻率fm;
(3) 採樣頻率fs>2*fm;
(4) 按T(T=1/fs)對連續信號進行採樣;
(5) 對採樣後的信號(相當於離散非週期信號)做N點DFT(此處的N應該大於等於採樣點數,而且越大越好,越大代表如(一)分析的,在頻域上的採樣就越密集,對離散非週期信號的頻譜更好地逼近),DFT結果幅度上要除以T,這是採樣導致的結果;
(6) 將橫座標轉換成模擬頻率(/N*2*pi*fs)。
下面是一個例子:
(四) 用DFT分析連續週期信號的頻譜(連續週期信號的CTFS爲離散非週期)
對連續週期信號在一個或多個基波週期長度內進行採樣,採樣頻率fs>2*fm,對採樣點做等長(假設爲N)的DFT(幅度上得除以N,原因同(二)),由於用了採樣,所以同(三)一樣需要將數字頻率轉換成模擬頻率(/N*2*pi*fs)。
分析連續週期信號的頻譜的思路如下:
(1) 確定基波週期To和最高頻率fm,採樣頻率fs>2*fm;
(2) 對連續週期信號的一個週期(可以多個週期)以頻率fs進行均勻採樣,採樣點數爲N;
(3) 對採樣點做N點DFT(幅度/N,原因同(二));
(4) 將橫座標轉換成模擬頻率(/N*2*pi*fs)。
下面是一個例子:
全部代碼:
function test1
%%%%%%%%(1)離散非週期%%%%%%%%%%%%% x = 0.8.^n;(頻譜爲連續週期(週期爲2*pi))
N = 31;%%%%%無限長的信號應根據需要先截斷
n = 0:N-1;
x = 0.8.^n;
X = fft(x,N);%%%%%%對截斷的離散信號做N點DFT相當於在其頻譜的【0,2pi】區間做N點均勻採樣
figure;
subplot(3,1,1);
stem(n,x);
subplot(3,1,2);
plot([-(N-1)/2:(N-1)/2],abs(fftshift(X)));%%%%%%此處畫出來的頻譜圖的橫座標是對離散非週期信號的實際頻譜在[-pi,pi]區間採樣的點
subplot(3,1,3);
plot([-(N-1)/2:(N-1)/2]./N*2*pi,abs(fftshift(X)));%%%%%%此處將頻譜的橫座標轉化爲[-pi,pi]區間,這纔是實際情況(離散非週期信號的DTFT是連續週期的,以2pi爲週期)
%%%%%%(2)離散週期%%%%%%%%%%%%% x =cos(pi/8*n+pi/3)+0.5cos(7*pi*n/8);(頻譜爲離散週期(週期爲基波週期N))
%%%%%%%%確定信號的基波週期爲16
N = 16;
n = 0:N-1;
x = cos(pi/8*n+pi/3)+0.5*cos(7*pi*n/8);
X = fft(x,N)/N;%%%%%%對截斷的離散信號做N點DFT,得出的結果相當於是原週期信號在【0,N-1】的傅里葉係數,除以N表示DFT公式與離散週期信號傅立葉級數公式的關係所需;
figure;
subplot(3,1,1);
stem(n,x);
subplot(3,1,2);
stem([-N/2:N/2-1],abs(fftshift(X)));%%%%%%此處畫出來的頻譜圖的橫座標是離散週期信號的CTFS(傅里葉係數,以N爲週期),在[-N/2:N/2-1]的變化,即諧波次數(基波週期N=16的情況下)
subplot(3,1,3);
stem([-N/2:N/2-1]./N*2*pi,abs(fftshift(X)));%%%%%%此處畫出來的頻譜圖的橫座標是將上面的諧波次數乘上基波頻率2*pi/N
%%%%%%(3)連續非週期%%%%%%%%%%%%% x = exp(-1*t);(頻譜爲連續非週期)
%%%%%%取x的最高頻率fm爲25,根據奈奎斯準則,採樣率取100>2*25
%%%%%此處的信號無限長,同樣需要進行截短,這裏去前6秒
fs = 100;
Tp = 6;
T = 1/fs;
t = 0:T:Tp;
x = exp(-1*t);
N = 1024;%%%%%%%進行DFT的點數,這裏的N只要比採樣點數多即可,越大越能夠逼近
X = fft(x,N)*T;%%%%%%此處乘上T是由於對連續信號採樣導致的頻譜幅度變化。
subplot(2,1,1);
plot(t,x);
subplot(2,1,2);
%%%%%%此處畫出來的頻譜圖的橫座標是[-N/2:N/2-1]*(2*pi/N)是對採樣得到的離散非週期信號做頻譜分析得到的數字角頻率,乘上fs即除以採樣週期T纔得到模擬角頻率
plot([-N/2:N/2-1]*(2*pi/N)*fs,abs(fftshift(X)));
%%%%%%%(4)連續週期%%%%%%%%%%%%% x =cos(10*pi*t)+2*cos(18*pi*t);(頻譜爲離散非週期)
%%%%%%%因爲x的基波頻率爲2*pi,基波週期Tp爲1s,最高次諧波爲9,即最高頻率爲9Hz
%%%%%%%由奈奎斯採樣準則確定出採樣頻率fs=20>2*9
fs = 20;
T = 1/fs;
Tp = 1;
N = Tp/T;
t = 0:T:Tp-T;
x = cos(10*pi*t)+2*cos(18*pi*t);
X = fft(x,N)/N;
subplot(2,1,1);
plot(t,x);
subplot(2,1,2);
stem([-N/2:N/2-1]/N*fs,abs(fftshift(X)));%%%%%%此處畫出來的頻譜圖的橫座標是[-N/2:N/2-1]*(2*pi/N)是對採樣得到的離散非週期信號做頻譜分析得到的數字角頻率,乘上fs即除以採樣週期T纔得到模擬角頻率