關於MATLAB實現的數字信號處理(三)


關於MATLAB實現離散時間傅里葉變換(DTFT)——傅里葉變換的學習與認識(上)

傅里葉變換

法國工程師傅里葉指出,一個“任意”的周期函數x(t)可以分解爲無窮多個不同頻率的正弦信號的和,這既是傅里葉級數。求解傅里葉傅里葉係數的過程就是傅里葉變換。傅里葉級數(針對週期信號,要求信號在一個週期內的能量是有限的)和傅里葉變換(針對非週期信號,要求信號在整個時間區內的能量是有限的)又統稱爲傅里葉分析或諧波分析

1.連續時間的傅里葉變換

其目的是以正弦函數(正弦和餘弦函數統稱爲正弦函數)或虛指數
ejwt e^{jwt}
爲基本信號,將任意的連續時間信號表示爲一系列不同頻率的正弦函數或虛指數函數之和(對於週期信號)或積分(對於非週期信號)

2.離散時間信號的傅里葉變換(DTFT)

它是以虛指數函數
ej(2πN)kn e^{j(\frac{2\pi}{N})kn}

ejθk e^{j\theta k}
爲基本信號,將任意離散時間信號表示爲N個不同頻率指數的虛指數之和(對於週期信號)或積分(對於非週期信號)。

同時,爲了實現用數字計算機進行傅里葉變換的計算,定義了離散傅里葉變換(DFT)

序列x[n]的離散時間傅里葉變換X(e^jw)是w的連續函數。由於數據在 MATLAB中以向量的形式存在,X(e^jw)只能在一個給定的離散頻率的集合中計算。只有類似
X(ejw)=p0+p1ejw+...+pMejwMd0+d1ejw+...+dNejwN X(e^{jw})= \frac{p_0+p_1 e^{-jw}+...+p_M e^{-jwM}} {d_0+d_1 e^{-jw}+...+d_N e^{-jwN}}
形式的e^(-jw)的有理函數,才能計算其離散時間傅里葉變換。

在下面的練習中,我們將學習怎樣用 MATLAB來求取並畫出序列的離散時間傅里葉變換

例.計算離散時間傅里葉變換

如前面提到的式子所示,序列x[n]的離散時間傅里葉變換X(e^(jw)),可以用 MATLAB函數 freqz非常方便地在給定的L個離散頻率點w=w_L處進行計算。由於X(e^jw)是w的連續函數,需要儘可能大地選取L的值,使得產生的圖形和真實離散傅里葉變換的圖形儘可能一致。在 MATLAB中, fretz計算出序列{p0 p1… pM}和序列{d0 d1…dN}的L點離散傅里葉變換,然後對其離散傅里葉變換值相比得到X(e^jw L),L=1,2,…,L。爲更加方便快速地運算,應將L的值選爲2的冪,如256或者512。

例:離散時間傅里葉變換的原始序列爲
H(ejw)=2+ejw10.6ejw H(e^{jw})=\frac{2+e^{-jw}}{1-0.6e^{-jw}}
實現代碼

% Program P3_1
% 求取信號的離散時間傅里葉變換
clf;
% 計算離散時間傅里葉變換的頻率樣本
w = -4*pi:8*pi/511:4*pi;  %頻率點
num = [2 1];  %系統傳遞函數的分子的係數
den = [1 -0.6];  %系統傳遞函數的分母的係數
h = freqz(num, den, w);%h爲求取的濾波器頻率響應函數
% 畫出DTFT
subplot(2,2,1)
plot(w/pi,real(h));grid
title('H(e^{j\omega})的實部')
xlabel('\omega /\pi');
ylabel('振幅');
subplot(2,2,2)
plot(w/pi,imag(h));grid
title(' H(e^{j\omega})的虛部')
xlabel('\omega /\pi');
ylabel('振幅');
pause  %暫停,按任意鍵繼續執行下面的操作
subplot(2,2,3)
plot(w/pi,abs(h));grid
title(' |H(e^{j\omega})|幅度譜')
xlabel('\omega /\pi');
ylabel('振幅');
subplot(2,2,4)
plot(w/pi,angle(h));grid
title('相位譜arg[H(e^{j\omega})]')
xlabel('\omega /\pi');
ylabel('以弧度爲單位的相位');

