from scipy.io import wavfile
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#开始针对这个将获取好的数据进行使用窗口和帧长进行分割
def enframe(x,win,inc):
nx = len(x) #获取整个音频的长度
if isinstance(win,list) or isinstance(win,np.ndarray):
nwin = len(win)
nlen = nwin #直接使用帧长就等于窗长
elif isinstance(win,int):
nwin = 1
nlen = win #设置帧长
if inc is None:
inc = nlen
nf = (nx - nlen +inc) // inc #获取在进行窗口移动和帧长所有可以分成的长度 个数
frameout = np.zeros((nf,nlen))#设置数组大小和长度 nf为可分开的长度,nlen时表示每段的长度
indf = np.multiply(inc,np.array([i for i in range(nf)]))
for i in range(nf):
frameout[i,:] = x[indf[i]:indf[i]+nlen]#开始对其中每一个数组进行赋值
if isinstance(win,list) or isinstance(win,np.ndarray):
frameout = np.multiply(frameout,np.array(win))
return frameout
if __name__ == "__main__":
fs,data = wavfile.read('C3_1_y.wav')#fs采样率,data 波形的数据
inc = 150#帧长
wlen = 200 #窗口
enf = enframe(data,wlen,inc)
i = input('起始帧的位置:')
i = int(i)
fram_index = i
#开始画三张图
plt.subplot(3,1,1)#参数说明 一共三行 只有一列 在第一行
x = [i for i in range((fram_index-1)*inc,(fram_index-1)*inc+wlen)]
plt.plot(x,enf[fram_index,])
#x就是标明该图形所绘制的位置
plt.xlim([(i-1)*inc+1,(i+2)*inc+wlen])
plt.title('当前波形的帧号位置:'.format(fram_index))
#第二张图开始绘制
plt.subplot(3,1,2)
x = [i for i in range((fram_index +1 -1)*inc,(fram_index +1-1)*inc+wlen)]
plt.plot(x,enf[fram_index+1,:])
plt.xlim([(i-1)*inc +1,(i+2 )*inc+wlen])
plt.title('当前波形的帧号位置'.format(fram_index+1))
#第三张图的开始绘制
plt.subplot(3,1,3)
x = [i for i in range((fram_index+2-1)*inc,(fram_index+2-1)*inc +wlen)]
plt.plot(x,enf[i+2,:])
plt.xlim([(i-1)*inc +1,(i+2)*inc + wlen])
plt.title('当前波形的帧号位置'.format(fram_index+2))
# 开始绘制
plt.show()
plt.savefig('images/en.png')
plt.close()
语音处理-加窗分帧
最新推荐文章于 2024-07-19 11:06:22 发布