c# - 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
- 他们的计算有什么区别?
- 我可以使用什么函数将 alglib 输出幅度转换为 MathNet 的输出幅度,反之亦然?
- 在什么情况下我应该使用这些不同的“比例”?它们究竟是为了什么?
请分享你的知识。提前致谢!
解决方案
在阅读了一堆提到 FFT 输出缩放的不同方法的帖子后,我自己解决了这个问题。我仍然发现 FFT 处理的这一方面在任何地方都没有大量记录。我还没有找到任何可靠的来源来解释这些比例的用途、哪些科学领域或哪些处理方法使用它们。
关于原始 FFT 输出(复合体的幅度),我还没有发现三种不同的缩放比例。这意味着将它们乘以:1. 1/numSamples 2. 2/numSamples 3. 1/sqrt(numSamples) 4. (无缩放)
MathNet.IntegralTransforms.Fourier.Forward 函数(根据网上的各种帖子,也可能是 Matlab 和 Maple)默认使用第三个。在我看来,这会在使用对数着色时产生更好的可区分图形输出。
如果您知道一些事情并分享您的想法,或者您可以参考一篇解释这些内容的好论文,我仍然会很感激。
推荐阅读
- javascript - 我应该在 try-catch 块中编写所有路由处理代码吗?
- websocket - Tomcat 8.5.63 + Primefaces 4.0 + Atmosphere 2.1:响应代码 200 而不是 101
- css - CSS:粘性、弹性和溢出
- c - 为什么集群上的 GCC 不加载 FFTW 库?
- docker - 如何使用 GitHub Actions 实现多阶段 Docker 构建?
- android - 在 android 应用程序中,如何在运行时加载 3d 动画以实现增强现实?
- javascript - 无法控制台记录我的方法插入 DOM 的 HTML
- node.js - 集合之间的 .populate() 连接没有出现
- swiftui - SwiftUI DragGesture 阻止列表垂直滚动?
- kubernetes - 可以在 secretKeyRef 的名称中使用 OpenShift 模板环境变量吗?