历史上的今天
今天是:2025年03月23日(星期日)
2021年03月23日 | 如何理解 FFT 中的频谱泄露效应 ?
2021-03-23 来源:eefocus
如前文“如何理解FFT中时间窗与RBW的关系”及“基于示波器的创新频谱分析技术”所述,FFT 是在一定假设下完成的,即认为被处理的信号是周期信号,因此运算中会涉及到周期扩展。如果采用矩形窗口且待 FFT 分析的信号时长不是信号周期的整数倍,则周期扩展会导致相位不连续,从而引起频谱泄露的问题。
图1. Frame1时长不是信号周期整数倍,周期扩展引起相位不连续
关于如何规避频谱泄露,在上面两篇文章中已经阐述。为了更好地理解频谱泄露的本质,本文旨在从理论上定性地解释频谱泄露的起因。
总体来讲,周期扩展中的相位不连续可以理解为相位调制,而且是一种特殊的相位调制,调制信号不再是经典的正弦波信号。当相位跳变为 时,调制信号为方波信号,可以将其调制信号写为如下形式 (下面始终考虑相位跳变为
的情况):
式中, 为调制信号的周期,为待 FFT 分析的波形时长的两倍。这意味着在
时刻,载波的相位发生了变化。
图2. 调制信号 p(t) 的时域波形
为了方便,下面将以对 CW 信号做 FFT 分析为例,并采用矩形窗,且窗口大小不是信号波形的整数倍。此时,周期扩展将造成载波相位的不连续。既然可以理解为相位调制,则可将已调信号写为如下形式:
式中 为相位偏移。很显然,调制信号已经不再是单频点信号,而是多频点信号。对于图2所示的周期为
的方波信号,其频谱包含基波及其众多的奇次谐波分量 。
满足 Dirichlet 条件时,任何周期函数均可以进行傅里叶级数展开, 可以写为:
为脉冲信号基波角频率,
。经计算可得:
可以重新写为:
由此可见, 除基波外还包含了众多的谐波分量。
首先考虑调制信号只包含DC和基波的情况,这又回到经典的相位调制。
将其代入已调信号 后可得
上式表示为复数形式为
可将 进行傅里叶级数展开,其展开式为宗数为
的第一类贝塞尔函数:
代入上式得
可以看出,当只考虑 包含的 DC 和基波时,已调信号
将包括
及
等众多频率分量。实际中
还包含丰富的谐波分量,因此对载波相位调制后的频谱更加丰富。面对的困难是,考虑的谐波越多,则公式推导越复杂。为了简化,下面只考虑到2次谐波。
代入 后并用复数表示为
类似地,傅里叶级数展开后
代入 后可得
当考虑到 的二次谐波时,
包含的频率分量:
,
,
以及
。
以此类推,当考虑更高阶的谐波时,将会有更多的频率项,从频率上看各个频率分量都是均匀分布的,而且相邻谱线之间的间距始终为 的基波
。
上面从理论上解释了频谱泄露的起因,而且当发生频谱泄露时,会产生众多的、分布均匀的频率分量,相邻谱线的频间距取决于调制信号的频率。值得一提的是,相位偏移 不仅对频率有影响 ,而且决定了不同频率分量的幅度,当
变化较大时,已调信号
的频谱变化也很大。
举例验证:使用 AWG 输出一个 100MHz 频率的 CW 信号,波形时长10.5个周期,当循环播放时便可以模拟上述的相位不连续性。
对于这种波形时长不是信号周期整数倍的情况,当单次播放时,信号的频率就是 100MHz ,但是当连续播放时相当于引起了相位调制,按照上述理论分析,频谱中将包含很多频率成分,图4给出了信号的实测频谱。
本例中,波形时长为105ns,这意味着频谱中相邻谱线之间的频率间隔约为:4.76MHz,这与图4所示的频谱是吻合的。
图3. 波形时长为 10.5 个信号周期
图4. 时域波形及其频谱
小结
对于使用矩形窗进行 FFT 时可能存在的频谱泄露效应,本文从理论上定性地进行了分析。究其原因,是因为当进行周期扩展时造成了相位的不连续。相位的不连续可以当作相位调制来处理,经过一系列推导最终解释了为什么会出现众多的频率成分。文末通过一个实例模拟了这种相位不连续,并测试了波形和频谱,实测结果与理论推导相吻合。
下一篇:浅谈选择示波器时的“5倍法则”
史海拾趣
|
现在用的ARM920T, 400M的cpu,Bitblt 640*480的 位图 用时0.5ms。太慢了,画面有明显的从上到下显示的感觉。 大家贴位图都是怎么贴的?有更快的方法吗? 还有一个疑问,系统的窗口为什么能显示的那么快,而没有从上到下显示的感觉? 或者需要更 ...… 查看全部问答> |
|
我在命令行下编译一个exe工程的时候, 老是报不能打开libc.lib库文件. 我用IDE直接编译却没有问题。 我用同样的方法编译静态库工程都没有任何问题,就编译dll和exe工程就有如此问题。请叫高人是何原因,谢谢! 补充:我编译的是EVC工程 报错如下 ...… 查看全部问答> |
|
Error (10207): Verilog HDL error at liftime.v(132): can\'t resolve reference to object \"interrput\"是为什么啊? 程序这是调用语句always @ ( posedge clk) if(oflag) led_ro = interrput(ios,iom, ...… 查看全部问答> |
|
尊敬的客户: 您好! 为了让广大用户更好得了解和使用ZigBee协议栈,产品及其开发套件。我司特联合深圳市无线龙电子科技有线公司,共同举办TI ZigBee培训会。我们荣幸得邀请您参加此次活动。具体安排如下: 地点: 江苏省无锡市无锡 ...… 查看全部问答> |




