2013-09-04 59 views
22

Tôi vừa đọc một tệp wav có scipy và bây giờ tôi muốn tạo cốt truyện của tệp bằng matplotlib, trên thang tỷ lệ "y", tôi muốn xem độ lớn và trên thang "x "Tôi muốn xem số lượng khung hình! Bất kỳ trợ giúp nào tôi có thể thực hiện việc này ?? Cảm ơn bạn!Cách vẽ một tệp 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

in 'đầu ra 'là gì? –

+0

Đây có phải là tệp wavfile đơn hoặc đa kênh không? –

+0

Bản in a, chỉ hiển thị một bộ dữ liệu với dữ liệu thô của tệp âm thanh. Và nó là một wavfile đơn. –

Trả lời

40

Bạn có thể gọi wave lib để đọc tệp âm thanh.

Để vẽ dạng sóng, sử dụng "âm mưu" chức năng từ 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() 

bạn sẽ có một cái gì đó như: enter image description here

Để Vẽ trục x trong vài giây bạn cần có được tỷ lệ khung hình và chia cho kích thước của tín hiệu của bạn, bạn có thể sử dụng hàm linspace từ numpy để tạo ra một khoảng thời gian Vector cách đều với kích thước của tệp âm thanh và cuối cùng bạn có thể sử dụng lại âm mưu như 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() 

mới âm mưu trục x trong vài giây:

enter image description here

+0

Đó là 'người đàn ông hoàn hảo, nhưng nếu tôi muốn xem thời gian trên trục x, tính bằng giây? Làm cách nào để tôi có thể làm được điều đó? –

+0

xem cập nhật! – ederwander

+0

Ederwander, vì một lý do nào đó tôi không biết khi nào tôi vẽ tệp của mình, nó chỉ hiển thị dữ liệu ngược! [Nhập mô tả hình ảnh tại đây] (http://i.stack.imgur.com/gAIIx.png): Tôi có sao chép giống như bạn đã viết! Bất kỳ đề xuất nào? –

15

Ngoài ra, nếu bạn muốn sử dụng scipy, bạn cũng có thể làm như sau:

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

Bất kỳ đề xuất nào về cách chỉnh sửa này để xử lý các tệp wav sâu 24 bit? –

2

Dưới đây là một phiên bản đó cũng sẽ xử lý đầu vào âm thanh nổi, dựa trên câu trả lời của @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

Chỉ cần quan sát (Tôi không thể thêm nhận xét).

Bạn sẽ nhận được mesage sau:

DeprecationWarning: mã kiểu Numeric kiểu đang bị phản đối và sẽ resultin một lỗi trong tương lai.

Không sử dụng np.fromstring với nhị phân. Thay vì signal = np.fromstring(signal, 'Int16'), bạn nên sử dụng signal = np.frombuffer(signal, dtype='int16').

Các vấn đề liên quan