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)
新聞熱點
疑難解答