窗函數(window function)在信號處理當中的應用(二)

窗函數在信號處理中的應用


      上次我們只是提到了對突然截斷後的不連續信號進行傅里葉變換後,它的新頻譜就會發生一系列的變化(泄漏),現逐一說明:

1,振盪

如果把截斷後的信號進行傅里葉逆變換重新變回到頻域,其結果並不是原來那種理想濾波器而會出現劇烈的抖動/振盪。



Matlab代碼:

% Ripple
CHOPOFF = abs((ifft(Chopoff)));
figure;
plot(CHOPOFF,'k','linewidth',2);
title('Choped off lowpass filter in Freq-domain');
legend('Ripple');

2,幅值的衰減

     這裏我需要借用正弦函數來說明。下圖是一個標準的正弦函數及其傅里葉變換後的頻譜圖,由於正弦函數也是沿着X軸兩邊無限延伸的連續函數。



爲了用電腦來表示和保存它,所以要對它進行有選擇的截斷,如下圖所示。




下圖爲截斷後的新信號及其傅里葉頻譜



下圖爲原始信號的頻譜和截斷後信號的頻譜的比較



3,拖尾

原本非常規則,集中的頻譜,因爲時域信號的突然截斷和不連續,出現了不希望看到的頻譜的拓寬和畸變。



     綜上:信號能譜的泄露會往往會出現上述三種情況,抖動,拖尾和幅值的衰減,究其根本原因主要是因爲,信號的突然截斷,產生了一個新的跳變的,不連續的,非週期的信號


Matlab代碼:

% choped sinewave
Fs = 1000;            % Sampling frequency
T = 1/Fs;             % Sampling period
L = 1000;             % Length of signal
t = (0:L-1)*T;        % Time vector
% Form a signal containing a 120 Hz sinusoid of amplitude 1.
S = sin(2.*pi.*50.*t);
figure;
plot(S)

% chop off a part of signal from original one
s = S(10:120);
figure;
plot(s)

% replicate chopped signal
sReplicate = repmat(s,1,5);
figure;
plot(sReplicate)

% spectrum of original signal
YS = fft(S);
yS = abs(YS/L);         % normalization
figure;
plot(fftshift(yS))

% spectrum of chopped signal
Ys = fft(s);
ys = abs(Ys/size(Ys,2)); % normalization
figure;
plot(fftshift(ys))


3,窗函數在SINC FUNCTION反變換中的應用。


現在我們回到之前的帶有劇烈振盪的頻域理想低通濾波器,如下圖所示,還記得嗎?



      爲了避免突然截斷帶來的振盪,信號處理的工程師們常常會選擇在進行傅里葉反變換之前對截斷後的信號進行加窗處理。窗的種類有很多,大多數是在上世紀50年代爲其命名的,其中有兩個比較常用的,一個是漢明窗(Hamming),一個是布萊克曼窗(Blackman)。這兩個窗函數的濾波器參數詳細比較如下,鑑於我這次主要不是專講DSP,這裏就不詳細拓展了(當然了,我自己在這方面也不是完全瞭解),這是給出了教科書中的一個經典截圖,如下。而我們這次的實驗就要使用布萊克曼窗!


     下圖爲我在MATLAB中生成的Blackman窗函數。注意:窗函數的長度即SIZE一定要和原始信號的長度相同。但是爲了顯示和突出我想說明的重點,我在寫這篇文章的時候,很多地方的長度都不是一致的,請讀者注意。



Matlab代碼:

% form window function
BlackmanWindow = zeros(1,size(CHOPOFF,2));
BlackmanWindow(DataLength/2 - CutSize : DataLength/2 + CutSize) = blackman(2*CutSize + 1)';
figure;
plot(BlackmanWindow,'linewidth',3);
legend('BlackmanWindow');
axis([200 300 0 1.1]);

接下來用布萊克曼窗乘以被加窗的信號,效果如下圖所示。



細節放大比較,注意不連續的跳變被極大的平滑掉了。



Matlab代碼:

% windowed(magnitude only)
SincWindowed = ChopedSinc .* BlackmanWindow;
figure;
subplot(2,1,1)
plot(abs((ChopedSinc)),'linewidth',3);
title('Choped off sinc function in Time-domain');
axis([200 300 0 inf]);
subplot(2,1,2)
plot(abs((SincWindowed)),'linewidth',3);
title('BlackmanWindow times sinc function in Time-domain');
axis([200 300 0 inf]);

現在對加窗後的新信號進行傅里葉逆變換,看看新的頻域低通濾波器會是什麼樣。



Matlab代碼:

% Fourier tranform of windowed function 
SINCWINDOW = Chopoff .* BlackmanWindow;
SINCWINDOW = (abs(ifft((SINCWINDOW))));
figure;
subplot(1,2,1)
plot(CHOPOFF,'k','linewidth',2);
title('Choped off lowpass filter in Freq-domain');
legend('Ripple');
axis([0 505 0 1.2]);
subplot(1,2,2)
plot(SINCWINDOW,'k','linewidth',2);
title('windowed Sinc freqency response');
legend('Smooth roll-off/ Ripple eliminated');
axis([0 505 0 1.2]);

4,總結------> 流程圖。


謝謝大家花時間閱讀,這一部分我主要是講的窗函數在DIP中的使用,下次我分享一下窗函數在圖像中的應用實戰。

(全文完)


鳴謝:

【1】Matlab 2017a

【2】[Steven W. Smith] The Scientist and Engineer's Guide to Digital Signal Processing (1999)


謝謝收看!

再見!


《聖經》 彼得前書5章5節  -------  神阻擋驕傲的人,賜恩給謙卑的人。


*配圖和本文無關*


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