语言识别的matlab仿真程序
(2012-06-07 15:28:35)
标签:
杂谈 |
语言识别的matlab仿真程序
matlab代写程序
一、加窗和分帧函数
%
enframe.m
%
%
nx=length(x);
nwin=length(win);
if (nwin == 1)
else
end
if (nargin < 3)
end
nf = fix((nx-len+inc)/inc);
f=zeros(nf,len);
indf= inc*(0:(nf-1)).';
inds = (1:len);
f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));
if (nwin > 1)
end
二、语音信号端点检测程序
function [x1,x2]=vad(k,fs,i)
%% [X1,X2]=vad(k,fs)
%%
%%
%%
%close all;
% 幅度归一化到[-1,1]
k=double(k);
k=k./max(abs(k));
%------------------------------
%
此处录取部分代码
(3,1,3);
plot(t1,k1);
axis([0.4,0.5,min(k),max(k)]);
z=sprintf('(III)
title(z);
xlabel('Time:s');
ylabel('Amplitude(normalized)');
%------------------------------
%
%------------------------------
FrameLen=240;
FrameInc=80;
FrameTemp1=enframe(k(1:end-1),FrameLen,FrameInc);
FrameTemp2=enframe(k(2:end),FrameLen,FrameInc);
signs=(FrameTemp1.*FrameTemp2)<0;
diffs=abs(FrameTemp1-FrameTemp2)>0.01;
zcr=sum(signs.*diffs,2);
disp('显示原始波形图……');
figure,subplot(3,1,1);
plot(t,k);
axis([0,(length(k)-1)/fs,min(k),max(k)]);
z=sprintf('(I)
title(z);
xlabel('Time:s');
ylabel('Amplitude(normalized)');
disp('显示过短时零率……')
zcrInd=1:length(zcr);
subplot(3,1,2);
plot(zcrInd,zcr);
axis([0,length(zcr),0,max(zcr)]);
title('(II)
xlabel('Frame');
ylabel('Zcr');
%------------------------------
%
%------------------------------
amp=sum(abs(enframe(filter([1 -0.9375], 1, k), FrameLen, FrameInc)), 2);
disp('显示短时能量……')
ampInd=1:length(amp);
subplot(3,1,3);
plot(ampInd,amp);
axis([0,length(amp),0,max(amp)]);
title('(III)
xlabel('Frame');
ylabel('Energy');
%------------------------------
%
%------------------------------
disp('设置门限……');
ZcrLow=max([round(mean(zcr)*0.1),3]);
ZcrHigh=max([round(max(zcr)*0.1),5]);
AmpLow=min([min(amp)*10,mean(amp)*0.2,max(amp)*0.1]);
AmpHigh=max([min(amp)*10,mean(amp)*0.2,max(amp)*0.1]);
%------------------------------
%
%------------------------------
MaxSilence=8;
MinAudio=16;
Status=0;
HoldTime=0;
SilenceTime=0;
disp('开始端点检测……');
for n=1:length(zcr)
此处略去部分代码
end
HoldTime=HoldTime-SilenceTime;
x2=x1+HoldTime;
disp('显示端点……');
figure,subplot(3,1,1);
plot(k);
axis([1,length(k),min(k),max(k)]);
z=sprintf('(I)
title(z);
xlabel('Sample');
ylabel('Speech');
line([x1*FrameInc,x1*FrameInc],[min(k),max(k)],'color','red');
line([x2*FrameInc,x2*FrameInc],[min(k),max(k)],'color','red');
subplot(3,1,2);
plot(zcr);
axis([1,length(zcr),0,max(zcr)]);
title('(II)
xlabel('Frame');
ylabel('ZCR');
line([x1,x1],[0,max(zcr)],'Color','red');
line([x2,x2],[0,max(zcr)],'Color','red');
subplot(3,1,3);
plot(amp);
axis([1,length(amp),0,max(amp)]);
title('(III)
xlabel('Frame');
ylabel('Energy');
line([x1,x1],[0,max(amp)],'Color','red');
line([x2,x2],[0,max(amp)],'Color','red');
三、计算MFCC系数
function cc=mfcc(k)
%------------------------------
% cc=mfcc(k)计算语音k的MFCC系数
%------------------------------
% M为滤波器个数,N为一帧语音采样点数
M=24; N=256;
% 归一化mel滤波器组系数
bank=melbankm(M,N,8000,0,0.5,'m');
figure;
plot(linspace(0,N/2,129),bank);
title('Mel-Spaced Filterbank');
xlabel('Frequency [Hz]');
bank=full(bank);
bank=bank/max(bank(:));
% DCT系数,12*24
for i=1:12
end
% 归一化倒谱提升窗口
w=1+6*sin(pi*[1:12]./12);
w=w/max(w);
% 预加重
AggrK=double(k);
AggrK=filter([1,-0.9375],1,AggrK);
% 分帧
FrameK=enframe(AggrK,N,80);
% 加窗
for i=1:size(FrameK,1)
end
FrameK=FrameK';
% 计算功率谱
S=(abs(fft(FrameK))).^2;
disp('显示功率谱……')
figure;
plot(S);
axis([1,size(S,1),0,2]);
title('Power Spectrum (M=24, N=256)');
xlabel('Frame');
ylabel('Frequency [Hz]');
colorbar;
% 将功率谱通过滤波器组
P=bank*S(1:129,:);
% 取对数后作离散余弦变换
D=dctcoef*log(P);
% 倒谱提升窗
for i=1:size(D,2)
end
% 差分系数
dtm=zeros(size(m));
for i=3:size(m,1)-2
end
dtm=dtm/3;
%合并mfcc参数和一阶差分mfcc参数
cc=[m,dtm];
%去除首尾两帧,因为这两帧的一阶差分参数为0
cc=cc(3:size(m,1)-2,:);
四、计算MFCC时所需Mel尺度滤波器组
function [x,mn,mx]=melbankm(p,n,fs,fl,fh,w)
%MELBANKM determine matrix for a mel-spaced filterbank [X,MN,MX]=(P,N,FS,FL,FH,W)
if nargin < 6
end
f0=700/fs;
fn2=floor(n/2);
lr=log((f0+fh)/(f0+fl))/(p+1);
% convert to fft bin numbers with 0 for DC term
bl=n*((f0+fl)*exp([0 1 p p+1]*lr)-f0);
b2=ceil(bl(2));
此处略去部分代码
else
end
if any(w=='n')
elseif any(w=='m')
end
if nargout > 1
else
end
五、DTW算法
function dist = dtw(test, ref)
global x y_min y_max
global t r
global D d
global m n
t = test;
r = ref;
n = size(t,1);
m = size(r,1);
d = zeros(m,1);
D =
D(1) = 0;
% 如果两个模板长度相差过多,匹配失败
if (2*m-n<3) | (2*n-m<2)
end
% 计算匹配区域
xa = round((2*m-n)/3);
xb = round((2*n-m)*2/3);
if xb>xa
elseif xa>xb
elseif xa==xb
end
%返回匹配分数
dist = D(m);
function warp
global x y_min y_max
global t r
global D d
global m n
d = D;
for y = y_min:y_max
end
D = d;
六、语音训练阶段程序
%% train.m
disp('正在生成训练参数……');
for i=0:3
end
disp('正在存储模板库……');
save 'mfcc.mat' ref;
%
clc;
七、基于DTW的语音识别程序
对test中所有语音进行识别
% test1.m
clear;
close all;
clc;
disp('正在导入参考模板参数...');
load mfcc.mat;
disp('正在计算测试模板的参数...')
此处略去部分代码
disp('正在计算匹配结果...')
for i=1:4
end
对test文件夹中任一个语音进行识别
% test2.m
clear;
close all;
clc;
disp('正在导入参考模板参数...');
load mfcc.mat;
disp('正在计算测试模板的参数...')
%
%
%
disp('正在进行模板匹配...');
dist = zeros(1,4);
for j=1:4;
end
disp('正在计算匹配结果...');
m=min(dist);
[row,column]=find(dist==m);
j=column;
if
j==1;
if
j==2;
if
j==3;
if
j==4;