2013-09-04 4 views
22

Я только что прочитал wav-файл с scipy, и теперь я хочу сделать график файла с помощью matplotlib, в шкале «y» я хочу увидеть амплитуду и по шкале «x» «Я хочу увидеть количество кадров! Любая помощь, как я могу это сделать ?? Спасибо!Как построить 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

Что делает 'print a' выход? –

+0

Это один или многоканальный wavfile? –

+0

Напечатайте a, просто покажите кортеж с необработанными данными аудиофайла. И это моно-wavfile. –

ответ

40

Вы можете вызвать wave lib для чтения аудиофайла.

Для построения сигнала, используйте функцию «участок» от 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() 

вы будете иметь что-то вроде: enter image description here

Для построения оси х в секундах вам нужно получить частоту кадров и разделите по размеру вашего сигнала, вы можете использовать функцию linspace из numpy, чтобы создать временной вектор, линейно распределенный с размером аудиофайла, и, наконец, вы можете использовать график снова, как 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() 

Новый участок оси х в секундах:

enter image description here

+0

Это идеальный человек, но что, если я хочу видеть время по оси х, в секундах? Как это сделать? –

+0

посмотреть обновление! – ederwander

+0

Ederwander, по какой-то причине я не знаю, когда я создаю свой файл, он просто показывает данные назад! [Введите описание изображения здесь] (http://i.stack.imgur.com/gAIIx.png): У меня есть скопировал то же самое, что и вы пишете! Любое предложение? –

15

В качестве альтернативы, если вы хотите использовать SciPy, вы можете сделать следующее:

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

Любые предложения по тому, как отредактировать это, чтобы обрабатывать 24-битные глубинные wav-файлы? –

2

Вот версия, которая также будет обрабатывать стерео входов, на основе ответа на @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

Просто наблюдение (я не могу добавить комментарий).

Вы получите следующее электронное письмо:

DeprecationWarning: коды типа Числовой стиле являются устаревшим и resultin ошибки в будущем.

Не используйте np.fromstring с двоичными файлами. Вместо signal = np.fromstring(signal, 'Int16'), предпочтительнее использовать signal = np.frombuffer(signal, dtype='int16').

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