⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 energy.m

📁 speechtimefre 语音时域处理
💻 M
字号:
% function [x1,x2]=vad(x)


[x,Fs,bits] = wavread('one')
specgram(x,240,8000,80);
x=double(x);
x=x/max(abs(x));%将幅度归一化到[-1,1]
framelen=240;
frameinc=80;%设定帧长为240帧移为80
amp1=10;
amp2=2;
zcr1=10;
zcr2=5;
maxsilence=3;
minlen=15;
status=0;
count=0;
silence=0;

temp1=enframe(x(1:length(x)-1),framelen,frameinc);
temp2=enframe(x(2:length(x)),framelen,frameinc);
signs=(temp1.*temp2)<0;
diffs=(temp1-temp2)>0.02;
zcr=sum(signs.*diffs,2);%计算过零率

amp=sum(abs(enframe(x(1:length(x)-1),framelen,frameinc)),2); %计算短时能量
%调整能量门限
amp1=min(amp1,max(amp)/4);
amp2=min(amp2,max(amp)/8);

%开始零点检测
x1=0;
x2=0;
for n=1:length(zcr);
    goto=0;
    switch status
        case{0,1}       %静音=0,1开始
            if amp(n)>amp1    %确信进入语音阶段
                x1=max(n-count-1,1);
                status=2;
                silence=0;
                count=count+1;
            elseif amp(n)>amp2|... %可能处在语音段
                    zcr(n)>zcr2
                status=1;
                count=count+1;
            else  %静音状态
                status=0;
                count=0;
            end
        case 2,   %2=语音段
            if amp(n)>amp2|...%保持在语音段
                    zcr(n)>zcr2;
                count=count+1;
            else  %语音将结束
                silence=silence+1;
         
               
                if silence<maxsilence    %静音不够长,,没有结束
                    count=count+1;
                elseif count<minlen;  %语音长度太短,,认为是噪声
                    status=0;
                    silence=0;
                    count=0;
                else 
                    status=3;
                end
            end
        case 3,
            break;
    end
end


j=0;
for i=1:length(amp)-1;
if (zcr(i)>0.02)&(zcr(i+1)<0.02)
    j=j+1
    jiesu1(j)=i;
end
end
j=1
for i=1:length(jiesu1)-1
    if((jiesu1(i+1)-jiesu1(i))>100)&jiesu1(i)~=1
        jiesu(j)=jiesu1(i);
        j=j+1
    end
end    %找出每段语音结束点

j=1
for i=1:length(amp)-1;
    if ((zcr(i)<0.85)&zcr(i+1)>0.85)
        kaishi1(j)=i+1
        j=j+1;
    end
end

j=1
for i=1:length(kaishi1)-1
    if((kaishi1(i+1)-kaishi1(i))>80)
        kaishi(j)=kaishi1(i);
        j=j+1
    end
end



count=count-silence/2;
x2=x1+count-1;
subplot(311)
plot(x)
axis([1 length(x) -1 1])
ylabel('speech');
line([x1*frameinc x1*frameinc],[-1,1],'color','red');
line([x2*frameinc x2*frameinc],[-1,1],'color','red');

subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel('energy');
line([x1,x1],[min(amp),max(amp)],'color','red');
line ([x2 x2],[min(amp),max(amp)],'color','red');

subplot(313)
plot(zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel('zcr');
line([x1 x1],[min(zcr),max(zcr)],'color','red');
line([x2 x2],[min(zcr),max(zcr)],'color','red');



    
                
            
            
    
                


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -