窗函數在信號處理中的應用
好久沒寫博客了。。。哈哈。
我喜歡DSP基礎研究,上次好不容易在DSP中用到了一次窗函數感覺好棒,分享給大家希望能夠對大家有一些些幫助吧。
1,從兩個重要極限到時域低通濾波器
兩個重要極限
數學裏面常常會把兩個非常重要而且非常常見的極限放在一起並稱他們爲兩個重要極限。
第一個重要極限:函數sinx/x在x趨近於0處的極限。
第二個重要極限:(1 + 1/x)^x 在x趨近於無窮大時的極限。
頻域理想低通濾波器
兩個重要極限的重要性從表面上看在初等函數的求導上,尤其是三角函數的求導上起到了至關重要的作用。但其博大精深的數學思想,尤其是自然數e的作用,絕對是登峯造極,無以倫比。從另一個角度看,就連高數同濟六版這種SHI一樣的教材都不好意思忽視這兩個重要極限的重要性,其重要性就可想而知了。
言歸正傳,這兩個重要極限中提到的sinx/x,又叫SINC FUNCTION。在數字信號處理領域裏,可以說是聞名遐邇,無所不知。下圖是一個理想低通濾波器,通帶部分完全平坦,阻帶衰減爲無限大,而過渡帶無限小。
Matlab代碼:
%% An application of 2D window function on image processing.
% Date: early summer 2017
% Author: Z.Zhu, [email protected]
% Copy Rights Reserved.
% May not be copied, scanned, or duplicated, in whole or in part.
clear all;
close all;
%% Part I
%% Window function for DSP.
% Ideal lowpss
DataLength = 500; % Length of signal
Vector = linspace(0,0.5,DataLength); % Time vector
StepFun = ones(1,DataLength);
StepFun(DataLength/2:end) = 0;
plot(Vector,StepFun,'k','LineWidth',3);
title('Ideal lowpass filter in Freq-domain');
legend('The step function');
axis([0 0.5 -0.1 1.1]);
grid on
Sinc函數作爲空間域理想低通濾波器
現在我們對這個頻域理想低通濾波器做傅里葉逆變換(注意:這裏是逆變換,因爲是從頻域到時域。),就會得到一個形如下圖的空間域理想低通濾波器。
注意:上圖既不是實部圖也不是虛部圖,而是幅值圖,且經過了FFTSHIFT。
這就是著名的Sinc函數!
現在問題來了,Sinc函數是從正無窮到負無窮都存在的連續函數(如圖中所示的向兩邊無限延伸的漣漪(ripple))。
Matlab代碼:
%CSDN:by J27 copyright!
% Sinc
spectrum = fft(StepFun);
SPECTRUM = abs(spectrum)/(DataLength/2); % sqrt(RE^2 + IM^2) and normalized
figure;
plot(fftshift(SPECTRUM),'k','LineWidth',3);
title('Ideal lowpass filter in Time-domain');
legend('The sinc function');
axis([200 300 0 1.1]);
grid on
儘管這個無限長的函數在數學上沒有任何問題,但是想通過計算機來實現就無能爲力了。那麼辦呢?現在我們進入下一個話題。
2,截斷和能譜的泄漏
由於Sinc函數是無限的,爲了便於用電腦來表示我們就只能選擇其中的一段存到電腦裏。如下圖中,我用紅框選擇了整個Sinc函數其中的一段,而其他的部分全部都被砍掉了,這樣的突然砍斷,帶來了信號的不連續,即,信號的跳變。這種不連續直接導致了頻譜的泄漏。頻譜發生了畸變,原來非常集中的能量被分散到較寬的頻帶中去了。
下圖是截斷前後的比較
Matlab代碼:
%CSDN:by J27 copyright!
% Chopoff
CutSize = 30;
Chopoff = zeros(1,size(SPECTRUM,2));
temp = fftshift(spectrum);
Chopoff(DataLength/2 - CutSize : DataLength/2 + CutSize) = temp(DataLength/2 - CutSize : DataLength/2 + CutSize);
ChopedSinc = abs(Chopoff)/(DataLength/2); % normalize
figure;
subplot(2,1,1)
plot(fftshift(SPECTRUM),'k','LineWidth',3);
title('Ideal lowpass filter in Time-domain');
legend('Sinc function');
axis([200 300 0 1.1]);
grid on
subplot(2,1,2)
plot(ChopedSinc,'k','LineWidth',3);
title('chopped Sinc function in Time-domain');
legend('Choped Sinc function');
axis([200 300 0 1.1]);
grid on
信號的突然截斷導致了信號的不連續,爲了顯示這種數字化信號的不連續,這裏我選擇了另外一種繪圖方式來繪製。爲了顯示方便,原圖中高於0.05的部分被削去,爲了突出截斷處的不連續。
Matlab代碼:
%CSDN:by J27 copyright!
% Stem for its Discontinuity
figure;
stem(ChopedSinc,'k');
title('Discontinuity');
axis([200 300 0 .05]);
grid on
這樣的突然間斷會對該信號的頻譜帶來難以預估的影響,也就是我們常說的能譜的泄漏!
下次再爲大家娓娓道來。
(全文完)
謝謝收看!
鳴謝:
【1】Matlab 2017a
【2】托馬斯微積分
【3】[Steven W. Smith] The Scientist and Engineer's Guide to Digital Signal Processing(1999)
《聖經》 馬太福音19章19節 ------ 當孝敬父母,又當愛人如己。
*配圖和本文無關*