【发布时间】: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 说“试图找出如何确定震级的大小”所以是的,这不是 实际 范围。跨度>