第一部分:常数设置 %常数设置
FrameLen = 240;%指定帧长
FrameInc = 80;%指定帧移,每一帧中未重叠的部分 amp1 = 10; %初始短时能量高门限 amp2 = 2; %初始短时能量低门限 zcr1 = 10; %初始过零率高门限 zcr2 = 5; %初始过零率低门限 maxsilence = 8; % 8*10ms = 80ms
%语音段中允许的最大静音长度,如果语音段中的静音帧数未超过此值,则认为语音还没结束;如果超过了该值,则对语音段长度count进行判断,若count %语音段的最短长度,若语音段长度小于此值,则认为其为一段噪音 status = 0; %初始状态为静音状态 count = 0; %初始语音段长度为0 silence = 0; %初始静音段长度为0 第二部分:过零计算 tmp1 = enframe(x(1:end-1), FrameLen, FrameInc); %分帧处理,tmp1和tmp2为分帧后形成的二维数组 tmp2 = enframe(x(2:end) , FrameLen, FrameInc); %语音信号是一种典型的非平稳信号,但是语音信号具有短时平稳性, 因此在处理中要对采样的语音信号进行分割成一帧一帧的短时语音序列。分帧处理有利于对语音信号进行准确的分析 并且能够提高识别率 这时再分别求出每帧的短时能量和短时过零率 signs = (tmp1.*tmp2)<0; %当 tmp1.*tmp <0 的时候,说明tmp1>0,tmp2<0 或tmp1<0,tmp2>0; 即信号过零点。 diffs = (tmp1 -tmp2)>0.02; %当信号过零点,而tmp1与tmp2距离又过近(<0.02)的话就认为是噪音,舍去. zcr = sum(signs.*diffs, 2); %定义语音信号Xn(m)的过零率为Zn, 1N1“|sgn[Xn(m)]sgn[Xn(m1)]| 则Zn=2m0第三部分:计算短时能量 amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2); %过零率有两类重要的应用: 用于粗略地描述信号的频谱特性,就是用将为若干个通道, 对各通道进行短时平均过零率和短时能量的计算,即可粗略地估计频谱特性; 用于判别清音和浊音、有话和无话。计算过零率容易受低频干扰, 特别是50 Hz 交流干扰的影响。解决这个问题的办法,一个是做高通滤波器或带通滤波,减小随机噪声的影响(filter函数滤波器) %调整能量门限 amp1 = min(amp1, max(amp)/4); amp2 = min(amp2, max(amp)/8); %若第N帧音信号Xn(m)短时能量为En,则En=Xn2(m) m0N1 第四部分:算法说明 for n=1:length(zcr) goto = 0; switch status %status是判断语音在哪个状态的函数,当status=0时,为静音状态status=1时,为可能开始状态;当status=2时,为语音状态,当status=3时,为结束状态; case {0,1} % 0 = 静音, 1 = 可能开始 if amp(n) > amp1 % 确信进入语音段 x1(end+1) = max(n-count-1,1); status = 2; %进入语音段 silence = 0; count = count + 1; elseif amp(n) > amp2 | ... % 可能处于语音段 %从静音段开始,当amp(n)高于短时能量低门限时,可能进入语音段,如果信号长度大于最短语音长度的话,即为语音段,否则为静音段。在语音段的时候,当amp(n)高于短时能量低门限时,将保持在语音段,当amp(n)低于短时能量低门限时,进入静音段。 zcr(n) > zcr2 %从静音段开始,当zcr(n)高于过零率低门限时,可能进入语音段,如果信号长度大于最短语音长度的话,即为语音段,否则为静音段。在语音段的时候,当zcr(n)高于过零率低门限时,将保持在语音段,当amp(n)低于过零率低门限时,进入静音段。 status = 1; count = count + 1; else % 静音状态 status = 0; % 进入静音段 count = 0; else status = 3; % 语音结束 end end case 3, status=0; x2(end+1)=x1(end)+count-silence/2-1; end end % count = count-silence/2; % v_count(i)=v_count(i)+v_count(i-1); % v_silence(i)=v_count(i)+v_silence(i); if length(x2) 1 ---xmin和xmax分别表示在绘图时x、 y轴的上下限 ) ylabel(‘Speech’);(ylabel是表明y轴的意义,定义y轴为Speech) for i=1:length(x2); line([x1(i)*FrameInc x1(i)*FrameInc], [-1 1], 'Color', 'red'); line([x2(i)*FrameInc x2(i)*FrameInc], [-1 1], 'Color', 'green'); End(当line(a,b,c)时,相应地会在三维图中画一条线。) 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务