# -*- coding: utf-8 -*-
# 讀Wave文件并且繪制波形
import wave
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來(lái)正常顯示符號(hào)
# 打開(kāi)WAV音頻
f = wave.open(r"01.wav", "rb")
# 讀取格式信息
# (聲道數(shù)、量化位數(shù)、采樣頻率、采樣點(diǎn)數(shù)、壓縮類(lèi)型、壓縮類(lèi)型的描述)
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# nchannels通道數(shù) = 2
# sampwidth量化位數(shù) = 2
# framerate采樣頻率 = 22050
# nframes采樣點(diǎn)數(shù) = 53395
# 讀取nframes個(gè)數(shù)據(jù),返回字符串格式
str_data = f.readframes(nframes)
f.close()
# 將字符串轉(zhuǎn)換為數(shù)組,得到一維的short類(lèi)型的數(shù)組
wave_data = np.fromstring(str_data, dtype=np.short)
# 賦值的歸一化
wave_data = wave_data * 1.0 / (max(abs(wave_data)))
# 整合左聲道和右聲道的數(shù)據(jù)
wave_data = np.reshape(wave_data, [nframes, nchannels])
# wave_data.shape = (-1, 2) # -1的意思就是沒(méi)有指定,根據(jù)另一個(gè)維度的數(shù)量進(jìn)行分割
# 最后通過(guò)采樣點(diǎn)數(shù)和取樣頻率計(jì)算出每個(gè)取樣的時(shí)間
time = np.arange(0, nframes) * (1.0 / framerate)
plt.figure()
# 左聲道波形
plt.subplot(2, 1, 1)
plt.plot(time, wave_data[:, 0])
plt.xlabel("時(shí)間/s",fontsize=14)
plt.ylabel("幅度",fontsize=14)
plt.title("左聲道",fontsize=14)
plt.grid() # 標(biāo)尺
plt.subplot(2, 1, 2)
# 右聲道波形
plt.plot(time, wave_data[:, 1], c="g")
plt.xlabel("時(shí)間/s",fontsize=14)
plt.ylabel("幅度",fontsize=14)
plt.title("右聲道",fontsize=14)
plt.tight_layout() # 緊密布局
plt.show()
# 讀取通道數(shù)為2的音頻信號(hào)