運行結果
在這裏插入圖片描述

例:計算有限長序列的離散時間傅里葉變換

g[n]={1 3 5 7 9 11 13 15 17}

實現代碼

% Program P3_1
% 求取有限長序列的離散時間傅里葉變換
clf;
% 計算離散時間傅里葉變換的頻率樣本
w = -4*pi:8*pi/511:4*pi;  %頻率點
a  = [1 3 5 7 9 11 13 15 17 ];  %系統傳遞函數的分子的係數  
 h = freqz(a, 1, w);%h爲求取的濾波器頻率響應函數,1爲系統傳遞函數的分母的係數
% 畫出DTFT
subplot(2,2,1)
plot(w/pi,real(h));
grid;
title('H(e^{j\omega})的實部')
xlabel('\omega /\pi');
 ylabel('振幅');   
subplot(2,2,2)
plot(w/pi,imag(h));
grid;
title(' H(e^{j\omega})的虛部')
xlabel('\omega /\pi');
ylabel('振幅');
subplot(2,2,3)
plot(w/pi,abs(h));
grid;
title(' |H(e^{j\omega})|幅度譜')
xlabel('\omega /\pi');
ylabel('振幅');
subplot(2,2,4)
plot(w/pi,angle(h));
axis([0 1 -4 4]);
grid;
title('相位譜arg[H(e^{j\omega})]')
xlabel('\omega /\pi');
ylabel('以弧度爲單位的相位');

運行結果
在這裏插入圖片描述
對相位譜截取[0,1]之間的圖像發現明顯的相位譜跳變。相位到一定負值就會跳變爲正值,正弦信號的週期爲2pi,即-pi到pi。所以,當低於-pi時就會自動加2kpi,發生相位跳變。unwrap命令可移除跳變。

要計算一個系統相頻特性,就要用到反正切函數,計算機中反正切函數規定,在一、二象限中的角度爲0~pi,三四象限的角度爲0~-pi。
若一個角度從0變到2pi,但實際得到的結果是0~pi,再由-pi~0,在w=pi處發生跳變,跳變幅度爲2pi,這就叫相位的卷繞
unwrap( )就是解卷繞,使相位在pi處不發生跳變,從而反應出真實的相位變化 "
查看 unwrap 的幫助文檔可以發現 unwrap 還可以輸入一個參數 tol,默認tol = pi。也可以根據情況修改 tol。
參考鏈接:https://blog.csdn.net/zb1165048017/article/details/50381021

實現代碼

% 求取有限長序列的離散時間傅里葉變換,
%並對相位譜進行解卷繞
clf;
% 計算離散時間傅里葉變換的頻率樣本
w = -4*pi:8*pi/511:4*pi;  %頻率點
a  = [1 3 5 7 9 11 13 15 17 ];  %系統傳遞函數的分子的係數  
 h = freqz(a, 1, w);%h爲求取的濾波器頻率響應函數,1表示系統傳遞函數的分母的係數爲1
% 畫出DTFT
subplot(2,2,1)
plot(w/pi,real(h));
grid;
title('H(e^{j\omega})的實部')
xlabel('\omega /\pi');
 ylabel('振幅');   
subplot(2,2,2)
plot(w/pi,imag(h));
grid;
title(' H(e^{j\omega})的虛部')
xlabel('\omega /\pi');
ylabel('振幅');
subplot(2,2,3)
plot(w/pi,abs(h));
grid;
title(' |H(e^{j\omega})|幅度譜')
xlabel('\omega /\pi');
ylabel('振幅');
subplot(2,2,4)
y=unwrap(angle(h));
plot(w/pi,y);
grid;
title('相位譜arg[H(e^{j\omega})]')
xlabel('\omega /\pi');
ylabel('以弧度爲單位的相位');

運行結果
在這裏插入圖片描述
未解卷繞之前圖像

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章