在 Javascript 中使用 FFT 计算音频文件的平均振幅

Calculating The Average Amplitude of an Audio File Using FFT in Javascript

我目前正在参与一个项目,我想在这个项目中找到任何给定 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,然后进行计算。

你真的不需要为此使用 FFT - Parseval's theorem essentially means that energy in the time domain is equal to energy in the frequency domain, so the FFT part is redundant - you can just calculate amplitude in the time domain. Typically this is done by calculating the RMS value 在选定时间 window 内的信号(这个时间的长度 window 取决于你正在努力实现)。