2014-04-30 255 views
24

我有一些WAV文件。我想用SciPy FFT來繪製這些wav文件的頻譜。我會如何去做這件事?Python Scipy FFT WAV文件

+9

嘗試使用Google搜索每一步(在數據中使用FFT讀取wav文件)。它不應該很難,如果你卡住了,回到這裏。 – MattG

回答

47

Python提供了幾個API來做到這一點很快。我從this link下載羊咩咩wav文件。您可以將其保存在桌面上,並在終端內保存在cd。在python提示這些線應該足夠:(省略>>>

import matplotlib.pyplot as plt 
from scipy.fftpack import fft 
from scipy.io import wavfile # get the api 
fs, data = wavfile.read('test.wav') # load the data 
a = data.T[0] # this is a two channel soundtrack, I get the first track 
b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1) 
c = fft(b) # calculate fourier transform (complex numbers list) 
d = len(c)/2 # you only need half of the fft list (real signal symmetry) 
plt.plot(abs(c[:(d-1)]),'r') 
plt.show() 

下面是輸入信號的曲線圖:
signal

這裏是光譜 spectrum

對於正確輸出,您必須將xlabel轉換爲頻譜圖的頻率。

k = arange(len(data)) 
T = len(data)/fs # where fs is the sampling frequency 
frqLabel = k/T 

如果你要處理一堆文件,就可以實現這個作爲一個功能: 把這些線路中的test2.py

import matplotlib.pyplot as plt 
from scipy.io import wavfile # get the api 
from scipy.fftpack import fft 
from pylab import * 

def f(filename): 
    fs, data = wavfile.read(filename) # load the data 
    a = data.T[0] # this is a two channel soundtrack, I get the first track 
    b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1) 
    c = fft(b) # create a list of complex number 
    d = len(c)/2 # you only need half of the fft list 
    plt.plot(abs(c[:(d-1)]),'r') 
    savefig(filename+'.png',bbox_inches='tight') 

說,我test.wavtest2.wav在當前工作目錄,在python提示界面下面的命令就足夠了: import test2 map(test2.f,['test.wav','test2.wav'])

假設你有100個這樣的文件,你不想單獨輸入他們的名字,你需要glob包:

import glob 
import test2 
files = glob.glob('./*.wav') 
for ele in files: 
    f(ele) 
quit() 

您將需要添加getparams在test2.f如果你的.wav文件不一樣的。

+3

很好的答案!您可能想要刪除'>>>',以便OP和其他人可以複製和粘貼。另外我發現如果你的代碼創建了一個情節,如果你添加了一張圖片,它會幫助你回答問題。 – Hooked

+0

謝謝。我已經更新線程,提示刪除和新圖片。 – Shenghui

+1

你將如何連接多個wav文件?我有很多小的wav文件。 – user1802143