C# FFT返回SINC而不是不同的峰值

C# FFT返回SINC而不是不同的峰值,c#,signal-processing,fft,C#,Signal Processing,Fft,我在C#中尝试了两种不同的FFT实现,它们都给了我一些奇怪的结果。为了创建一个最小的测试,我将其归结为单个标准化(所有参数=1)余弦波,我将其提供给FFT,但不是在1Hz时得到单个峰值,而是得到一些类似基数正弦(SINC)的函数。这有点奇怪,因为SINC应该是一些平盒函数FFT的结果。我不知道什么会导致这种行为,只是为了确保我运行了一个演示,显示了预期的结果 我目前正在使用这个,但外皮1.2也有同样的结果。 这是左侧频域FFT结果和右侧时域信号的屏幕截图。 任何有限长的正弦曲线基本上都是由一个长

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

我目前正在使用这个,但外皮1.2也有同样的结果。 这是左侧频域FFT结果和右侧时域信号的屏幕截图。

任何有限长的正弦曲线基本上都是由一个长方体或矩形开窗的。如果FFT的长度是正弦波周期的精确整数倍,并且正弦波未经调制地延伸该FFT的整个长度,则只能看到单峰


您的正弦波要么太短,要么FFT长度不是整数周期。

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

我猜这是因为余弦函数的理论傅里叶逆是一个脉冲,当你从它的整个无限域取余弦时。这里是余弦函数的一部分,所以逆函数不是一个三角形。你可能会在这里得到更准确的答案,关于这个问题似乎是离题的,因为它是关于信号处理的。对不起,我没有注意到有专门的SP站点。。SE网络变得越来越大。我想你们在这里看到的只是频谱泄漏(谷歌搜索)。真正的输入信号很少是完美的,你们只是不能产生无限的正弦波。你的余弦是有问题的,它在开始时有从0到最大值的尖峰,在结束时接近最大值回到0。这些快速转换会产生大量的三次谐波,就像方波一样,你可以在频谱中很好地看到它们。在0开始和结束时,效果会更好。需要一个函数来抑制伪影。