首页 > 解决方案 > 如何将 DFT 输出缩放到 0.0 到 1.0

问题描述

我正在尝试制作一个简单的音乐可视化应用程序,我知道我需要获取我的音频样本并执行快速傅立叶变换。我试图找出如何确定震级的大小,因此我可以将其标准化为 0.0 到 1.0 之间以用于绘图目的。

我的应用程序设置为允许读取 16 位和 24 位格式的音频,因此我将所有传入的音频样本缩放为 [-1.0,1.0),然后对 N 个样本使用实数到复数的一维变换。

从那里开始,我认为我需要在 0 和 N/2 之间取每个 bin(使用函数)的绝对值cabs,但我不确定这些数字真正代表什么或我应该用它们做什么。

我已经弄清楚如何计算每个箱的频率,我对以分贝为单位的实际幅度或幅度不感兴趣,我真的只想得到一个介于 0.0 和 1.0 之间的值。

大多数对 fftw 的解释都涉及到很多数学问题,老实说,这远远超出了我的想象。

标签: cfftfftwdft

解决方案


[根据评论,OP 试图知道在 [−1, 1] 中给定输入的任何输出箱的最大可能幅度。这个答案提供了一种确定方法。]

DFT 例程在处理缩放的方式上有所不同。一些标准化他们的输出以保持规模相同,一些让算术运算扩大规模以获得更好的性能或实现方便。所以输出的可能规模不仅仅由数学决定;这取决于使用的例程。例程的文档应该说明它使用什么缩放。

在没有明确文档的情况下,您可以通过将幅度为 1 的正弦波写入输入(以及与输出箱之一匹配的频率)来确定最大输出,然后执行变换,然后检查输出以查看哪个箱具有最大的幅度(当然,它应该是您使用的频率)。它可能是 1 或N(输入的数量),由于浮点舍入效应而有些倾斜。

(绘制时,请确保为浮点舍入效果留出一点余地——实际数字可能略大于最大值,因此请避免在您不希望出现的地方溢出或裁剪。)


推荐阅读