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

语音信号MFCC的特征提取Matlab源码

2013-11-13 10:08 381 查看
语音信号处理MFCC提取的Matlab源码,

Matlab调试运行的时候注意添加语音工具箱voicebox查找路径。即,

Matlab:File->Set Path…->Add Folder… 选择你所解压的voicebox文件夹路径。

%function ccc=mfcc(x)

%归一化mel滤波器组系数

filename=input('input filename:','s');

[x,fs,bits]=wavread(filename);

bank=melbankm(24,256,fs,0,0.5,'m');

bank=full(bank);

bank=bank/max(bank(:));

%DCT系数,12*24

for k=1:12

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);

%计算每帧的MFCC参数

for i=1:size(xx,1)

y=xx(i,:)

s=y' .*hamming(256);

t=abs(fft(s));

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(211)

ccc_1=ccc(:,1);

plot(ccc_1);title('MFCC');

% ylabel('幅值');

% title('一维数组及其幅值的关系')

% [h,w]=size(ccc);

% A=size(ccc);

% subplot(212)

% plot([1,w],A);

% xlabel('维数');

% ylabel('幅值');

% title('维数于幅值的关系')

return
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: