如何将DFT输出缩放到0.0到1.0

时间:2019-05-17 17:56:14

标签: c fft fftw dft

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

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

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

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

关于fftw的大多数解释都涉及很多数学,这确实是我无法理解的。

1 个答案:

答案 0 :(得分:0)

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

DFT例程在处理缩放比例方面有所不同。有些将它们的输出规格化以保持小数位数不变,有些使算术运算增大小数位数,以实现更好的性能或实现便利。因此,可能的产出规模并不完全由数学决定;这取决于所使用的例程。该例程的文档应说明其使用的缩放比例。

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

(绘制时,请确保为浮点舍入效果留出一些余地-实际数字可能会略大于最大值,因此请避免在不需要的地方溢出或剪切。)