汉宁窗的性质

1、 为什么要加窗?

对数字信号进行快速傅里叶变换,可得到数字信号的分析频谱。分析频谱是实际频谱的近似。傅里叶变换是对延拓后的周期离散信号进行频谱分析。如果采样不合适,某一频率的信号能量会扩散到相邻频率点上,出现频谱泄漏现象。

为了减少频谱泄漏,通常在采样后对信号加窗。常见的窗函数有矩形窗(即不加窗)、三角窗、汉宁窗、汉明窗、高斯窗等。除了矩形窗外,其他的窗在时域上体现为中间高,两端低。

傅里叶分析的频率分辨率主要是受窗函数的主瓣宽度影响,而泄漏的程度则依赖于主瓣和旁瓣的相对幅值大小。矩形窗有最小的主瓣宽度,但是在这些最常见的窗中,矩形窗的旁瓣最大。因此,矩形窗的频率分辨率最高,而频谱泄漏则最大。不同的窗函数就是在频率分辨率和频谱泄漏中作一个折中选择。

在电机故障诊断领域,需同时考虑频率分辨率和频谱泄漏。应用最广泛的窗函数是汉宁窗。

2、MATLAB 中的汉宁窗

汉宁窗的英文写法有两种: hann 窗和 hanning 窗。正确写法是 hann,但是在实际使用过程中和汉明窗 (hamming)混淆而慢慢变成了 hanning (参见维基百科 Hann Function 条目)。目前,这两种表述都可以。在 MATLAB 中,也存在 hann 和 hanning 两个函数。每一个窗函数都可以选择 ‘symmetric’ 或 ‘periodic’ 类型。’symmetric’ 类型表示窗函数是对称的,对称的窗函数主要用于滤波器的设计。’periodic’ 类型表示窗函数是周期性的,常用于频谱分析。因此,这里只比较 ‘periodic’ 类型的 hann 和 hanning。

在 MATLAB 中, 可通过w = hann(N,'periodic')w = hanning(N,'periodic') 来获得长度为 N 的窗函数。实际上,上述两个函数得到的窗函数是完全一样的,均等价于

ω(n)=12[1cos(2π(n1)N)]

其验证过程如下:

N = 20;%窗函数的长度
w1 = hann(N,'periodic');
w2=zeros(N,1);
for n=1:N
    w2(n) = 0.5*(1-cos(2*pi*(n-1)/N));
end
figure(1);
subplot(2,1,1);
plot(w2);
title(['hann(N,','periodic',')']);
subplot(2,1,2);
plot(w1-w2);

w3 = hanning(N,'periodic');
figure(2);
subplot(2,1,1);
plot(w3);
title(['hanning(N,','periodic',')']);
subplot(2,1,2);
plot(w3-w1);
ylim([-2e-16, 2e-16]);
title(['hann(N,','periodic',') 和 ', 'hanning(N,','periodic',') 的误差'])

其输出的波形如下:

值得注意的是, w = hann(N,'symmetric')w = hanning(N,'symmetric')并不是一回事。前者等价于

ω(n)=12[1cos(2π(n1)N1)]

而后者则等价于

ω(n)=12[1cos(2πnN+1)]

3、汉宁窗对频谱的影响

3.1 加窗可减小频谱泄露

%% 信号
% 信号参数
fs = 2500; %采样频率
N=fs*10;
t=(1:N)/fs;
w1=49.85*2*pi;
w2=w1+2*pi*1;
w3=w1-2*pi*1;
x = 10*cos(w1*t) + 0.005*cos(w2*t)+0.03*cos(w3*t);

%% 窗函数对信号频谱的影响
% 矩形窗
x1 = x;
MyPlotf=(0:(N-1))*fs/N;
FF1=fft(x1,N);
y1=abs(FF1)*2/N;%FFT幅值
y1(1)=y1(1)/2;
figure(3);
plot(MyPlotf,20*log10(y1));
xlim([40 60]);
title('矩形窗后的频谱');

% 汉宁窗
w = hanning (N,'periodic');
x2 = w'.*x;%加窗

FF2=fft(x2,N);
y2=abs(FF2)*2/N;%FFT幅值
y2(1)=y2(1)/2;
figure(4);
plot(MyPlotf,20*log10(y2));
xlim([40 60]);
title('汉宁窗后的频谱');

不加窗(矩形窗)时的频谱为

加汉宁窗时的频谱为

从上述两个图可以看到,加入汉宁窗后,频谱泄露减小。原来被泄露的能量所掩盖而看不到的频率分量也可以清晰地看到。

3.2 加窗对频谱幅值的影响

波形为 x=Asin(2πft) 的信号,加汉宁窗后进行傅里叶分析,其傅里叶频谱中频率为 f 的分量幅值为 A2 (不考虑频谱泄露问题)。
例:

fs = 1000;%采样频率
t = 1/fs:1/fs:0.2;%分析时间0.2s
A = 10; %幅值
f = 50; %频率
x = A * sin(2*pi* f*t);
N = numel(t);
w = hann(N,'periodic');%生成窗函数
x_window = w'.*x;

MyPlotf=(0:(N-1))*fs/N;
FF=fft(x,N);
y=abs(FF)*2/N;%FFT幅值
FF=fft(x_window,N);
y_window=abs(FF)*2/N;%加窗后FFT幅值

figure(5);
plot(MyPlotf,y,'r',MyPlotf,y_window,'k');
legend('不加窗(矩形窗)','加汉宁窗');
title('加汉宁窗对信号频谱频谱幅值的影响');
xlim([0 100]);

得到的结果如下图所示:

从图上可以看到,幅值为 10 的信号,不加窗时得到的幅值也为 10 (由于恰好能取到50 Hz 这个频率点,所以不存在频谱泄露), 加入汉宁窗后的幅值变为了原来的一半。但是,会在该频率点两侧各引入一个本不存在的频率点,且这些点的幅值为中心点幅值的一半。这是由汉宁窗本身的频谱决定的。

4、结论

上述结果表明:

  1. MATLAB 中,w = hann(N,'periodic')w = hanning(N,'periodic')是完全一样的;
  2. 加窗后频谱泄漏减小;
  3. 加汉宁窗后,其幅值减为原来的一半,且会在改频率点两旁各引入一个本不存在的点,且这两个点的幅值为中心点幅值的一半。

申明:本博文来自 xinhuasz 的博客,地址为 http://blog.csdn.net/xinhuasz。

你可能感兴趣的:(信号处理,窗函数,FFT,信号处理,频谱泄漏)