频谱泄露与窗函数
今天,我想谈的是数字信号处理中的两个重要的问题,什么是频谱泄露,以及什么是窗函数,为什么使用窗函数。
什么是频谱泄露
我想大部分人和我一样,在学习数字信号处理或者从事相关工作时,会遇到相关的问题,那么今天,就给大家分析频谱泄露这个问题。
大家在其他地方也经常听见频谱泄露这个概念,那么频谱泄露究竟是什么呢?
频谱泄露,来自于对于原信号序列的截断,大家可能会问:为什么有时候频谱没有泄露,有时候频谱又泄露了? 今天我们就来谈谈这个问题,是真的频谱没有泄露吗?
我们大家知道对于理论分析来说,序列都是无限长的,而对于实际的离散时间信号,我们都是有限长的,那么想想,通过理论分析我们得出的频谱,和我们利用FFT计算得到的频谱区别在哪呢?区别就在于,我们在不知不觉中使用了矩形窗对原无限长序列进行了截断,其实按道理来说,频谱已经不再是我们理想的信号了,而是被矩形窗截断之后的信号。我们都知道,矩形窗的时域和频域对应关系是这样的:
matlab代码:
Fs=1000; %采样频率1000hz
w=boxcar(100);%生成长度为100的矩形窗
t=0:1/Fs:1-1/Fs;%假设信号持续期为1s,矩形窗持续0.1s
x=[w',zeros(1,length(t)-100)];%生成信号
f=0:Fs/N:(Fs-Fs/N);%频率刻度
f=f-Fs/2;%频率刻度
Y=abs(fft(x));
Y=fftshift(Y);
plot(f,Y)%在这里没有考虑幅度谱修正的问题
一、频谱泄露是什么?
首先我在这里想提示大家的是,matlab中的FFT是DFT的快速计算,正如大家在这里看到的矩形窗的时域和频域的对应这样,泄露都是存在的。对于一个单频信号来说,在频域表现为冲击,而这样的矩形窗,与无限长信号相乘,相当于为频域做卷积,单频信号被扩散成了这样类似Sa函数的表示形式。那么,我们怎么才能避免频谱泄露呢?
在这里,我首先想解释这样一个问题为什么泄露一直存在,但是有时看不到,有时候看得到? 为什么我们看不到的原因,是因为在栅栏效应中,我们在频率域取样点,除了在0频率点处取到1的样值,其余地方,我们都取到的是0的样值,所以在我们看来,“没有泄露”。而一旦我们非周期采样,我们会在Sa函数的非零点处取得样值,从而导致泄露。上面的原理我引用宋知用《Matlab数字信号处理85个案例精讲-从入门当进阶》中的一幅图
二、窗函数的目的
引入窗函数的目的,就是为了减小由于信号频谱泄露对临近频率的影响。下面我给出窗函数的类型及相关参数。
窗函数 | 旁瓣峰值dB | 近似过渡带宽 | 精确过渡带宽 | 阻带最小衰减/dB | matlab函数 |
---|---|---|---|---|---|
矩形窗 | -13 | 4 π N \frac{4\pi}{N} N4π | 1.8 π N \frac{1.8\pi}{N} N1.8π | 21 | boxcar(N) |
三角形窗 | -25 | 8 π N \frac{8\pi}{N} N8π | 6.1 π N \frac{6.1\pi}{N} N6.1π | 25 | triang(N) |
汉宁窗 | -31 | 8 π N \frac{8\pi}{N} N8π | 6.2 π N \frac{6.2\pi}{N} N6.2π | 44 | hanning(N) |
哈明窗 | -41 | 8 π N \frac{8\pi}{N} N8π | 6.6 π N \frac{6.6\pi}{N} N6.6π | 53 | hamming(N) |
布莱克曼窗 | -57 | 12 π N \frac{12\pi}{N} N12π | 11 π N \frac{11\pi}{N} N11π | 74 | blackman(N) |
凯赛窗 | -57 | — | 10 π N \frac{10\pi}{N} N10π | 80 | blackman(N) |