首页 > 行业资讯 > 【语音识别】基于MFCC+VAD端点检测智能语音门禁系统含Matlab源码

【语音识别】基于MFCC+VAD端点检测智能语音门禁系统含Matlab源码

时间:2022-05-17 来源: 浏览:

【语音识别】基于MFCC+VAD端点检测智能语音门禁系统含Matlab源码

天天Matlab 天天Matlab
天天Matlab

TT_Matlab

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,完整matlab代码或者程序定制加qq1575304183。

收录于合集 #信号处理应用matlab源码 207个

1 简介

为提高低信噪比环境下语音端点检测算法性能不高的问题,提出将MFCC倒谱距离与对数能量结合进行端点检测.首先,对语音计算对数能量,然后计算改进的倒谱距离,将MFCC倒谱距离与对数能量融合,获得了一种新的语音参数,该参数能有效地提高低信噪比情况下语音与噪声的区别,对参数进行顺利滤波用于语音端点检测,采用自动更新的双阈值进行语音端判别.仿真实验表明,该算法具有较好的适用不同噪声,在低信噪比下依然能获得比较理想的端点检测效果.

2 部分代码

function [x,mc,mn,mx]=melbankm(p,n,fs,fl,fh,w) if nargin < 6 w = ’tz’; if nargin < 5 fh = 0.5; if nargin < 4 fl = 0; % min freq is DC end end end sfact = 2-any(w==’s’); wr = ’ ’; % default warping is mel for i=1:length(w) if any(w(i)==’lebf’); wr = w(i); end end if any(w==’h’) || any(w==’H’) mflh = [fl fh]; else mflh = [fl fh]*fs; end if ~any(w==’H’) switch wr case ’f’ case ’l’ if fl<=0 error(’Low frequency limit must be >0 for l option’); end mflh = log10(mflh); case ’e’ mflh = frq2erb(mflh); case ’b’ mflh = frq2bark(mflh); otherwise mflh = frq2mel(mflh); end end melrng = mflh*(-1:2:1)’; fn2 = floor(n/2); if isempty(p) p = ceil(4.6*log10(fs)); end if any(w==’c’) if p<1 p = round(melrng/(p*1000))+1; end melinc = melrng/(p-1); mflh = mflh+(-1:2:1)*melinc; else if p<1 p = round(melrng/(p*1000))-1; end melinc = melrng/(p+1); end switch wr case ’f’ blim = (mflh(1)+[0 1 p p+1]*melinc)*n/fs; case ’l’ blim = 10.^(mflh(1)+[0 1 p p+1]*melinc)*n/fs; case ’e’ blim = erb2frq(mflh(1)+[0 1 p p+1]*melinc)*n/fs; case ’b’ blim = bark2frq(mflh(1)+[0 1 p p+1]*melinc)*n/fs; otherwise blim = mel2frq(mflh(1)+[0 1 p p+1]*melinc)*n/fs; end mc = mflh(1)+(1:p)*melinc; b1 = floor(blim(1))+1; b4 = min(fn2,ceil(blim(4))-1); switch wr case ’f’ pf = ((b1:b4)*fs/n-mflh(1))/melinc; case ’l’ pf = (log10((b1:b4)*fs/n)-mflh(1))/melinc; case ’e’ pf = (frq2erb((b1:b4)*fs/n)-mflh(1))/melinc; case ’b’ pf = (frq2bark((b1:b4)*fs/n)-mflh(1))/melinc; otherwise pf = (frq2mel((b1:b4)*fs/n)-mflh(1))/melinc; end if pf(1)<0 pf(1) = []; b1 = b1+1; end if pf(end)>=p+1 pf(end) = []; b4 = b4-1; end fp = floor(pf); pm = pf-fp; k2 = find(fp>0,1); k3 = find(fp<p,1,’last’); k4 = numel(fp); if isempty(k2) k2 = k4+1; end if isempty(k3) k3 = 0; end if any(w==’y’) mn = 1; mx = fn2+1; r = [ones(1,k2+b1-1) 1+fp(k2:k3) fp(k2:k3) repmat(p,1,fn2-k3-b1+1)]; c = [1:k2+b1-1 k2+b1:k3+b1 k2+b1:k3+b1 k3+b1+1:fn2+1]; v = [ones(1,k2+b1-1) pm(k2:k3) 1-pm(k2:k3) ones(1,fn2-k3-b1+1)]; else r = [1+fp(1:k3) fp(k2:k4)]; c = [1:k3 k2:k4]; v = [pm(1:k3) 1-pm(k2:k4)]; mn = b1+1; mx = b4+1; end if b1<0 c = abs(c+b1-1)-b1+1; end % end if any(w==’n’) v = 0.5-0.5*cos(v*pi); elseif any(w==’m’) v = 0.5-0.46/1.08*cos(v*pi); end if sfact==2 msk = (c+mn>2) & (c+mn<n-fn2+2); v(msk) = 2*v(msk); end if nargout > 2 x = sparse(r,c,v); if nargout == 3 mc = mn; mn = mx; end else x = sparse(r,c+mn-1,v,p,1+fn2); end if any(w==’u’) sx = sum(x,2); x = x./repmat(sx+(sx==0),1,size(x,2)); end if ~nargout || any(w==’g’) ng = 201; me = mflh(1)+(0:p+1)’*melinc; switch wr case ’f’ fe = me; xg = repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng); case ’l’ fe = 10.^me; xg = 10.^(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng)); case ’e’ fe = erb2frq(me); xg = erb2frq(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng)); case ’b’ fe = bark2frq(me); xg = bark2frq(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng)); otherwise fe = mel2frq(me); xg = mel2frq(repmat(linspace(0,1,ng),p,1).*repmat(me(3:end)-me(1:end-2),1,ng)+repmat(me(1:end-2),1,ng)); end v = 1-abs(linspace(-1,1,ng)); if any(w==’n’) v = 0.5-0.5*cos(v*pi); elseif any(w==’m’) v = 0.5-0.46/1.08*cos(v*pi); end v = v*sfact; v = repmat(v,p,1); if any(w==’y’) v(1,xg(1, : )<fe(2))=sfact; v(end,xg(end, : )>fe(p+1))=sfact; end if any(w==’u’) dx = (xg(:,3:end)-xg(:,1:end-2))/2; dx = dx(:,[1 1:ng-2 ng-2]); vs = sum(v.*dx,2); v = v./repmat(vs+(vs==0),1,ng)*fs/n; end plot(xg’,v’,’b’); set(gca,’xlim’,[fe(1) fe(end)]); xlabel([’Frequency (’ xticksi ’Hz)’]); end

3 仿真结果

4 参考文献

[1]周代勇, 曾妍萍, 蔡燕. 基于Matlab的语音识别端点检测算法研究与实现[J]. 内江科技, 2013, 34(9):2.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

版权:如无特殊注明,文章转载自网络,侵权请联系cnmhg168#163.com删除!文件均为网友上传,仅供研究和学习使用,务必24小时内删除。
相关推荐