说明
车载毫米波雷达的信号处理时,距离和速度维压缩(FFT)之前一般都有加窗的操作。加窗在信号处理中是一个很常规的操作,我不好说它很重要,至少在车载雷达的信号处理中即便是没有加窗(实际上也是加了矩形窗),对测量的影响不是很大,似乎是一个可有可无的操作。当然,说它可有可无也许是现阶段我对于加窗这个手段的理解不够深入,而这也是我想要写这篇博文的原因:搭建一个关于加窗的知识框架,不定期丰富并加深对加窗的理解,内容主要基于车载毫米波雷达的信号处理但不限于该应用场景。
关于加窗的各类说明,其实网上有很多资料,在博文末尾的参考资料章节我会给出我看到的一些比较好理解的参考资料。
Blog
20230511 博文第一次撰写
目录
一、什么是加窗
加窗是指对(采集到的)时域信号乘以一个窗函数以改变该时域信号的幅值。更具体地(或者说更一般地),是为了使得该时域信号首尾两端的幅值尽量一致。我们一般是把该被窗函数改变后的时域信号再给到后面的FFT。
图1.1 信号加窗流程示意图
至于为什么要这么做,以及这么做的影响,是后文第3章要讨论的问题。
二、常见的窗函数及其特点
窗函数的种类有很多,甚至自己都可以DIY一个窗函数,本章节聊聊常见的窗函数及其特点。
窗函数自身其实我们也可以将之理解成一个时域信号,不过其幅值是我们人为特意设置的,其长度应该等于被加窗的时域信号的长度,我们将这两个离散的时域信号(两个数组)进行点乘以完成加窗的操作。Matlab的帮助文档中,关于加窗有这些函数可直接调用(2021b版本下):
图2.1 Matlab内置的窗函数
其中矩形窗(或者说不加窗)、汉明窗(hamming)、汉宁窗(hann)用得多点,后文的一些仿真以及实践以这几个窗函数做示例说明。这三个窗函数的时域表达式如下(其它的窗函数读者感兴趣可以去网上搜搜):
矩形窗:
)
汉明窗:
汉宁窗:
以M = 128,基于前述表达式,画出这几个窗函数的时域以及(离散时间傅里叶变换下的)频谱图。并将之与Matlab自带的函数得到的结果进行对比。(Matlab有其自带的看窗函数的时域及频谱情况的函数:wvtool)。
图2.2 窗函数的时域图及其频域图
上图是用的离散时间傅里叶变换(DTFT)做的,不是FFT,FFT只能看到频域上离散的周期信号,DTFT才能看到频域上的连续的周期信号(才能看到旁瓣),FFT的结果是DTFT旁瓣峰值抽样构成的曲线(我在随附的代码文件中有写)。上图是按照前述公式自己构造离散的时域信号并画出其频域图,下图是用Matlab自带的窗函数生成信号并用自带的wvtool函数画出其时域和频域图:
图2.3 窗函数的时域以及频域图
两图的结果大差不差?包括主瓣(-3dB)波束宽度以及相对旁瓣衰减基本差不多。不过我后续的仿真和对实测数据的验证还是拿Matlab自带的函数。
我们去评价一个窗函数时,一般通过泄露因子、相对旁瓣衰减以及旁瓣衰减率、主瓣(-3dB)宽度这几个参数来做比较。泄露因子应该是表征窗函数频谱下的积分占比,该值越大,说明频谱能量泄露越严重。相对旁瓣衰减是指频谱的最大旁瓣高度与主瓣高度的差值,旁瓣衰减率是指旁瓣的下降速(斜)率,这两值也是用以表征能量泄露的,差值越大、衰减率越大说明能量泄露越少。-3dB主瓣宽度会一定程度影响频率分辨率(以及精度)。这几个值前面三个窗函数都不一样,从wvtool得到的结果来看:
对于泄露因子:矩形窗 > 汉宁窗 > 汉明窗
对于相对旁瓣衰减:汉明窗 > 汉宁窗 > 矩形窗
对于-3dB主瓣宽度:汉宁窗 > 汉明窗 > 矩形窗
后面章节我基于仿真和实测数据,看看这三种窗函数对信号的影响。
此外这里对上面两图中的归一化频率(频域图的纵坐标)做一个说明:我们平常说的(采样)频率是说指对一个信号进行采样时采样点之间时间间隔的倒数。归一化频率就是把采样搬到圆上,去表征圆上两个采样点之间的弧度。归一化也很简单,就是把频率范围从[-1:1]*f_adc/2 转成 [-1:1]*pi,理解不了没关系,这个概念的应用场景并不多,记住这个转换关系即可。
三、加窗带来的影响
本章讨论加窗背后的缘由、加窗带来的好处和坏处,并分别用仿真和实测数据来实际看看上一章中提及的三种窗函数的处理结果。
3.1 加窗的缘由
加窗是为FFT服务的,要明白加窗的缘由还是得先搞清楚FFT的本质。可能大多数人对FFT的理解只是:FFT是对一个时域信号进行分解,经过FFT后我们可以知道这个时域信号是由哪几个频率下的正弦信号、各自以什么样的幅度所叠加组成的,也即可以知道这个信号的频谱。其实对于应用来说,理解到这一层就已经足够了(一般编程语言内部都直接把FFT这个过程函数化了,我们直接调用就行),但是要弄清楚加窗和FFT得关系,我们还是得更深入一点理解FFT。
关于FFT的说明网上有很多的资料,我不做过多说明,这里讲讲与加窗有关的:做FFT的一个基本假设是:输入的信号是整数个周期信号。也就是说,对于FFT而言,是认为时域及频域是环形的拓扑结构:待分析的波形其前后两个端点是相连的。如果测量的信号是周期信号,且采集时间内刚好有整数个周期,那么FFT的上述假设是成立的。但是在很多情况下,我们没法测量到整数个周期,此时测量到的信号就会被从周期中间切断(前后端点是不连续的,或者说,端点的值是不相等的),此时对这被从周期中间切断的信号进行分析时,与时间连续的原信号相比就会显示出不同的特征。这一不连续的片段具备很丰富的频谱信息,特别是有高频的成分,这些高频成分是不存在于原信号中的,且这些频率可能远高于奈奎斯特频率,于是FFT后这些频率信息会混叠进0~采样率的一半的频率区间内,此时使用FFT获得的频谱并不是原信号的实际频谱,而是一个改变过的频谱,类似于某些频率的能量泄漏至其它频率,这种现象便叫做频谱泄漏,这些到达其它频率的能量前面虽然说是从高频过来的,但是从能量守恒的角度来看(实际上信号中没有高频分量),本质上还是从我们所关注的频点(原始时域信号中实际存在的频率)中来的。
可以从下面这张图有点直观的理解:
图3.1 整数以及非整数倍采样下的时域和频域图
仿真中信号频率为10Hz,整数倍周期采样下采集了20个周期的信号,非整数倍周期采样下多采集了五分之一个周期的信号。可以看到后者的频谱信息更加“丰富”,信号(10Hz)的能量泄露到了周边频率上,导致周边频率的幅值抬高。
加窗是干啥呢?加窗就是让我们采集的信号前后端点更加接近,以减少频谱泄露的发生。(其实如果输入信号满足FFT的假设条件,是不需要加窗的,但实际上输入信号一般不满足该条件)加窗可减少这些不连续部分的幅值,加窗是将采集到的信号乘以有限长度的窗,窗的幅值逐渐变小,在边沿处接近0,加窗的结果是尽可能呈现出一个连续的波形。
以上内容呼应了本博文第一章的内容,希望已经解释得够清楚了。
3.2 加窗的影响
做任何一件事都是有成本的,加窗也是。加窗可以给我们带来降低频谱泄露的好处,但同时是也会带来不好的影响(加窗这件事的成本不仅仅是增加了计算步骤和计算量):频谱幅值失真,具体看后面两节。加窗对相位的影响是线性的,所以一般不用考虑。
3.3 基于仿真数据的处理结果及其讨论
本小节以及下一节探讨加窗的影响,并简单比较前文提及的三种窗作用效果。此外,前面的仿真都是单路信号,后文的仿真以及实测数据都是IQ两路信号,其差别在于横坐标的设置,单路信号下fadc的采样率只能看到[0 fadc/2]带宽内的频谱,但是双路信号下fadc的采样率可以看到[0 fadc]带宽下的频谱。
图3.2 加窗前后时域对比
图3.3 加窗前后频域对比
以上仿真中,信号频率取10Hz,采样率40Hz,IQ两路采样,采集了64个点,没有加噪声。
对前述仿真结果进行分析:
- 加窗对频谱泄露的压制是很明显的(后面两个窗函数作用下信号周边频谱的幅值下降明显)!这是加窗最核心的好处。
- 加窗带来的不好的影响也很明显:在后面两个窗函数下,频谱下信号的幅值严重失真,相较于不加窗(或者说加矩形窗),幅值减小了一半。
- 对应到前文第二章中我们的三个结论:对于泄露因子:矩形窗 > 汉宁窗 > 汉明窗;对于相对旁瓣衰减:汉明窗 > 汉宁窗 > 矩形窗;这两参数的影响下主要是看频谱图下方的面积,以及在图中标注的11.4286Hz(可以认为是旁瓣)对应的幅值,仿真的结果都是符合在第二章中的结论的。对于-3dB主瓣宽度:汉宁窗 > 汉明窗 > 矩形窗,可以看到主瓣的宽度是逐渐减小的,符合前述结论,加窗是会展宽主瓣的。
3.4 基于毫米波雷达开发板实测数据的处理结果及讨论
我用Ti的AWR2243级联板也采集了数据进行分析,(读者也可以拿我之前博文中的数据进行分析,比如毫米波雷达的系统设计细节(2) - 关于目标RCS的问题_毫米波雷达rcs_墨@#≯的博客)这篇博文中的数据。本博文所附数据我直接给了一个解析好的.mat数据文件(一个通道的ADC数据),该数据的大小是:256*64,256为距离维的采样点数,64是速度维的采样点数。分析时直接load即可。本节的分析只做距离维的分析。实验场景为角反位于级联板的正前方约3.5m的位置。
图3.4 加窗前后信号时域图对比
图3.4 加窗前后信号频域图对比
基于实测数据得到的效果与结论与前面仿真差不多。其实没有觉得有很让人惊艳的改善之类的体现,所以我在博文开头说明中说对测量的影响不是很大,似乎是一个可有可无的操作。
四、加窗影响的消除
频谱幅值的失真来源于窗函数对信号幅值的压缩,其产生的直观的结果前面一章已经做了说明和展示。本章探讨加窗后频谱幅值失真这一问题的解决:如何复原频谱幅值的真实值?如果我们在实际应用中对幅值的估计有较高的要求,那么就需要把目标频率真实的幅值求到。
我们可以基于能量相等或幅值相等的原则求得恢复系数,关于原理以及推导读者可以参看随附的参考资料1,这里直接给出参考资料1中的结论吧:
图3.5 常用窗函数的恢复系数
我用前述恢复系数来“复原”仿真以及实测数据的结果,如下:
图3.6 幅值恢复后(基于仿真结果)
图3.7 幅值恢复后(基于实测数据的结果)
恢复后与不加窗(加矩形窗)后的幅值差不多,可以认为恢复的效果不差。
这里增加一点关于FFT后信号频谱下的幅值与时域下该信号真实幅值的说明(这一点我在之前的博文毫米波雷达的系统设计细节(1) - 从雷达方程到雷达威力图_墨@#≯的博客的第一章中,关于FFT对SNR的改善中有过说明):一般地,FFT是对信号的相干累积,当我们对信号是单路采样时,我们认为频谱图中频点的幅值A与该信号在时域下的幅值B的关系为:B ≈ A*Nsamples/2,当为IQ两路采样时,不需要除以2。
这其实可以从我们上面的图中得到证明:比如图3.1上面的图中,我们对信号进行了整数个周期(20个周期)的单路采样(信号),时域下信号的幅值为1,信号是10Hz,采样率是50Hz,也即采集了100个点,可以看到频谱图中该频点的幅值为50(等于1*100/2),而在下面的图中,因为是非整数个周期采样的有频谱泄露的产生,于是幅值减小了,变成了43.69,其实此时该值也是失真的,我们用43.69/50是得不到信号的真实幅值的。
再比如图3.3中,我们使用IQ采样的方式对时域幅值为1的10Hz的信号采集了64个点,如果是整数个周期的话,那么加矩形窗下后该信号的幅值应该是64(直接用1*64),但是实际只有57,也是因为频谱泄露导致失真,但还算贴近真实值,至少比加汉宁和汉明窗要好很多,实际应用中我们可以近似将57/64作为该信号时域下的真实幅值。
五、不同类型窗的特点及其适用
这个话题本质是想说明既然有这么多的窗函数,那对于特定应用场景该如何用这些窗函数?其实对于我而言,至少现阶段,在车载毫米波雷达的信号处理领域我觉得窗函数对于最终测量结果的影响不是很大,或者说我感触不是很深。这里贴出我在一篇博文(理解FFT和信号加窗原理及意义-全文- FPGA/ASIC技术-电子发烧友网 (elecfans.com))中看到的一段话供参考:
选择窗函数并非易事,每一种窗函数都有其特征和适用范围。要选择窗函数,必须先估计信号的频率成分。
- 如果您的信号具有强干扰频率分量,与感兴趣分量相距较远,那么就应选择具有高旁瓣下降率的平滑窗。
- 如果您的信号具有强干扰频率分量,与感兴趣分量相距较近,那么就应选择具有低最大旁瓣的窗。
- 如果感兴趣频率包含两种或多种很距离很近的信号,这时频谱分辨率就非常重要。在这种情况下,最好选用具有窄主瓣的平滑窗。
- 如果一个频率成分的幅值精度比信号成分在某个频率区间内精确位置更重要,选择宽主瓣的窗。
- 如信号频谱较平或频率成分较宽,使用统一窗,或不使用窗。
- 总之,Hanning窗适用于95%的情况。 它不仅具有较好的频率分辨率,还可减少频谱泄露。 如果您不知道信号特征但是又想使用平滑窗,那么就选择Hanning窗。
即使不使用任何窗,信号也会与高度一致的长方形窗进行卷积运算。本质上相当于对时域输入信号进行截屏,对离散信号也有效。
至于各种窗的特点,读者可以直接在Matlab中用其自带的wvtool函数看看这个窗的时域和频域是怎样的即可(像上面的图2.3那样)。
六、总结
本博文讨论信号处理中的加窗问题,从窗函数的介绍、加窗背后的缘由、加窗的影响与消除、各类窗函数的建议适用范围等几个方面对该问题进行了讨论,并基于仿真和实测数据对窗函数的使用、影响、以及频谱幅值恢复等做了论述。本博文试图搭建一个关于加窗的各方面的知识框架,现阶段博主理解还不够深,后面我会基于积累不定期丰富本博文内容。
七、参考资料
参考资料1 焦新涛, 丁康. 加窗频谱分析的恢复系数及其求法[J]. 汕头大学学报:自然科学版, 2003, 18(3):6.