2013-09-04 20 views
22

Właśnie przeczytałem plik wav z scipy i teraz chcę zrobić działkę pliku za pomocą matplotlib, w "skale" chcę zobaczyć aplitude i ponad "skalę x "Chcę zobaczyć liczby klatek! Każda pomoc, jak mogę to zrobić? Dziękujemy!Jak wykreślić plik WAV

from scipy.io.wavfile import read 
import numpy as np 
from numpy import* 
import matplotlib.pyplot as plt 
a=read("C:/Users/Martinez/Desktop/impulso.wav") 
print a 
+0

co znaczy "wydrukować"? –

+0

Czy jest to pojedynczy lub wielokanałowy plik wav? –

+0

Wydruk a, po prostu pokaż krotkę z nieprzetworzonymi danymi pliku audio. I jest to mono wavfile. –

Odpowiedz

40

Możesz wywołać funkcję wave lib, aby odczytać plik audio.

Aby wykreślić przebieg, należy użyć funkcji „plot” z matplotlib

import matplotlib.pyplot as plt 
import numpy as np 
import wave 
import sys 


spf = wave.open('wavfile.wav','r') 

#Extract Raw Audio from Wav File 
signal = spf.readframes(-1) 
signal = np.fromstring(signal, 'Int16') 


#If Stereo 
if spf.getnchannels() == 2: 
    print 'Just mono files' 
    sys.exit(0) 

plt.figure(1) 
plt.title('Signal Wave...') 
plt.plot(signal) 
plt.show() 

trzeba będzie coś takiego: enter image description here

wykreślić oś x w sekundach trzeba uzyskać klatek i podziel przez rozmiar sygnału, możesz użyć funkcji przestrzeni numerowanej z numpy, aby utworzyć wektor czasu rozstawiony liniowo z rozmiarem pliku audio, a na końcu możesz ponownie użyć wykresu, jak plt.plot(Time,signal)

import matplotlib.pyplot as plt 
import numpy as np 
import wave 
import sys 


spf = wave.open('Animal_cut.wav','r') 

#Extract Raw Audio from Wav File 
signal = spf.readframes(-1) 
signal = np.fromstring(signal, 'Int16') 
fs = spf.getframerate() 

#If Stereo 
if spf.getnchannels() == 2: 
    print 'Just mono files' 
    sys.exit(0) 


Time=np.linspace(0, len(signal)/fs, num=len(signal)) 

plt.figure(1) 
plt.title('Signal Wave...') 
plt.plot(Time,signal) 
plt.show() 

Nowa fabuła oś x w sekundach:

enter image description here

+0

Ten "idealny człowiek, ale co jeśli chcę zobaczyć czas na osi X, w sekundach? Jak mogę to zrobić? –

+0

zobacz aktualizację! – ederwander

+0

Ederwander, z jakiegoś powodu nie wiem, kiedy wykreślam mój plik, po prostu pokazuje dane do tyłu! [Podaj opis obrazu tutaj] (http://i.stack.imgur.com/gAIIx.png): Mam skopiowałem to samo, co masz napisać! Wszelkie sugestie? –

15

Ewentualnie, jeśli chcesz używać scipy, można również wykonać następujące czynności:

from scipy.io.wavfile import read 
import matplotlib.pyplot as plt 

# read audio samples 
input_data = read("Sample.wav") 
audio = input_data[1] 
# plot the first 1024 samples 
plt.plot(audio[0:1024]) 
# label the axes 
plt.ylabel("Amplitude") 
plt.xlabel("Time") 
# set the title 
plt.title("Sample Wav") 
# display the plot 
plt.show() 
+0

Jakieś sugestie, jak edytować to w celu obsługi plików wav o 24-bitowej głębi? –

2

Oto wersja, która będzie również obsługiwać wejścia stereo, oparte na odpowiedź, @ederwander

import matplotlib.pyplot as plt 
import numpy as np 
import wave 

file = 'test.wav' 

with wave.open(file,'r') as wav_file: 
    #Extract Raw Audio from Wav File 
    signal = wav_file.readframes(-1) 
    signal = np.fromstring(signal, 'Int16') 

    #Split the data into channels 
    channels = [[] for channel in range(wav_file.getnchannels())] 
    for index, datum in enumerate(signal): 
     channels[index%len(channels)].append(datum) 

    #Get time from indices 
    fs = wav_file.getframerate() 
    Time=np.linspace(0, len(signal)/len(channels)/fs, num=len(signal)/len(channels)) 

    #Plot 
    plt.figure(1) 
    plt.title('Signal Wave...') 
    for channel in channels: 
     plt.plot(Time,channel) 
    plt.show() 

enter image description here

0

Po prostu obserwacja (nie mogę dodać komentarza).

Otrzymasz następujący mesage:

DeprecationWarning: kody typu liczbowego stylu są przestarzałe i resultin błędu w przyszłości.

Nie używaj np.fromstring w plikach binarnych. Zamiast signal = np.fromstring(signal, 'Int16') preferowane jest użycie signal = np.frombuffer(signal, dtype='int16').