1. 程式人生 > >Matlab模擬傅立葉變換

Matlab模擬傅立葉變換

傅立葉變換是我們最早開始接觸的時頻域變換方法,雖然經常使用,知道怎麼用紙筆計算,但是還從來沒有在電腦中模擬過,正好現在開始學習數字訊號處理,藉著這個機會再學習如何在電腦上模擬傅立葉變換。

以下大部分內容來自Digital Signal Processing Using Matlab數字訊號處理教程 程佩青

此次選擇的軟體平臺為Matlab。

由於Matlab無法處理無限長序列,所以需要處理的訊號必須是有限長的。

連續時間傅立葉變換

傅立葉變換的公式為:

為了在計算機中模擬傅立葉變換,我們將積分變為求和的方式,上下限也從正無窮到負無窮變為一段長度M,dt需要儘可能小

在Matlab中,函式的自變數因變數的集合都是使用矩陣來儲存的,從矩陣的角度來看傅立葉變換的公式如下:

角頻率向量定義為

時間向量定義為

因此矩陣指數可寫為

整個傅立葉變換可寫為

Xa = xa * exp(-1j*t'*W) * Dt;

具體實現

其實下面這個例子是Digital Signal Processing Using Matlab中的,來自P64頁,不過想到都看到這裡了還要讀者翻書不太好,就一起放上來了。

定義

先進行數學上的分析,

MATLAB實現如下:

% Analog Signal
Dt = 0.00005;
t = -0.005:Dt:0.005;
xa = exp(-1000*abs(t));

% Continuous-time Fourier Transform
Wmax = 2*pi*2000;
K = 500;
k = 0:1:K;
W = k*Wmax/K;

Xa = xa * exp(-1j*t'*W) * Dt;
Xa = abs(Xa);

W = [-fliplr(W), W(2:501)];
Xa = [fliplr(Xa), Xa(2:501)];

subplot(2,1,1); 
plot(t*1000,xa);
xlabel('t in msec.'); 
ylabel('xa(t)');
title('Analog Signal');

subplot(2,1,2); 
plot(W/(2*pi*1000),Xa*1000);
xlabel('Frequency in KHz'); ylabel('Xa(jW)*1000');
title('Continuous-time Fourier Transform');

執行效果如下:

 

如果想確認變換的正確性,可以在執行完上面這個指令碼後,在命令列輸入

plot(W/(2*pi*1000),(0.002./(1+(W./1000).^2))*1000);
xlabel('Frequency in KHz'); ylabel('Xa(jW)*1000');

執行效果如下:

 

這時會發現,根據上面推導的變換公式直接plot出的圖形和變換後得到的圖形是一樣的,這樣可以確定變換的正確性。

存在問題

目前存在的問題是,對於複函式的變換結果不正確。我想了很多天都找不出問題所在,只能暫時放棄,等以後有機會再研究。

離散時間傅立葉變換

下面是對上一個例子中的模擬輸入訊號做離散化,然後再進行離散傅立葉變換。

為了體現Nyquist定理,將使用兩種不同的取樣頻率

  1. 使用Fs=5000sam/sec取樣來獲得x1(n)

  2. 使用Fs=1000sam/sec取樣來獲得x2(n)

% Analog Signal
Dt = 0.00005;
t = -0.005:Dt:0.005;
xa = exp(-1000*abs(t));

% Discrete-time Signal 
Ts = 0.0002;
n = -25:1:25;
x = exp(-1000*abs(n*Ts));

% Discrete-time Fourier transform
K = 500;
k = 0:1:K;
w = pi*k/K;

X = x*exp(-j*n'*w); X = real(X);

w = [-fliplr(w), w(2:K+1)];
X = [fliplr(X), X(2:K+1)];

subplot(2,1,1);plot(t*1000,xa);
xlabel('t in msec.'); 
ylabel('x1(n)');
title('Discrete Signal');hold on;

stem(n*Ts*1000,real(x));gtext('Ts=0.2 msec');hold off;

subplot(2,1,2);plot(w/pi,X);
xlabel('Frequency in pi units');ylabel('X1(w)');
title('Discrete-time Fourier Transform');

Fs=5000sam/sec

xa(t)的頻率為2KHz,因此它的Nyquist頻率為4KHz,而它的取樣頻率為5KHz,所以是滿足Nyquist取樣定律的,此時不會發生混疊。

執行效果如下:

 

Fs=1000sam/sec

這裡使用的取樣頻率為1KHz,不滿足Nyquist條件,因此會發生混疊。觀察一下就會發生,1KHz取樣得到的序列的頻域波形和前面的頻域波形不同,這就是混疊導致的,而且過低的取樣率採集的訊號的變換的不可逆的。

執行效果如下: