Подтвердить что ты не робот

Файлы wav для Python Scipy FFT

У меня есть несколько wav файлов. Я хотел бы использовать SciPy FFT для построения частотного спектра этих wav файлов. Как я могу это сделать?

4b9b3361

Ответ 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()

Вот график для входного сигнала:
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.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 файлы не одного и того же.