2011-08-07 9 views
6

Oto, co chciałbym zrobić. Chciałbym znaleźć częstotliwość i amplitudę pliku .wav na każde 1ms tego pliku .wav i zapisać go w pliku. Zmieniłem częstotliwość względem amplitudy i z czasem wykreśliłem amplitudę, ale nie potrafię określić częstotliwości nadgodzin. Moim celem końcowym jest umożliwienie odczytania pliku i wykorzystanie ich amplitudy do dostosowania zmiennych i częstotliwości, aby wyzwolić używane zmienne, co wydaje się być łatwą częścią. Używam numpy, audiolab, matplotlib, etc ... używając FFT, ale po prostu nie mogę tego wymyślić, każda pomoc jest doceniana! Dziękuję Ci!Python znajduje częstotliwość audio i amplitudę w czasie.

+2

Plik dźwiękowy nie posiada tylko jedną „Częstotliwość” w dowolnym momencie, o ile jest to tylko zapis czystym sinusoidalnym sygnale. Najprawdopodobniej musisz uchwycić * widmo mocy * w regularnych odstępach czasu i zapisać to, lub ewentualnie dokonać jakiegoś przetwarzania na widmie mocy, takim jak identyfikacja największych N szczytów i zapisanie ich. –

+0

http://stackoverflow.com/questions/604453/analyze-audio-using-fast-fourier-transform – sylvanaar

Odpowiedz

7

Użyj STFT z zachodzącymi na siebie oknami do oszacowania spektrogramu. Aby zaoszczędzić sobie kłopotów z toczeniem się, możesz użyć pliku mbl "Matplotlib" (specgram method). Ważne jest, aby użyć wystarczająco małego okienka, w którym dźwięk jest w przybliżeniu nieruchomy, a rozmiar bufora powinien wynosić 2, aby efektywnie używać wspólnego radix-2 fft. Powinno wystarczyć 512 próbek (około 10,67 ms przy 48 ksps lub 93,75 Hz na bin). Dla częstotliwości próbkowania 48 ksps nakładają się 464 próbki w celu oceny okna przesuwnego co 1 ms (to jest przesunięcie o 48 próbek).

Edycja:

Poniżej przedstawiono przykład, w którym wykorzystuje mlab.specgram na sygnał 8-sekundowym, który ma 1 tony na sekundę od 2 kHz do 16 kHz. Zanotuj odpowiedź na przejściach. Po 4 sekundach powiększałem, pokazując odpowiedź bardziej szczegółowo. Częstotliwość przesuwa się dokładnie o 4 sekundy, ale zajmuje długość bufora (512 próbek, około +/- 5 ms), aby przejściowy mógł przejść. To ilustruje rodzaj rozmycia widmowego/czasowego spowodowanego przez niestacjonarne przejścia podczas przechodzenia przez bufor. Dodatkowo można zauważyć, że nawet gdy sygnał jest nieruchomy, pojawia się problem przecieku spektralnego spowodowany przez okienkowanie danych. Hamming window function został użyty do zminimalizowania bocznych płatków przecieku, ale to również rozszerza główny płat.

spectrogram

import numpy as np 
from matplotlib import mlab, pyplot 

#Python 2.x: 
#from __future__ import division 

Fs = 48000 
N = 512 
f = np.arange(1, 9) * 2000 
t = np.arange(8 * Fs)/Fs 
x = np.empty(t.shape) 
for i in range(8): 
    x[i*Fs:(i+1)*Fs] = np.cos(2*np.pi * f[i] * t[i*Fs:(i+1)*Fs]) 

w = np.hamming(N) 
ov = N - Fs // 1000 # e.g. 512 - 48000 // 1000 == 464 
Pxx, freqs, bins = mlab.specgram(x, NFFT=N, Fs=Fs, window=w, 
           noverlap=ov) 

#plot the spectrogram in dB 

Pxx_dB = np.log10(Pxx) 
pyplot.subplots_adjust(hspace=0.4) 

pyplot.subplot(211) 
ex1 = bins[0], bins[-1], freqs[0], freqs[-1] 
pyplot.imshow(np.flipud(Pxx_dB), extent=ex1) 
pyplot.axis('auto') 
pyplot.axis(ex1) 
pyplot.xlabel('time (s)') 
pyplot.ylabel('freq (Hz)') 

#zoom in at t=4s to show transient 

pyplot.subplot(212) 
n1, n2 = int(3.991/8*len(bins)), int(4.009/8*len(bins)) 
ex2 = bins[n1], bins[n2], freqs[0], freqs[-1] 
pyplot.imshow(np.flipud(Pxx_dB[:,n1:n2]), extent=ex2) 
pyplot.axis('auto') 
pyplot.axis(ex2) 
pyplot.xlabel('time (s)') 
pyplot.ylabel('freq (Hz)') 

pyplot.show() 
Powiązane problemy