您的位置:首页 > 编程语言 > MATLAB

MFCC特征提取的MatLab的代码实现

2017-01-15 15:02 1141 查看
语音信号处理MFCC提取的Matlab源码,Matlab调试运行的时候注意添加语音工具箱voicebox查找路径。即,Matlab:File->Set Path…->Add Folder… 选择你所解压的voicebox文件夹路径。
[x fs]=wavread('rec2016-12-17_14h30m04.761s.wav');
bank=melbankm(24,256,fs,0,0.4,'m');%Mel滤波器的阶数为24,fft变换的长度为256,采样频率为8000Hz
%归一化mel滤波器组系数
bank=full(bank);
bank=bank/max(bank(:));
for k=1:12 %归一化mel滤波器组系数
n=0:23;
dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));
end
w=1+6*sin(pi*[1:12]./12);%归一化倒谱提升窗口
w=w/max(w);%预加重滤波器
xx=double(x);
xx=filter([1-0.9375],1,xx);%语音信号分帧
xx=enframe(xx,256,80);%对x 256点分为一帧
%计算每帧的MFCC参数
for i=1:size(xx,1)
y=xx(i,:);
s=y'.*hamming(256);
t=abs(fft(s));%fft快速傅立叶变换
t=t.^2;
c1=dctcoef*log(bank*t(1:129));
c2=c1.*w';
m(i,:)=c2';
end
%求取差分系数
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参数和一阶差分mfcc参数
ccc=[m dtm];
%去除首尾两帧,因为这两帧的一阶差分参数为0
ccc=ccc(3:size(m,1)-2,:);
subplot(2,1,1)
ccc_1=ccc(:,1);
plot(ccc_1);title('MFCC');ylabel('幅值');
[h,w]=size(ccc);
A=size(ccc);
subplot(212) ;
plot([1,w],A);
xlabel('维数');
ylabel('幅值');
title('维数与幅值的关系')=====================================================================================================
%function ccc=%=input(,==melbankm(,,fs,,,==bank/?T系数,*

k=:=:=cos((*n+)*k*pi/(*%=+*sin(pi*[:] ./=w/%==filter([ -],%=enframe(xx,,% i=:size(xx,==y

==t.^=dctcoef*log(bank*t(:=c1.*w

=c2

%= i=:size(m,)-=-*m(i-,:)-m(i-,:)+m(i+,:)+*m(i+=dtm/%=%=ccc(:size(m,)-=ccc(:,% ylabel(% title(% [h,w]=% A=% subplot(% plot([% xlabel(% ylabel(% title(
=====================================================================================(a) Calcuate the Mel-frequency Cepstral Coefficients         f=rfft(s);        % rfft() returns only 1+floor(n/2) coefficients  x=melbankm(p,n,fs);        % n is the fft length, p is the number of filters wanted  z=log(x*abs(f).^2);         % multiply x by the power spectrum  c=dct(z);                   % take the DCT   (b) Calcuate the Mel-frequency Cepstral Coefficients efficiently         f=fft(s);                        % n is the fft length, p is the number of filters wanted        [x,mc,na,nb]=melbankm(p,n,fs);   % na:nb gives the fft bins that are needed        z=log(x*(f(na:nb)).*conj(f(na:nb)));   (c) Plot the calculated filterbanks        plot((0:floor(n/2))*fs/n,melbankm(p,n,fs)')   % fs=sample frequency   (d) Plot the idealized filterbanks (without output sampling)        melbankm(p,n,fs); 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: