MFCC程序参数详解

本文程序来源于宋知用老师编著的《MATLAB在语音信号分析与合成中的应用》

function ccc=mfcc_m(x,fs,p,frameSize,inc)
% % % % % % % % % % % % % % % % % % % % % % % % % % % %
% function ccc=mfcc_m(x);
%对输入的语音序列x进行MFCC参数的提取,返回MFCC参数和一阶
%差分MFCC参数,Mel滤波器的个数为p,采样频率为fs
%对x每frameSize点分为一帧,相邻两帧之间的帧移为inc
% FFT的长度为帧长
% % % % % % % % % % % % % % % % % % % % % % % % % % % %

% 按帧长为frameSize,Mel滤波器的个数为p,采样频率为fs
% 提取Mel滤波器参数,用汉明窗函数
bank=melbankm(p,frameSize,fs,0,0.5,’m’);
% 归一化Mel滤波器组系数
bank=full(bank);
bank=bank/max(bank(:));
%——————————————————————————————————-
%MATLAB中对稀疏矩阵的存储有两种方法:一是八所有的元素都存储;另一种是只储存非0元素。函数full将稀疏矩阵转化为全矩阵,把矩阵中所有的元素都存储,方便以后运算。
%输出参数bank是滤波器的频率响应,是一个p *(n/2+1)维的矩阵
%——————————————————————————————————-

% DCT系数,12*p
for k=1:12
n=0:p-1;
dctcoef(k,:)=cos((2*n+1)*k*pi/(2*p));
end
%——————————————————————————————————-
%这里的循环次数12是选的MFCC参数的个数,通常取12个,一般在12~16个之间
%dctcoef是一个12*p维的矩阵
%——————————————————————————————————-

% 归一化倒谱提升窗口
w = 1 + 6 * sin(pi * [1:12] ./ 12);
w = w/max(w);
%——————————————————————————————————-
%这个,感觉宋老师在MATLAB中文论坛中也没有讲的很清楚:LZ给出的表达式就是窗函数的表达式,其目的是对MFCC系数中某些谱线增强。
%也可能是我知识不足,没理解透,望有理解的朋友解惑
%——————————————————————————————————-

% 预加重滤波器
xx=double(x);
xx=filter([1 -0.9375],1,xx);

% 语音信号分帧
xx=enframe(xx,frameSize,inc);
n2=fix(frameSize/2)+1;
% 计算每帧的MFCC参数
for i=1:size(xx,1)
y = xx(i,:);
s = y’ .* hamming(frameSize);
t = abs(fft(s));
t = t.^2;
c1=dctcoef * log(bank * t(1:n2));
c2 = c1.*w’;
m(i,:)=c2’;
end
%——————————————————————————————————-
%t(1:n2)是为了对应于bank响应曲线长度n/2+1
%——————————————————————————————————-

%差分系数
dtm = zeros(size(m));
for i=3:size(m,1)-2
dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:);
end
dtm = dtm / 3;
%——————————————————————————————————-
%动态查分参数的提取(包括一阶差分和二阶差分)
%标准的倒谱参数MFCC只反映了语音参数的静态特性,语音的动态特性可以用这些静态特征的差分谱来描述。实验证明:把动、静态特征结合起来才能有效提高系统的识别性能。差分参数的计算可以采用下面的公式:

式中,dt表示第t个一阶差分;Ct表示第t个倒谱系数;Q表示倒谱系数的阶数;K表示一阶导数的时间差,可取1或2。将上式中结果再代入就可以得到二阶差分的参数。
%——————————————————————————————————-

%合并MFCC参数和一阶差分MFCC参数
ccc = [m dtm];
%——————————————————————————————————-
%一般来说,MFCC的全部组成其实是由:N维MFCC参数(N/3MFCC系数+ N/3一阶差分参数+ N/3二阶差分参数)+帧能量(此项可根据需求替换)
%此处只用了MFCC参数和一阶差分MFCC参数
%——————————————————————————————————-

%去除首尾两帧,因为这两帧的一阶差分参数为0
ccc = ccc(3:size(m,1)-2,:);

参考文献:
《MATLAB在语音信号分析与合成中的应用》 宋知用
MATLAB中文论坛

猜你喜欢

转载自blog.csdn.net/intersting/article/details/53121394