【问题标题】:Calculating The Average Amplitude of an Audio File Using FFT in Javascript在 Javascript 中使用 FFT 计算音频文件的平均幅度
【发布时间】:2016-01-22 00:36:57
【问题描述】:

我目前正在参与一个项目,我想在给定的 AAC 文件中找到给定音频数据的平均幅度。我目前正在将文件作为数组缓冲区读取并传递给 Uint8Array。

var dataArray = new Uint8Array(buffer)

然后我设置了两个数组,一个实数(包含音频数据)和一个虚数(包含全零),并将它们传递给 FFT。然后将音频数据放入一个新数组中,使数组中的数字不再被视为无符号 8 位整数。

var realArray = [audio data here]
var imagArray = [0,0,0,0,0,0,...]
transform(realArray, imagArray)

然后我遍历数组,从 0 循环到 N/2,其中 N 是包含原始音频数据的初始缓冲区的大小,并计算每个频率区间的幅度。最后,我将这些大小的总和除以 N/2。

问题在于,在某些情况下,对于以较低强度播放的音频,与以较高强度播放的音频给出的值相比,我得到的值更高。我的方法在实现我的目标方面是否正确,还是有更好的方法来实现它?谢谢。

注意:对于那些对正在使用的 FFT 感兴趣的人,可以在这里找到多种语言的版本。 FFT 我将音频文件的中间 2^20 字节传递到 FFT 中,然后进行计算。

【问题讨论】:

  • dataArray是直接读取AAC数据还是先解码成PCM?
  • 直接读取。我不知道 PCM 是什么。
  • 我认为 jaket 的重点是需要对 AAC 文件数据进行解压缩/解码以获得实际的音频样本值 (PCM) - 你不能只使用原始的您从文件中读取的字节数。
  • 哦,好的。我假设我可以只使用原始字节。感谢您的洞察力。
  • 所以我正在解码音频数据,然后将解码后的音频分成两个通道。在获得单独的通道数据后,我对如何找到平均幅度感到困惑。

标签: javascript audio signal-processing fft


【解决方案1】:

你真的不需要为此使用 FFT - Parseval's theorem 本质上意味着时域中的能量等于频域中的能量,因此 FFT 部分是多余的 - 你可以只计算幅度时域。通常这是通过在选定的时间窗口内计算信号的RMS value 来完成的(此时间窗口的长度取决于您要达到的目标)。

【讨论】:

  • 感谢您的回答。我会这样实现。
猜你喜欢
  • 2013-07-08
  • 2020-07-23
  • 1970-01-01
  • 2014-12-21
  • 2011-08-12
  • 2018-08-17
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多