附录2:训练函数:train.m disp('正在生成训练参数??'); for i=1:20
fname=sprintf('train\\\\D.wav',i); [k,fs]=audioread(fname);
[StartPoint,EndPoint]=vad_m(k,fs); cc=mfcc(k);
cc=cc(StartPoint-2:EndPoint-2,:); ref(i+1).StartPoint=StartPoint; ref(i+1).EndPoint=EndPoint; ref(i+1).mfcc=cc; end
disp('正在存储模板库??'); save 'mfcc.mat' ref; disp('存储完毕')
附录3:测试函数:dtwtest.m clear;close all;clc;
disp('正在导入参考模板参数...'); load mfcc.mat;
disp('正在计算测试模板的参数...') for i=0:3
fname = sprintf('test\\\\?.wav',i); [k,fs]=audioread(fname);
[StartPoint,EndPoint]=vad_m(k,fs); cc=mfcc(k);
cc=cc(StartPoint-2:EndPoint-2,:); test(i+1).StartPoint=StartPoint; test(i+1).EndPoint=EndPoint; test(i+1).mfcc=cc; end
disp('正在进行模板匹配...')
dist = zeros(1,20); for i=1:4
for j=1:20
dist(i,j) = dtw(test(i).mfcc, ref(j).mfcc); end
end
disp('正在计算匹配结果...') for i=1:4
[d,j] = min(dist(i,:)); if (j>=1 && j<=5)
fprintf('测试模板?.wav 的识别结果为:前进\\n',i-1); end
if (j>= 6 && j<=10)
fprintf('测试模板?.wav 的识别结果为:停止\\n',i-1); end
if (j>=11 && j<=15)
fprintf('测试模板?.wav 的识别结果为:左转\\n',i-1); end
if (j>=16 && j<=20)
fprintf('测试模板?.wav 的识别结果为:右转\\n',i-1);
end
end close all;
附录4:特征提取函数:vad_m.m function [StartPoint,EndPoint]=vad(k,fs) %% [StartPoint,EndPoint]=vad(k,fs)
%% 语音信号端点检测程序,k为语音信号, %% fs为其采样频率,程序绘制出语音信号 %% 相关波形图并返回起止端点所对帧号
close all
% 幅度归一化到[-1,1] k=double(k);
k=k./max(abs(k));
%------------------------------ % 显示波形 %------------------------------
SNR=5; % 设置SNR signal=Gnoisegen(k,SNR); % 叠加噪声
snr1=SNR_singlech(k,signal); % 计算叠加噪声后的信噪比
N=length(k); % 信号长度 t=(0:N-1)/fs; % 设置时间 IS=.25; % 设置IS
% 调用WienerScalart96m_2函数做维纳滤波 output=WienerScalart96m_2(signal,fs,IS,0.12);
ol=length(output); % 把output补到与x等长 if ol output=[output; zeros(N-ol,1)]; end snr2=SNR_singlech(k,output); % 计算维纳滤波后的信噪比 snr=snr2-snr1; fprintf('snr1=%5.4f snr2=%5.4f snr=%5.4f\\n',snr1,snr2,snr); subplot 311; plot(t,k,'k'); grid; axis tight; title('纯语音波形'); ylabel('幅值') subplot 312; plot(t,signal,'k'); grid; axis tight; title(['带噪语音 信噪比=' num2str(SNR) 'dB']); ylabel('幅值') subplot 313; plot(t,output,'k');grid; ylim([-1 1]); title('维纳滤波后波形'); ylabel('幅值'); xlabel('时间/s'); disp('显示原始波形图??'); t=0:1/fs:(length(k)-1)/fs; % subplot(3,1,1); plot(t,k); axis([0,(length(k)-1)/fs,min(k),max(k)]); title('语音信号波形'); xlabel('Time:s'); ylabel('Amplitude(normalized)'); disp('显示语音起始处放大波形图??'); t1=0.2:1/fs:0.3; k1=k(0.2*fs:0.3*fs); subplot(3,1,2); plot(t1,k1); axis([0.2,0.3,min(k),max(k)]); title('(II) “00.wav”语音起始处放大波形图'); xlabel('Time:s'); ylabel('Amplitude(normalized)'); disp('显示语音结束处放大波形图??'); t1=0.4:1/fs:0.5; k1=k(0.4*fs:0.5*fs); subplot(3,1,3); plot(t1,k1); axis([0.4,0.5,min(k),max(k)]); title('(III) “00.wav”语音结束处放大波形图'); xlabel('Time:s'); ylabel('Amplitude(normalized)'); %------------------------------ % 计算短时过零率 %------------------------------ k=output; 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); zcrm=multimidfilter(zcr,5); disp('显示原始波形图??'); figure,subplot(3,1,1); plot(t,k); axis([0,(length(k)-1)/fs,min(k),max(k)]); title('(I) 语音信号波形'); xlabel('Time:s'); ylabel('Amplitude(normalized)'); disp('显示短时过零率??') zcrInd=1:length(zcrm); 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); ampm=multimidfilter(amp,5); disp('显示短时能量??') ampInd=1:length(ampm); 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=30; %最长语音间隙时间 MinAudio=15; %最短语音时间 Status=0; %状态:0静音段,1过渡段,2语音段,3结束段 HoldTime=0; %语音持续时间 SilenceTime=0; %语音间隙时间 disp('开始端点检测??'); for n=1:length(zcr) switch Status case{0,1} if amp(n)>AmpHigh | zcr(n)>ZcrHigh StartPoint=n-HoldTime; Status=2; HoldTime=HoldTime+1; SilenceTime=0; elseif amp(n)>AmpLow | zcr(n)>ZcrLow 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库DTW语音识别算法(部分)在线全文阅读。
相关推荐: