У меня есть несколько wav файлов. Я хотел бы использовать SciPy FFT для построения частотного спектра этих wav файлов. Как я могу это сделать?
Файлы wav для Python Scipy FFT
Ответ 1
Python
предоставляет несколько api, чтобы сделать это довольно быстро. Я загружаю wav файл sheep-bleats из эту ссылку. Вы можете сохранить его на рабочем столе и 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()
Вот график для входного сигнала:
Вот спектр
Для правильного вывода вам нужно будет преобразовать 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.wav
и test2.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 файлы не одного и того же.