2014-04-30 3 views
24

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

+9

Попробуйте выполнить поиск по каждому шагу (чтение в wav-файле с использованием FFT по данным). Это не должно быть тяжело, вернитесь сюда, если вы застрянете. – MattG

ответ

47

Python предлагает несколько апи, чтобы сделать это довольно быстро. Я загружаю wav-файл с овчинами с this link. Вы можете сохранить его на рабочем столе и 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') 

Say, я 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 файлы а не одного и того же бита.

+3

Хороший ответ! Вы можете удалить '>>>', чтобы OP и другие могли копировать и вставлять. Также я нашел, что это помогает ответить, если вы включаете изображение, если ваш код создает сюжет. – Hooked

+0

Спасибо. У меня есть обновление потока с удаленным приглашением и новыми изображениями. – Shenghui

+1

Как бы вы объединили несколько wav-файлов? У меня много маленьких wav-файлов. – user1802143

Смежные вопросы