2016-01-22 99 views
0

我目前參與了一個項目,在該項目中我想要查找任何給定AAC文件中給定音頻數據的平均振幅。我目前正在讀取文件作爲數組緩衝區並傳遞到Uint8Array。在JavaScript中使用FFT計算音頻文件的平均振幅

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,然後進行我的計算。

+0

'dataArray'是直接讀取AAC數據還是先解碼爲PCM? – jaket

+0

直接閱讀。我不知道PCM是什麼。 – LOtus

+0

我認爲jaket的重點在於[AAC](https://en.wikipedia.org/wiki/Advanced_Audio_Coding)文件數據需要解壓縮/解碼以獲取實際的音頻採樣值([PCM](https) ://en.wikipedia.org/wiki/Pulse-code_modulation)) - 你不能只使用你從文件中讀取的原始字節。 –

回答

4

對此真的不需要使用FFT - Parseval's theorem實質上意味着時域中的能量等於頻域中的能量,所以FFT部分是冗餘的 - 您可以在時間內計算幅度域。通常情況下,這是通過在選定時間窗口內計算信號的RMS value來完成的(此時間窗口的長度取決於您要實現的目標)。

+0

感謝您的回答。我會用這種方式來實現它。 – LOtus