2014-04-30 11 views
24

Mam kilka plików WAV. Chciałbym użyć SciPy FFT do wykreślenia spektrum częstotliwości tych plików WAV. Jak miałbym to zrobić?Python Scipy FFT wav files

+9

Spróbuj przejść do każdego kroku (odczyt w pliku WAV, używając FFT na danych). To nie powinno być wcale trudne, wróć tutaj, jeśli utkniesz. – MattG

Odpowiedz

47

Python zawiera kilka api do robienia tego dość szybko. Pobieram plik wav o bleszczach z this link. Możesz zapisać go na pulpicie i tam w terminalu. Te linie na wiersz python powinna być na tyle (pominąć >>>)

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() 

tutaj wykres dla sygnału wejściowego:
signal

Oto widmo spectrum

Dla prawidłowego wyjście, będziesz musiał przekonwertować xlabel na częstotliwość dla wykresu spektrum.

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

Jeśli mamy do czynienia z wieloma plikami, można zaimplementować to jako funkcję: umieścić te linie w 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 mam test.wav i test2.wav w bieżący działający katalog, wystarczy następujące polecenie w interfejsie zachęty python: test importu2 mapa (test2.f, ['test.wav', 'test2.wav'])

Zakładając masz 100 takich plików i nie chcesz ich nazwiska wpisywać indywidualnie, trzeba pakiet glob:

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

Trzeba będzie dodać getparams w test2.f jeśli pliki .wav są nie tego samego.

+3

Dobra odpowiedź! Możesz usunąć '>>>', aby OP i inni mogli kopiować i wklejać. Również znalazłem, że pomaga odpowiedź, jeśli umieścisz zdjęcie, jeśli twój kod tworzy fabułę. – Hooked

+0

Dzięki. Mam aktualizację wątku z monitem usunięty i nowe zdjęcia. – Shenghui

+1

Jak można połączyć wiele plików WAV? Mam dużo małych plików WAV. – user1802143