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