|
版权声明:本文为博主原创文章,未经博主允许不得转载。 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=(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('汉宁窗后的频谱');- 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⁡(2π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=(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]);- 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。
|
|