Math.Net 和 alglib 默认返回不同的 FFT 输出

Math.Net and alglib returning different FFT outputs by default

我正在使用 C# 开发具有频谱图绘制功能的应用程序。

第一次尝试时,我使用了 MathNet.Numerics,现在我继续使用 alglib 进行开发。当我从一个更改为另一个时,我注意到它们的输出不同。 Mathnet 默认使用某种校正,而 alglib 似乎忽略了这种校正。我对信号处理不是很感兴趣,也是编程新手,我也搞不懂到底有什么区别。

在我的例子中,MathNet 默认输出(原始量级)值的范围从 ~0.1 到 ~274。 使用 alglib,我得到的值范围从 ~0.2 到 ~6220。

我发现 MathNet Fourier.Forward 使用默认缩放选项。这里说,FourierOptions.Default 是 "Universal; Symmetric scaling and common exponent (used in Maple)." https://numerics.mathdotnet.com/api/MathNet.Numerics.IntegralTransforms/FourierOptions.htm 如果我使用 FourierOptions.NoScaling,输出与 alglib 产生的相同。

在 MathNet 中,我使用了 Fourier.Forward 函数:https://numerics.mathdotnet.com/api/MathNet.Numerics.IntegralTransforms/Fourier.htm#Forward 对于 alglib,我使用了 fftr1d 函数:https://www.alglib.net/translator/man/manual.csharp.html#sub_fftr1d

请分享您的知识。提前致谢!

在阅读了一堆提到 FFT 输出缩放的不同方法的帖子后,我自己解决了这个问题。我仍然发现 FFT 处理的这一方面到处都没有大量记录。我还没有找到任何可靠的来源来解释这些比例的用途,哪些科学领域或哪些处理方法使用它们。

关于原始 FFT 输出(复合波的幅度),我还发现了三种不同的缩放比例。这意味着将它们乘以: 1. 1/numSamples 2. 2/numSamples 3. 1/sqrt(numSamples) 4.(无缩放)

MathNet.IntegralTransforms.Fourier.Forward 函数(根据网上的各种帖子,也可能是 Matlab 和 Maple)默认使用第三个。在我看来,这会在使用对数着色时产生更好区分的图形输出。

如果你知道一些事情并分享你的想法,或者如果你能参考一篇解释这些的好论文,我仍然会很感激。