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

在Javascript中使用FFT计算音频文件的平均振幅,javascript,audio,signal-processing,fft,Javascript,Audio,Signal Processing,Fft,我目前参与了一个项目,我想找到任何给定AAC文件中给定音频数据的平均振幅。我当前正在将文件作为数组缓冲区读取,并将其传递到Uint8Array var dataArray = new Uint8Array(buffer) 然后我设置了两个数组,一个实数(包含音频数据)和一个虚数(包含所有零),并将它们传递到FFT中。然后将音频数据放入一个新数组中,使数组中的数字不再被视为无符号8位整数 var realArray = [audio data here] var imagArray = [0,0

我目前参与了一个项目,我想找到任何给定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。
我将音频文件中间的2^20字节传递到FFT中,然后进行计算

你真的不需要使用FFT,这基本上意味着时域中的能量等于频域中的能量,因此FFT部分是冗余的,你可以在时域中计算振幅。通常情况下,这是通过计算选定时间窗口内信号的频率来完成的(此时间窗口的长度取决于您试图实现的目标)。

您确实不需要为此使用FFT-本质上意味着时域中的能量等于频域中的能量,所以FFT部分是多余的-你可以在时域中计算振幅。通常,这是通过计算选定时间窗口内信号的长度来完成的(此时间窗口的长度取决于您试图实现的目标)。

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