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('维数与幅值的关系')=====================================================================================================
[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);
相关文章推荐
- MFCC特征提取原理与HTK和matlab等方式的实现(帧的原理也有)
- 语音信号处理—MFCC特征提取(matlab代码)
- 基于Gabor特征提取和人工智能神经网络的人脸检测matlab代码
- 原始LBP纹理特征提取方法介绍以及代码实现
- 【图像特征提取3】局部二值模式LBP特征描述符C++代码的实现
- HOG特征提取代码(opencv处理基本数据,c语言实现基本算法)
- MFCC提取详细及Matlab实现
- MFCC提取详细及Matlab实现
- 特征提取——生成样本矩阵(MATLAB实现)
- 【图像特征提取4】改进的圆形局部二值模式LBP特征描述符C++代码的实现
- Matlab提取MFCC特征参数
- matlab纹理特征提取代码
- Matlab/OpenCV自己实现Harris特征点提取和匹配
- 数据挖掘之文本特征提取【理论+部分java代码实现】
- 【图像特征提取12】OpenCv的SIFT图像局部特征提取描述算法C++代码的实现
- 语音信号MFCC的特征提取Matlab源码
- 语音信号MFCC的特征提取Matlab源码
- HOG特征提取matlab代码
- matlab实现彩色图像特征提取1
- 纹理特征提取 及LBP纹理特征matlab实现