一次FFT分析截取1帧长度的时域信号,这1帧的长度总是有限的,因为FFT分析一次只能分析有限长度的时域信号。而实际采集的时域信号总时间很长,因此,需要将采样时间很长的时域信号截断成一帧一帧长度的数据块。这个截取过程叫做信号截断。
由于信号的非周期截断,导致频谱在整个频带内发生了拖尾现象。这是非常严重的误差,称为泄漏,是数字信号处理所遭遇的最严重误差。但是为什么会出现这种误差呢?原始实际信号为一条单频正弦波,它的频谱怎么会变得如此失真?这个问题很容易解释。这是因为截断后的信号不再是周期信号。
对比一下正确的频谱与发生泄漏的频谱,如下图所示,可以看出,泄漏后的频谱的幅值更小,频谱拖尾更严重。当截断后的信号不为周期信号时,就会发生泄漏。而现实世界中,在做FFT分析时,很难保证截断的信号为周期信号,因此,泄漏不可避免。
现在返回到非周期截断的正弦波,可以看出在截断时间长度内没有捕捉到整数倍个周期正弦波,导致波形发生了失真,似乎在信号周期的末端波形出现了不连续。这就解释了为什么FFT会在整个频带上发生拖尾现象了。本质上,这需要多个傅立叶展开项(多条谱线)去近似这个明显不连续的信号,因此,频谱出现了拖尾现象。
为了将这个泄漏误差减小到最小程度(注意我说是的减少,而不是消除),我们需要使用加权函数,也叫窗。加窗主要是为了使信号似乎更好地满足FFT处理的周期性要求,减少泄漏。(关于窗函数,完全可以写一篇长长的文章了,在这只简单介绍)
如下图所示,若周期截断,则FFT频谱为单一谱线。若为非周期截断,则频谱出现拖尾,如图中部所示,可以看出泄漏很严重。为了减少泄漏,给信号施加一个窗函数(如图中红色曲线所示),原始截断后的信号与这个窗函数相乘之后得到的信号为右侧上面的信号。可以看出,此时,信号的起始时刻和结束时刻幅值都为0,也就是说在这个时间长度内,信号为周期信号,但是只有一个周期。对这个信号做FFT分析,得到的频谱如右侧下边所示。相比较之前未加窗的频谱,可以看出,泄漏已明显改善,但并没有完全消除泄漏。因此,窗函数只能减少泄漏,不能消除泄漏。
在我们讨论窗函数的使用之前,让我们回想一下FFT变换三个基本属性:
首先,变换过程中能量必须守恒。也就是说,时域信号中的能量要与频域中的能量相等。
第二,FFT是在时域和频域之间变换信号。时域描述表明何时发生,频域描述表明是怎么发生的。
最后,FFT变换假设信号是重复、连续的周期信号。
首先,让我们考虑一个单频10Hz的正弦波,有效值为1V,如图1所示。这个信号在采样周期内是周期信号,计算其频谱。
如果我们使用FFT计算频谱,得到如图2所示的频谱图。图中只有一条用有效值表示幅值的谱线。
现在,让我们考虑第二个信号,如图3所示,9.5Hz的正弦波,有效值仍为1V。
如果我们对这个信号作FFT变换,得到的频谱如图4所示,此时频谱图中有多条谱线。为什么不是一条谱线呢?原始信号是一个单频正弦波,不是吗?FFT变换假设信号是连续的周期信号(不仅仅是在一个样本纪录时间内)。9.5Hz的信号(图3所示)从模拟角度上看是连续的周期的正弦信号,但是从数字化(以指定采样率进行离散化)角度上看却不是一个正弦波,如图5所示。
这就是为什么经FFT变换后会产生如图4所示的20条谱线的原因。真正原因,上一篇我们已经说明过,由于信号不连续,需要更多的傅立叶级数项去表征这个似乎不连续的信号。而多个傅立叶级数项则对应多条谱线,因此,在频谱图中会出现多条谱线,也就是所谓的频谱拖尾现象。
我们下一个问题是怎样最小化不连续造成的影响。答案是使用所谓的“窗函数”。通常,对于大多数一般用途的数据常使用“汉宁窗”。
原始时域信号乘以窗函数(图6所示)使得信号时域波形的开始和结尾时刻幅值为零(图7所示)。这样多个时间样本的首尾相连接使得整个信号为周期性信号了。这样信号不连续的问题就解决了,但是每个时间样本却不再是正弦波了。正弦信号的这次修正(加汉宁窗)在频域表现为4条谱线的信号,如图8所示。
加汉宁窗前20条谱线的频谱在加窗后减少到了4条谱线。还不完美,但已大大接近单条谱线了。对频率为10Hz的时域信号加汉宁窗后,单条谱线将会发生什么样的变化呢?加窗后的单频信号现在变成了3条谱线的信号,如图9所示。此时幅值精度没有损失,但频率精度上有一点损失。
窗函数的典型频谱特征如图14所示:
各种窗的差别主要在于集中于主瓣的能量和分散在所有旁瓣的能量之比例。窗的选择取决于分析的目标和被分析信号的类型。一般说,有效噪声频带越宽,频率分辨能力就越差,越难于分清有相同幅值的邻近频率。选择性(即分辨出强分量频率邻近的弱分量的能力)的提高与旁瓣的衰减率有关。通常,有效噪声带宽窄的窗,其旁瓣的衰减率较低,因此窗的选择是在二者中取折衷。
不同的窗函数具有不同的频谱特征,下表列出了一些常用类型的窗函数的特征。所有的窗函数都会使时域信号的开始和结束端归零。用于锤击试验的“力窗”和“指数窗”是个例外。
加窗函数时,应使窗函数频谱的主瓣宽度应尽量窄,以获得高的频率分辨能力;旁瓣衰减应尽量大,以减少频谱拖尾。但通常都不能同时满足这两个要求,各种窗的差别主要在集中于主瓣的能量和分散在所有旁瓣的能量之比。
窗函数的选择取决于分析的目标和被分析信号的类型,一般来说,有效噪声频带越宽,频率分辨能力越差,越难于分清有相同幅值的邻近频率。选择性的提高与旁瓣的衰减率有关,通常有效噪声带宽窄的窗,其旁瓣的衰减率较低,因此窗的选择在二者中进行折中处理。
窗函数的选择一般原则如下:
1. 如果截断的信号仍为周期信号,则不存在泄漏,无需加窗,相当于加矩形窗;
2. 如果信号是随机信号或者未知信号,或者有多个频率分量,测试关注的是频率点而非能量大小,建议选择汉宁窗;
3. 对于校准目的,则要求幅值精确,平顶窗是个不错的选择;
4. 如果同时要求幅值精度和频率精度,可选择凯塞窗;
5. 如果检测两个频率相近、幅值不同的信号,建议用布莱克曼窗;
6. 锤击法试验,力信号加力窗,响应可加指数窗。
类型ENBW幅值误差/dB最高旁瓣/dB旁瓣衰减/dB/每10个倍频程应用场合
矩形窗1.0-3.92(36.3%)-13.3-20未知的周期信号
汉宁窗1.5-1.42(15.1%)-31.5-60大多数一般用途
平顶窗3.8<0.01(0.1%)-93.60要求幅值精度,多用于校准用
Kaiser-Bessel1.8-1.02(11.1%)-66.6-20要求相对高的幅值精度和频率分辨率
有效噪声带宽和第一零点的位置有关系
几种常见窗函数
回到今天的主题,今天探讨一下几种常见滤波器的特性和使用场景。
翻了很多遍书,发现对于滤波器的设计,主要关心的是过渡带宽(Transition bandwidth)、通带边沿衰减(Passband ripple)、阻带最小衰减(Minimum stopband attenuation),而且大部分的参数都是用dB作单位。
使用dB做单位的好处有:
数值变小。由于分贝是取对数值,所以能很方便的表示大的数量的变化
运算方便。放大器级联时,总的放大倍数是各级相乘。用分贝做单位时,总增益就是相加。
方便感知。人对强度(光照、声音)的感知,接近于于强度的对数的正比。
至于为什么要这么多种窗呢?那是因为不同的窗特性不一样,比如最简单的矩形窗,虽然完成了截断工作,但是通带衰减大、阻带衰减小,导致能量的浪费;而之后的多种窗则或多或少的弥补了这些缺点。
矩形窗
矩形窗的定义为
频率响应函数为
因此
下面分析窗函数的主要参数:
幅度响应
第一个零点在
因此,主瓣宽度为为
,因此传输带宽近似于
第一个旁瓣大概在
的位置,因此它的幅值为
对比主瓣的幅值,旁瓣幅值峰值为
三角形窗
由于吉布斯现象,矩形窗存在一个0到1的越变;而三角形窗则提供了一个比较缓慢的变化,它的定义式为:
谱密度函数表达式如下,'≈'仅当
时成立
主瓣宽度为
,旁瓣峰值衰减为25dB
汉宁窗(Hanning)
这是一个升余弦窗,被定义为
主瓣宽度为
,旁瓣峰值衰减为31dB
海明窗(Hamming)
海明窗和汉宁窗很像,不同的是它有一部分是不连续的,被定义为
主瓣宽度为
,旁瓣峰值衰减为41dB
布莱克曼窗(Blackman)
这个窗函数和前两个窗函数很像,不过增加了升余弦的二次谐波分量,被定义为
主瓣宽度为
,旁瓣峰值衰减为57dB
凯泽窗(Kaiser)
这是一个非常有用的窗函数,它可以同时调整主瓣宽度与旁瓣宽度,这是其他窗函数不具备的,被定义为
是第一类零阶贝塞尔函数,
是用来调整窗函数性能的参数
本人使用的