语音处理-加窗分帧

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()

结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值