【问题标题】:How to scale DFT output to 0.0 through 1.0如何将 DFT 输出缩放到 0.0 到 1.0
【发布时间】:2019-05-17 17:56:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您已将样本缩放到 [-1.0, 1.0] 范围,因此现在将其范围设置为 [0.0, 1.0] 您添加 1.0 并将其减半。
  • 问题标题听起来具有误导性,问题表明您要缩放 FFT 输出。将 cabs() 值存储在一个数组中,找到最大值并将所有数组元素除以该最大值。
  • 如果您知道 bin 频率,您可以生成样本输入,它是一个 bin 频率的正弦波,或两个不同 bin 频率的 2 个正弦波的混合。然后您可以使用幅度,看看 FFT 的结果。 FFT 通常是线性的,即改变输入幅度会以相同的比例改变输出幅度。
  • @WeatherVane:[-1, 1] 比例在转换之前。 DFT 通常按 N 缩放数据。此外,[-1, 1] 比例可能是从传感器数据的最大值到 1 的映射。实际音频的最大值通常会更小。此外,转换的输出是一个复数序列,因此它们需要用于绘图的数据不在任何实数区间内。
  • @EricPostpischil 我现在看到 OP 说“试图找出如何确定震级的大小”所以是的,这不是 实际 范围。跨度>

标签: c fft fftw dft


【解决方案1】:

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

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

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

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

【讨论】:

  • 使用余弦信号效果更好,因为与纯虚数相比,您将从 DFT 获得实数输出(它是零附近的对称信号)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2012-11-26
  • 2015-09-26
  • 2013-02-15
相关资源
最近更新 更多