使用许多紧凑频率时出现奇怪的 FFT 峰值

Posted

技术标签:

【中文标题】使用许多紧凑频率时出现奇怪的 FFT 峰值【英文标题】:Strange FFT peaks when working with many tight frequencies 【发布时间】:2013-12-26 15:17:39 【问题描述】:

我正在使用这个 python 代码的稍微修改的版本来进行频率分析: FFT wrong value?

假设我在时域中有一组正弦波,它们的频率非常接近,但幅度相同。这就是它们在频域中的样子,对 1024 个样本使用 FFT,我从中去除了后半部分,得到 512 个分辨率:

这是我在同一组波上应用 FFT,但这次有 128 个样本(64 个 bin):

我预计会有一个平稳的频率响应,但看起来中心的波被抵消了。我看到的那些“角”是什么?这正常吗?

【问题讨论】:

【参考方案1】:

我相信你的结果是正确的。峰值位于 ±f1 和 ±f2),对应于第一个图中显示的两个信号的各自频率分量。

我假设您将直流分量移回中心?您指的是什么“中心波浪”?

您还应该注意其他几个潜在问题:

混叠:通过检查,您的信号中似乎有足够的样本,但请记住,如果没有足够的样本点来捕获基础频率,则 FFT 可以创建人工(或混叠)频率。具体来说,如果您的频率为 f,那么您需要数据样本间距至少为 Δx = 1/(2*f) 或更小。

加窗:您的信号是加窗的(具有有限范围),因此由于边缘影响,每个空间频率的功率也会出现一些展宽、振铃或重新分布。

由于我不知道您的数据的详细信息,因此我继续创建了一个正弦曲线,然后对数据进行采样,使其接近您的采样率。例如,下面是一个有 64 个点的正弦曲线,信号频率为 10 个周期(计算峰值):

FFT 结果为:

它显示了与您相同的定量特征,但没有您的数据,我很难匹配您的确切情况(间距和锥度)。

接下来我应用了一个超高斯窗函数(如下所示)来模拟数据的有限范围:

将窗口应用于输入信号后:

由于数据的有限范围,相应的 FFT 结果显示了一些额外的功率重新分配:

虽然我无法匹配您的确切情况,但我相信您的结果符合预期,并且您的数据的一些定性特征已被识别。希望这会有所帮助。

【讨论】:

木星!我很抱歉这么说,但你的回答有两个主要的误解。首先,我在问题中发布的第一张图片有效地显示了 10 个以非常相似的频率堆叠在一起的正弦波的 频率 域!如果您愿意,可以在加法合成器中使用。顺便说一句,那不是时域。其次,我在第二张图片中显示的喇叭不是由众所周知的 FFT 镜像结果引起的。事实上,我明确表示我去掉了 FFT 的后半部分,只显示前半部分。请重新阅读我的问题。 您显示 2 个数字,第一个是正弦曲线。所以你是说第一个数字是 FFT 的结果,是其他一些未显示的信号的结果?如果是这样,那很好,只是想了解您拥有什么。如果是这种情况,那么这意味着另一个“未知”信号是从上图中显示的频谱合成的。那么当你说“剥离第二半”时,你会带走什么?你能证明吗?然后在第一个图的正下方,您说您在将信号的采样(未显示)从 1024 个样本更改为 128 个样本后再次执行 FFT?【参考方案2】:

在频域中间隔很近的正弦波有时会在时域中几乎抵消。由于您的第二个 FFT 比您的第一个 FFT 短 8 倍,因此您可能只对这么短的取消区域进行了窗口化。尝试更短时间窗口的不同时间位置以查看不同的东西(或正弦曲线的不同相位)。

【讨论】:

是的!我尝试随机化正弦的相位,现在 128-FFT 显示了一个单一的、漂亮的、平滑的峰值,正如预期的那样。谢谢。

以上是关于使用许多紧凑频率时出现奇怪的 FFT 峰值的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试计算两周之间的差异,但是在绘制结果时出现了一个奇怪的峰值( SQL / BigQuery )

FFT 频谱中的毛刺

Android:通过fft获取更精确的频率

FFT 音频的多峰值轮询

如何正确 FFT 声音阵列?

确定掷骰子中出现的数字的频率