2012-11-17 69 views
2

我碰到這個代碼片段的程序,它的音頻數據的實時FFT圖來:理解FFT運算片斷

data=scipy.array(struct.unpack("%dB"%(bufferSize*2),data)) 
ffty=scipy.fftpack.fft(data) 
ffty=abs(ffty[0:len(ffty)/2])/1000 
ffty1=ffty[:len(ffty)/2] 
ffty2=ffty[len(ffty)/2::]+2     
ffty2=ffty2[::-1]     
ffty=ffty1+ffty2        
ffty=scipy.log(ffty)-2 

我聽不懂的部分背後的數學的abs()後。它做了一些事情,比如增加幅度數組的前半部分,後半部分相反,並添加2。

這是一種正常化嗎?

這是源:

http://www.swharden.com/blog/2010-03-05-realtime-fft-graph-of-audio-wav-file-or-microphone-input-with-python-scipy-and-wckgraph/

回答

3

我不知道Python,但看起來它只是增加了實數到複數FFT輸出的兩個鏡像複共軛一半的大小。你可以很容易地只取前半部分的數值並乘以2.

最後它計算對數幅度,可能是得到(縮放的)dB值。

+0

謝謝。任何想法爲什麼'log(ffty) - 2'完成? –

+0

那麼日誌可以讓你縮放dB幅度,但由於dB值是任意的,沒有某種類型的0 dB基準,所以我猜-2只是達到繪圖/顯示所需的範圍。 –

+0

有道理 - 謝謝。 –

-1

我的猜測是,音頻聲音是立體聲文件格式,這就是在左/右運河平均。我這樣說是因爲這條線:fftx=fftx[0:len(fftx)/4]這是使用立體聲信號時的常見操作。

但是我不知道爲什麼運河會養。