MELP算法中首先需要将一帧语音数据通过一个60Hz的低通四阶切比雪夫二型滤波器,以去除低频干扰信号。预处理结束之后需要将数据通过一个1kHz的六阶巴特沃夫滤波器以便进行下一步的基音提取操作。
这里我们可以从C源码中找到滤波器系数,所以直接利用scipy中的signal生成,将两个滤波器的代码整理如下:
#coding=utf-8__author__ = 'cao'####该模块保存常用的滤波器,包括预处理的隔直流滤波器####1kHz的高通滤波器,以及分带的滤波器import scipy.signal as signalimport numpy as np##dc隔直流滤波器的系数DC_ORD = 4##低通滤波器的系数LPF_ORD=6###隔直流滤波器的滤波器系数dc_den = np.array([1.00000000, -3.84610723, 5.55209760, -3.56516069, 0.85918839])dc_num =np.array([0.92692416, -3.70563834, 5.55742893, -3.70563834, 0.92692416])####低通滤波器系数lpd_den = np.array([1.00000000, -2.97852993, 4.13608100, -3.25976428, 1.51727884, -0.39111723, 0.04335699])lpd_num = np.array([0.00105165, 0.00630988, 0.01577470, 0.02103294, 0.01577470, 0.00630988, 0.00105165])# def polflt(input,coeff,output,order,npts):# for i in range(npts):# accum = input[i]# for j in range(1,order+1):# accum = output[i-j]*#本函数提供一个高通滤波器,去除60hz以下的频率def DC_rov(data): return signal.lfilter(dc_num,dc_den,data)#本函数提供一个低通滤波器,滤出1kHz以上的频率def lpd(data): return signal.lfilter(lpd_num,lpd_den,data)
新闻热点
疑难解答