首页 > 解决方案 > Math.Net 和 alglib 默认返回不同的 FFT 输出

问题描述

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

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

在我的情况下,MathNet 默认输出(原始幅度)值范围从 ~0.1 到 ~274。使用 alglib,我得到的值范围从 ~0.2 到 ~6220。

我发现 MathNet Fourier.Forward 使用默认缩放选项。这里说,FourierOptions.Default 是“通用;对称缩放和共同指数(在 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

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

标签: c#fftspectrogramalglib

解决方案


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

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

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

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


推荐阅读