【问题标题】:FFT returns SINC instead of distinct peaksFFT 返回 SINC 而不是不同的峰值
【发布时间】:2014-07-29 21:34:46
【问题描述】:

我在 C# 中尝试了两种不同的 FFT 实现,两者都给了我一些奇怪的结果。为了创建一个最小的测试,我真的归结为我提供给 FFT 的单个归一化(所有参数 = 1)余弦波,但不是在 1Hz 处获得单峰,而是得到一些类似于基数正弦 (SINC) 的函数。现在这有点奇怪,因为 SINC 应该是 FFT 的结果,用于某些平面盒功能。我不知道是什么导致了这种行为,只是为了确保我运行了一个演示,显示了预期的结果here

我目前正在使用这个implementation of FFT,但与 ExoCortex 1.2 的结果相同。 这是左侧频域 FFT 结果和右侧时域信号的屏幕截图。

【问题讨论】:

  • 我猜这是因为当您从整个无限域中获取余弦时,余弦函数的理论傅立叶逆是一个单一的脉冲。您在这里拥有的是余弦函数的一部分,因此逆函数不完全是单个增量。您可能会在这里得到更准确的答案,Signal Processing
  • 这个问题似乎跑题了,因为它是关于信号处理的。
  • 抱歉,我没有注意到有专门的 SP 站点。SE 网络越来越大了。
  • 我认为您在这里看到的只是光谱泄漏(谷歌)。
  • 真正的输入信号很少是完美的,你只是不能产生无限的正弦波。你的余弦是有问题的,它在开始时有从 0 到 MAX 的尖峰,在结束时接近 MAX 回到 0。这些快速跃迁会产生大量的三阶谐波,就像方波一样,您可以在频谱中很好地看到它们。当您从 0 开始和结束时,它看起来会更好。需要 window function 来抑制工件。

标签: c# signal-processing fft


【解决方案1】:

任何有限长度的正弦曲线本质上都是由一个盒子或矩形窗口化的。如果 FFT 的长度是正弦曲线周期的精确整数倍,并且正弦曲线未调制地延伸到该 FFT 的全长,则您只会看到一个峰值。

您的正弦曲线太短,和/或在 FFT 长度上不是整数周期。

【讨论】:

    【解决方案2】:

    正如Nils Pipenbrinck 所说,这是非常严重的频谱泄漏情况。使用Hans Passant 建议的窗口函数(Blackman–Nuttall)并将我的时域信号转换为正弦波而不是余弦波导致了巨大的改进,我基本上得到了在正确频率下具有最大值的窄钟。因此,这是最佳解决方案,两位评论者都值得称赞。

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 2023-04-11
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      相关资源
      最近更新 更多