常见的四种窗函数的表达式为:
四种常见窗函数的参数表
对于实际信号序列,该如何选取窗函数呢?一般来说,选择第一旁瓣衰减大,旁瓣峰值衰减快的窗函数有利于缓解截断过程中产生的频谱泄漏问题。但具有这两个特性的窗函数,其主瓣宽度较大,相应会带来一些副作用,应用中需根据具体情况折中地选择。
设信号中包含fa和fb两个频率分量,窗函数的选择与两个频率分量的间距以及两个频率分量的幅度比例密切相关。窗函数选择的一般准则如下表所列。
窗函数选择的一般规则
主瓣窄的窗函数一般旁瓣泄漏大,频谱泄漏主要集中在旁瓣范围内。旁瓣衰减大的窗函数,一般主瓣较宽,泄漏主要集中在主瓣范围内。
当选择加窗DFT时,已知采样长度N的选择与最小频域分辨率有关,而从上表中看到采样长度N还与窗函数的主瓣宽度相关,所以N的选择应为
N≥(fs/△fmin)K
式中:K为窗函数的主瓣宽度与矩形窗的主瓣宽度之比。
根据窗函数对数据处理的影响,可参照下列原则选取理想的窗函数:
①窗函数频谱的主瓣应尽可能地窄,以提高谱估计时的频域分辨率和减小泄漏。
②尽量减小窗函数频谱的最大旁瓣的相对幅度,以使旁瓣高度随频率尽快衰减。
若以上两条不能同时得到满足,则往往是增加主瓣宽度以换取对旁瓣的抑制。
总之,在应用窗函数时,除要考虑窗函数频谱本身的特性外,还应充分考虑被分析信号的特点及具体处理要求。
案例、设N=256,用boxcar函数产生矩形窗,以N=256进行FFT,又以N=2048点进行FFT,比较它们的谱图。并用hanning函数,hamming函数和blackman函数得到它们的谱图和时域图,程序如下:
clear all; clc; close all;N=256; % 窗长度 x=boxcar(N); % 设置矩形窗y=hanning(N);z=hamming(N);w=blackman(N);% 第一部分X1=fft(x); % FFTX1_abs=abs(fftshift(X1)); % 计算幅值freq1=(-128:127)/N; % 频率刻度1figure(1);subplot 311; plot(freq1,X1_abs,'k'); % 作图xlim([-0.1 0.1]);xlabel('归一化频率'); ylabel('幅值');title('(a) 补零前FFT谱图')% 第二部分X2=fft(x,N*8); % 对矩形窗补零后FFTX2_abs=abs(fftshift(X2)); % 计算幅值freq2=(-N*4:N*4-1)/(N*8); % 频率刻度2subplot 312; plot(freq2,X2_abs,'k'); % 作图xlim([-0.1 0.1]);xlabel('归一化频率'); ylabel('幅值');title('(b) 补零后FFT谱图')X2_dB=20*log10(X2_abs/(max(X2_abs))+eps); % 幅值取分贝值subplot 313; plot(freq2,X2_dB,'k'); % 作图axis([0 0.1 -50 5]);%xlim([-0.1 0.1]);xlabel('归一化频率'); ylabel('幅值/dB');title('(c) 补零后FFT谱图-分贝值')set(gcf,'color','w');%%Y2=fft(y,N*8); % 对hanning窗补零后FFTY2_abs=abs(fftshift(Y2)); % 计算幅值Y2_dB=20*log10(Y2_abs/(max(Y2_abs))+eps); % 幅值取分贝值Z2=fft(z,N*8); % 对hamming窗补零后FFTZ2_abs=abs(fftshift(Z2)); % 计算幅值Z2_dB=20*log10(Z2_abs/(max(Z2_abs))+eps); % 幅值取分贝值W2=fft(w,N*8); % 对blackman窗补零后FFTW2_abs=abs(fftshift(W2)); % 计算幅值W2_dB=20*log10(W2_abs/(max(W2_abs))+eps); % 幅值取分贝值figure(2);plot(freq2,Y2_dB,'k'); % 作图hold on;plot(freq2,X2_dB,'r');plot(freq2,Z2_dB,'b');plot(freq2,W2_dB,'g');axis([0 0.1 -150 5]);%xlim([-0.1 0.1]);xlabel('归一化频率'); ylabel('幅值/dB');title('补零后FFT谱图-分贝值')legend('hanning','boxcar','hamming','blackman');set(gcf,'color','w');figure(3);plot(hanning(N));hold on;plot(boxcar(N));plot(hamming(N));plot(blackman(N));legend('hanning','boxcar','hamming','blackman');title('四种窗函数的时域波形图');
运行结果如下:
在程序第一部分中(第一张图片),N=256,作256点的FFT,得图1(a)。从图中可看
到矩形窗的谱图并不只有一条谱线,且没有泄漏。这是怎么回事?
矩形窗的谱函数为
在N点DFT后离散频率为wk=2πk/N(k=C,1,…,N-1)。把wk代入上式可以发现,除k=0外,其他频点的幅值都为0,这就是为什么在图1(a)中除0点有谱线外,其他都为0值。
要得到常见的矩形窗谱图(把0值之间泄漏的值都能绘制出来),可以通过对数据补零得到。在程序第二部分N=256,但FFT变换长度L=2048,其中在数据后补了1792(256*7)个零值。FFT后的结果见图1(b),同时对FFT后的幅值取分贝值后的结果见图1(c),这就是我们常见的矩形窗的谱图。
同时在程序第二部分,我们得到了四种窗函数的时域波形和频谱图。
参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)