Die*_*ini 43 python audio matplotlib
我刚刚读了一个带scipy的wav文件,现在我想用matplotlib制作文件的图,在"y scale"上我希望看到aplitude和"x scale"我想看到帧的数量!任何帮助我该怎么办?谢谢!
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
Run Code Online (Sandbox Code Playgroud)
ede*_*der 64
您可以调用wave lib来读取音频文件.
要绘制波形,请使用matplotlib中的"plot"功能
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()
Run Code Online (Sandbox Code Playgroud)
你会有类似的东西:
要以秒为单位绘制x轴,你需要获得帧率并除以信号的大小,你可以使用numpy的linspace函数来创建一个与音频文件大小线性间隔的时间向量,最后你可以再次使用plot喜欢 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()
Run Code Online (Sandbox Code Playgroud)
以秒为单位的新绘图x轴:

小智 21
或者,如果您想使用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()
Run Code Online (Sandbox Code Playgroud)
Alt*_*ter 13
这是一个版本,它也将处理立体声输入,基于@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()
Run Code Online (Sandbox Code Playgroud)
Edu*_*tas 12
只是一个观察(我不能添加评论)。
您将收到以下消息:
弃用警告:不推荐使用数字样式的类型代码,将来会导致错误。
不要将 np.fromstring 与二进制文件一起使用。而不是 signal = np.fromstring(signal, 'Int16'),最好使用 signal = np.frombuffer(signal, dtype='int16')。
小智 12
这是绘制波形文件的波形和频谱的代码
import wave
import numpy as np
import matplotlib.pyplot as plt
signal_wave = wave.open('voice.wav', 'r')
sample_rate = 16000
sig = np.frombuffer(signal_wave.readframes(sample_rate), dtype=np.int16)
Run Code Online (Sandbox Code Playgroud)
对于整个波形文件段
sig = sig[:]
Run Code Online (Sandbox Code Playgroud)
对于波形文件的部分片段
sig = sig[25000:32000]
Run Code Online (Sandbox Code Playgroud)
分离立体声通道
left, right = data[0::2], data[1::2]
Run Code Online (Sandbox Code Playgroud)
绘制波形 (plot_a) 和频谱 (plot_b)
plt.figure(1)
plot_a = plt.subplot(211)
plot_a.plot(sig)
plot_a.set_xlabel('sample rate * time')
plot_a.set_ylabel('energy')
plot_b = plt.subplot(212)
plot_b.specgram(sig, NFFT=1024, Fs=sample_rate, noverlap=900)
plot_b.set_xlabel('Time')
plot_b.set_ylabel('Frequency')
plt.show()
Run Code Online (Sandbox Code Playgroud)
这是处理单声道/立体声和 8 位/16 位 PCM 的版本。
import matplotlib.pyplot as plt
import numpy as np
import wave
file = 'test.wav'
wav_file = wave.open(file,'r')
#Extract Raw Audio from Wav File
signal = wav_file.readframes(-1)
if wav_file.getsampwidth() == 1:
signal = np.array(np.frombuffer(signal, dtype='UInt8')-128, dtype='Int8')
elif wav_file.getsampwidth() == 2:
signal = np.frombuffer(signal, dtype='Int16')
else:
raise RuntimeError("Unsupported sample width")
# http://schlameel.com/2017/06/09/interleaving-and-de-interleaving-data-with-python/
deinterleaved = [signal[idx::wav_file.getnchannels()] for idx in range(wav_file.getnchannels())]
#Get time from indices
fs = wav_file.getframerate()
Time=np.linspace(0, len(signal)/wav_file.getnchannels()/fs, num=len(signal)/wav_file.getnchannels())
#Plot
plt.figure(1)
plt.title('Signal Wave...')
for channel in deinterleaved:
plt.plot(Time,channel)
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65740 次 |
| 最近记录: |