我一直在 .NET 中开发一个小软件,它实时从传感器获取信号并获取该信号的 FFT,该信号也实时显示。
我已将 alglib 库用于 FFT 函数。现在我的目的是及时观察某个特定频率的强度。
为了检查软件,我为其输入提供了一个频率为 1 Hz 的正弦波。下图显示了软件的屏幕截图。上图显示了在 1 Hz 处显示峰值的频谱。然而,当及时观察到这个峰值时,如下图所示,强度表现为正弦波。
我的采样频率是 30kHz。我不明白的是我是如何得到这个正弦信号的,为什么频率的幅度会这样?
我一直在 .NET 中开发一个小软件,它实时从传感器获取信号并获取该信号的 FFT,该信号也实时显示。
我已将 alglib 库用于 FFT 函数。现在我的目的是及时观察某个特定频率的强度。
为了检查软件,我为其输入提供了一个频率为 1 Hz 的正弦波。下图显示了软件的屏幕截图。上图显示了在 1 Hz 处显示峰值的频谱。然而,当及时观察到这个峰值时,如下图所示,强度表现为正弦波。
我的采样频率是 30kHz。我不明白的是我是如何得到这个正弦信号的,为什么频率的幅度会这样?
这是Windowing效果的一个示例。它源于这样一个事实,即除了处理完美的周期性信号外, FFT不是一种精确的操作。当您将信号窗口化时,您会将其变成可能无法完美重复的较小块。FFT 算法计算这块音频的频谱,无限重复。由于它不是完美的正弦波,因此您无法获得结果的准确值。此外,我们可以看到,如果您的窗口不能与您的信号频率的倍数完美对齐,那么它将相对于您的信号发生相移,窗口会捕获稍微不同的信号块,并且 FFT 会计算不同的光谱无限重复的信号。如果你仔细想想,这个相位差自然也是周期性的,因为窗口会赶上你信号的下一个周期。
然而,这只能解释强度的较小变化。假设您在底部图表的轴上使用了正确的标签(您应该仔细检查),那么还有其他问题。您的窗口可能太小(尽管我希望不会,因为那样您会看到更多的光谱出血)。我刚刚想到的另一种可能性是,您可能只是在绘制 FFT 的实部,而不是幅度。随着相位的变化,实际和复杂的部分可能会有所不同,但您希望幅度保持大致相同。