减少FFT(DFT)频率泄露的办法,窗函数的解释和选用

关于DFT的频率泄露的解释,请看另一篇:https://blog.csdn.net/qq_34193940/article/details/80569088


这篇ref:https://mp.weixin.qq.com/s?__biz=MzI5NTM0MTQwNA==&mid=2247484189&idx=1&sn=78af69208296935021da913200ff272d&scene=21#wechat_redirect


在我们讨论窗函数的使用之前,让我们回想一下FFT变换三个基本属性:

  • 首先,变换过程中能量必须守恒。也就是说,时域信号中的能量要与频域中的能量相等。

  • 第二,FFT是在时域和频域之间变换信号。时域描述表明何时发生,频域描述表明是怎么发生的。

  • 最后,FFT变换假设信号是重复、连续的周期信号。

 

首先,让我们考虑一个单频10Hz的正弦波,有效值为1V,如图1所示。这个信号在采样周期内是周期信号,计算其频谱。


 

如果我们使用FFT计算频谱,得到如图2所示的频谱图。图中只有一条用有效值表示幅值的谱线。



2 10Hz正弦波的FFT

 

现在,让我们考虑第二个信号,如图3所示,9.5Hz的正弦波,有效值仍为1V



3 9.5Hz的正弦波

 

如果我们对这个信号作FFT变换,得到的频谱如图4所示,此时频谱图中有多条谱线。为什么不是一条谱线呢?原始信号是一个单频正弦波,不是吗?FFT变换假设信号是连续的周期信号(不仅仅是在一个样本纪录时间内)。9.5Hz的信号(图3所示)从模拟角度上看是连续的周期的正弦信号,但是从数字化(以指定采样率进行离散化)角度上看却不是一个正弦波,如图5所示。



4 9.5Hz的正弦波的FFT(多条谱线)



数字化后的9.5Hz的正弦波

 

这就是为什么经FFT变换后会产生如图4所示的20条谱线的原因。真正原因,上一篇我们已经说明过,由于信号不连续,需要更多的傅立叶级数项去表征这个似乎不连续的信号。而多个傅立叶级数项则对应多条谱线,因此,在频谱图中会出现多条谱线,也就是所谓的频谱拖尾现象。

 

我们下一个问题是怎样最小化不连续造成的影响。答案是使用所谓的“窗函数”。通常,对于大多数一般用途的数据常使用“汉宁窗”。

 

原始时域信号乘以窗函数(图6所示)使得信号时域波形的开始和结尾时刻幅值为零(图7所示)。这样多个时间样本的首尾相连接使得整个信号为周期性信号了。这样信号不连续的问题就解决了,但是每个时间样本却不再是正弦波了。正弦信号的这次修正(加汉宁窗)在频域表现为4条谱线的信号,如图8所示。


汉宁窗


正弦信号乘以汉宁窗后的时域波形


8 9.5Hz正弦信号加窗后的频谱

 

加汉宁窗前20条谱线的频谱在加窗后减少到了4条谱线。还不完美,但已大大接近单条谱线了。对频率为10Hz的时域信号加汉宁窗后,单条谱线将会发生什么样的变化呢?加窗后的单频信号现在变成了3条谱线的信号,如图9所示。此时幅值精度没有损失,但频率精度上有一点损失。


加窗后的10Hz正统信号

 

加窗后的时域信号的开始和结束端丢失了什么,我们该怎样处理?超过一半的时间样本被缩减成零,我们怎样确保发生改变刚好位于缩减的幅值区域附近呢?一种处理技术称为“重叠”,使用这种技术,使得发生改变位于时间样本的开始和结束端的可能性大大提高。图10描述了时间样本通过“0%重叠”的情况,图11表明重叠50%


10 无重叠


11 重叠50%

 

通常,考虑重叠67%(图12)对于时间样本的开始和结束端是足够的,然而75%(图13)的重叠会更理想。当今,随着计算机的处理速度越来越快,没有理由不使用这种重叠技术。


12 重叠67%


13 重叠75%

 

窗函数的典型频谱特征如图14所示:


14 窗函数的典型频谱特征

 

各种窗的差别主要在于集中于主瓣的能量和分散在所有旁瓣的能量之比例。窗的选择取决于分析的目标和被分析信号的类型。一般说,有效噪声频带越宽,频率分辨能力就越差,越难于分清有相同幅值的邻近频率。选择性(即分辨出强分量频率邻近的弱分量的能力)的提高与旁瓣的衰减率有关。通常,有效噪声带宽窄的窗,其旁瓣的衰减率较低,因此窗的选择是在二者中取折衷。

 

不同的窗函数具有不同的频谱特征,下表列出了一些常用类型的窗函数的特征。所有的窗函数都会使时域信号的开始和结束端归零。用于锤击试验的“力窗”和“指数窗”是个例外。


  • 5
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DFT(离散傅里叶变换)和 FFT(快速傅里叶变换)都是用来计算信号频谱的算法,但是 FFT 是一种比 DFT 更快的算法。如果您已经实现了基于短时窗的 DFT 频谱分析算法,并且想将其更新为 FFT 算法,可以按照以下步骤进行: 1. 选择合适的 FFT 库 与 DFT 不同,FFT 可以高效地计算大型信号的频谱,因此有很多 FFT 库可供选择。一些常见的 FFT 库包括:Intel MKL、FFTW、cuFFT 等。您可以根据自己的需求和计算平台选择合适的 FFT 库。 2. 将 DFT 转换为 FFT DFTFFT 的核心思想是相同的,只是 FFT 是通过重复使用一些中间结果来减少计算量的。因此,将 DFT 转换为 FFT 的过程相对简单,只需要将 DFT 的计算过程改为 FFT 的计算过程即可。例如,使用 FFTW 库来计算 DFT 的代码如下: ```matlab % 定义信号和窗函数 x = ...; win = ...; % 定义 FFT 相关参数 n_fft = length(win); n_overlap = n_fft / 2; n_hop = n_fft - n_overlap; % 初始化频谱矩阵 spec = zeros(n_fft/2+1, length(x)/n_hop); % 计算每个时刻的频谱 for i = 1:n_hop:length(x)-n_fft+1 % 从信号中截取一个窗口 x_win = x(i:i+n_fft-1) .* win; % 计算 DFT X = fft(x_win); % 将 DFT 转换为幅度谱 spec(:, (i-1)/n_hop+1) = abs(X(1:n_fft/2+1)); end ``` 将上面的代码中的 `fft` 函数替换为 FFTW 库中的 `fftw` 函数即可将 DFT 转换为 FFT。 3. 短时窗不变 由于 FFTDFT 的计算过程是相同的,只是 FFT 能够更快地计算出信号频谱,因此在将 DFT 更新为 FFT 的过程中,短时窗不需要进行任何修改。只需要将 DFT 的计算过程改为 FFT 的计算过程即可。 希望这些信息能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值