拙网论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 167|回复: 0

汉宁窗的性质

[复制链接]

949

主题

1001

帖子

3736

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3736
发表于 2018-8-31 23:43:30 | 显示全部楼层 |阅读模式
版权声明:本文为博主原创文章,未经博主允许不得转载。        https://blog.csdn.net/xinhuasz/article/details/51405737
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[1−cos(2π(n−1)N)]ω(n)=12[1−cos⁡(2π(n−1)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));endfigure(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',') 的误差'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

其输出的波形如下:

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



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


而后者则等价于



ω(n)=12[1−cos(2πnN+1)]ω(n)=12[1−cos⁡(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=(0N-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('汉宁窗后的频谱');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

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

加汉宁窗时的频谱为

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

3.2 加窗对频谱幅值的影响

波形为 <span class="MathJax" id="MathJax-Element-7-Frame" tabindex="0" data-mathml="x=Asin&#x2061;(2&#x03C0;ft)" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; word-break: break-all; position: relative;">x=Asin(2πft)x=Asin⁡(2πft)的信号,加汉宁窗后进行傅里叶分析,其傅里叶频谱中频率为 <span class="MathJax" id="MathJax-Element-8-Frame" tabindex="0" data-mathml="f" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; word-break: break-all; position: relative;">ff 的分量幅值为 <span class="MathJax" id="MathJax-Element-9-Frame" tabindex="0" data-mathml="A2" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; word-break: break-all; position: relative;">A2A2 (不考虑频谱泄露问题)。
例:

fs = 1000;%采样频率t = 1/fs:1/fs:0.2;%分析时间0.2sA = 10; %幅值f = 50; %频率x = A * sin(2*pi* f*t);N = numel(t);w = hann(N,'periodic');%生成窗函数x_window = w'.*x;MyPlotf=(0N-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]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

得到的结果如下图所示:

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

4、结论

上述结果表明:

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

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



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|抱朴守拙BBS

GMT+8, 2025-5-26 12:05 , Processed in 0.198876 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表