【问题标题】:Why in FFT output of 1Hz sine wave, does 1Hz magnitude behave like a sine wave?为什么在 1Hz 正弦波的 FFT 输出中,1Hz 幅度表现得像正弦波?
【发布时间】:2013-02-11 08:33:07
【问题描述】:

我一直在用 .NET 开发一个小软件,它实时获取来自传感器的信号,并对该信号进行 FFT,该信号也实时显示。

我已将 alglib 库用于 FFT 函数。现在我的目的是及时观察某个特定频率的强度。

为了检查软件,我为其输入提供了一个频率为 1 Hz 的正弦波。下图显示了软件的屏幕截图。上图显示了在 1 Hz 处显示峰值的频谱。然而,当及时观察到这个峰值时,如下图所示,强度表现为正弦波。

我的采样频率是 30kHz。我不明白的是我是如何得到这个正弦信号的,为什么频率幅度会这样?

【问题讨论】:

  • 是否有可能由于信号为 1Hz 并且我以 30kHz 的频率对每组 30000 个数据点进行 FFT 采样,因此该频率太低而无法正确测量此设置?跨度>
  • 单峰光谱的逆 FFT应该始终为正弦。你期望看到什么?
  • @Junuxx 我没有说任何关于逆 FFT 的事情。我只是对像正弦波一样随时间变化的幅度感到好奇。
  • 正弦波的幅度在时域中的行为类似于正弦波,几乎可以根据正弦波的定义来定义。时域通常也是频域的逆傅立叶变换,通常也是根据定义。
  • @hotpaw2 谢谢,但我很清楚。这里的重点是时域中 1Hz 的 FFT 幅度,而不是输入正弦波幅度。

标签: signal-processing fft frequency spectrum


【解决方案1】:

这是Windowing 效果的示例。它源于这样一个事实,即 FFT 不是一种精确的运算,除非是在处理完美的周期信号时。当您将信号窗口化时,您会将其变成一个可能不会完美重复的更小块。 FFT 算法计算无限重复的 this 音频块的频谱。由于它不是完美的正弦波,因此您无法获得结果的准确值。此外,我们可以看到,如果您的窗口不能与您的信号频率的倍数完美对齐,那么它将相对于您的信号发生相移,窗口会捕获稍微不同的信号块,并且 FFT 会计算不同无限重复信号的频谱。如果你仔细想想,这个相位差自然也是周期性的,因为窗口赶上你的信号的下一个周期。

但是,这只能解释强度的较小变化。假设您在底部图表的轴上使用了正确的标签(您应该仔细检查),那么还有其他问题。您的窗口可能太小(尽管我希望不会,因为那样您会看到更多的光谱出血)。我刚刚想到的另一种可能性是,您可能只是在绘制 FFT 的 real 部分,而不是 幅度。随着相位的变化,实数和复数部分可能会有所不同,但您希望 幅度 大致保持不变。

【讨论】:

  • 感谢您的回复。我刚刚检查了一下,发现从 -10 到 +10 的整个正弦信号中,第一个窗口只有 0 到 2 的数据。这意味着它只是 FFT 进入窗口的正弦波的 10%。我还检查了下图的 xaxis 是否有确切的标签。每个点显示频率为 1Hz 的 FFT 幅度值。
  • 我正在使用 Alglib 进行 FFT,我正在计算这样的幅度:alglib.fftr1d(data, out fft1); double[] magnitude = new double[fft1.Length]; for (int i = 0; i < fft1.Length/2; i++) { magnitude[i] = Math.Sqrt(fft1[i].x * fft1[i].x) + (fft1[i].y * fft1[i].y); list1.Add(i * ((double)sampleRateInKHz * 1000 / fft1.Length), magnitude[i]); } list2.Add(pointIndex,magnitude[Convert.ToInt32(comboBoxFrequencyList.SelectedItem.ToString())]); pointIndex++;
  • 我放大了上图。我认为 X 和 Y 轴较早被缩放,现在只有 Y 轴被缩放。请注意以下两个图像中的幅度差异,两个瞬间的图形截图。 [链接] (dumpyourphoto.com/files7/206091/hpFOd8x1gL.jpg) [链接] (dumpyourphoto.com/files7/206092/fbHhop.jpg)
  • 好吧,我发现了我的第一个错误;我错过了magnitude[i] = Math.Sqrt(fft1[i].x * fft1[i].x) + (fft1[i].y * fft1[i].y); 中的括号。显然,幅度计算不正确。现在我已经通过用magnitude[i] = Math.Sqrt((fft1[i].x * fft1[i].x) + (fft1[i].y * fft1[i].y)); 替换它来纠正它,我的输出似乎仍然不正确。 0Hz 的幅度现在已经超过了 1Hz 正弦波的 1Hz,请参阅 [link] (dumpyourphoto.com/files7/206116/Odocn6yADG.jpg)
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多