import numpy as npfrom scipy.io import loadmat
from scipy.signal import lfilter, hamming
from scipy.fftpack import fft
from scipy.fftpack.realtransforms import dct
from scikits.talkbox import segment_axisfrom mel import hz2mel
def trfbank(fs, nfft, lowfreq, linsc, logsc, nlinfilt, nlogfilt):"""计算用于MFCC的三角滤波器."""nfilt = nlinfilt + nlogfiltfreqs = np.zeros(nfilt+2)freqs[:nlinfilt] = lowfreq + np.arange(nlinfilt) * linscfreqs[nlinfilt:] = freqs[nlinfilt-1] * logsc ** np.arange(1, nlogfilt + 3)heights = 2./(freqs[2:] - freqs[0:-2])fbank = np.zeros((nfilt, nfft))nfreqs = np.arange(nfft) / (1. * nfft) * fsfor i in range(nfilt):low = freqs[i]cen = freqs[i+1]hi = freqs[i+2]lid = np.arange(np.floor(low * nfft / fs) + 1,np.floor(cen * nfft / fs) + 1, dtype=np.int)lslope = heights[i] / (cen - low)rid = np.arange(np.floor(cen * nfft / fs) + 1,np.floor(hi * nfft / fs) + 1, dtype=np.int)rslope = heights[i] / (hi - cen)fbank[i][lid] = lslope * (nfreqs[lid] - low)fbank[i][rid] = rslope * (hi - nfreqs[rid])return fbank, freqsdef mfcc(input, nwin=256, nfft=512, fs=16000, nceps=13):"""计算Mel频率倒谱系数.参数----------输入: ndarray计算系数的输入返回-------ceps: ndarrayMel倒谱系数mspec: ndarraymel域中的对数谱。Notes-----
MFCC计算如下:*时域预处理(预强调)*用Hamming窗加窗计算频谱幅度*在谱域中用三角形滤波信号滤波器组,其滤波器在mel比例,并且在mel比例中具有相等的带宽 *计算对数谱的DCTReferences----------.. [1] S.B. Davis and P. Mermelstein, "Comparison of parametricrepresentations for monosyllabic word recognition in continuouslyspoken sentences", IEEE Trans. Acoustics. Speech, Signal Proc.ASSP-28 (4): 357-366, August 1980."""over = nwin - 160prefac = 0.97lowfreq = 133.33linsc = 200/3.logsc = 1.0711703nlinfil = 13nlogfil = 27nfil = nlinfil + nlogfilw = hamming(nwin, sym=0)fbank = trfbank(fs, nfft, lowfreq, linsc, logsc, nlinfil, nlogfil)[0]extract = preemp(input, prefac)framed = segment_axis(extract, nwin, over) * wspec = np.abs(fft(framed, nfft, axis=-1))mspec = np.log10(np.dot(spec, fbank.T))ceps = dct(mspec, type=2, norm='ortho', axis=-1)[:, :nceps]return ceps, mspec, specdef preemp(input, p):"""预加重滤波器."""return lfilter([1., -p], 1, input)if __name__ == '__main__':extract = loadmat('extract.mat')['extract']ceps = mfcc(extract)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!