📄 55.txt
字号:
function [e]=ZQ(p)
%%%%%%%%%%%%%%%%语音滤波环节%%%%%%%%%%%%%%%%%%%%%%%%%
%用函数录制一带噪语音信号
fs=10000;
p=wavrecord(40000,fs,'double');
p=p';
s=randn(size(p))/10; %语音信噪比设定
x=p+s;
%回放带噪语音
pause;
x=double(x);
soundview(x,fs);
%打印带噪语音波形图
h=length(x);
figure(10)
subplot(311)
plot(1:h,x)
title('带噪信号');
%开始滤波
x=p';
d=0.4; %滤波系数选定
w=[0,d];
u=0.0026;
for i=1:length(x)-1;
y(i+1)=s(i:i+1)*w';
e(i+1)=x(i+1)-y(i+1);
w=w+2*u*e(i+1)*s(i:i+1);
end;
%打印波形图
subplot(312)
plot(1:h,p)
title('纯净的语音信号');
subplot(313)
plot(1:h,e)
title('滤波后的信号');
%回放函数
pause
e=double(e);
soundview(e,fs);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pause;
%%%%%%%%%%%%%%%语音端点检测环节%%%%%%%%%%%%%%%%
x=e;
%将幅度归一化到[-1,1]
x=double(x);
x=x/max(abs(x));
%设定帧长为300帧移为100
framelen=300;
frameinc=100;
amp1=10.8;
amp2=6;
zcr1=10;
zcr2=5;
maxsilence=8;
minlen=12;
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.025;
zcr=sum(signs.*diffs,2);
%计算短时能量
w=filter([1 -0.9375], 1, x)
amp = sum(abs(enframe(w, 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, % 语音段
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
count=count-silence/2;
x2=x1+count-1;
figure(20)
%n——x(n)图:
subplot(311)
plot(x,'color','red');
grid;
axis([1 length(x) -1 1])
ylabel('speech--x(n):');
xlabel('n');
line([x1*frameinc x1*frameinc],[-1,1],'color','blue');
line([x2*frameinc x2*frameinc],[-1,1],'color','blue');
%短时能量
subplot(312)
plot(amp);
grid;
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);
grid;
axis([1 length(zcr) 0 max(zcr)])
ylabel('zcr');
line([x1 x1],[min(zcr),max(zcr)],'color','green');
line([x2 x2],[min(zcr),max(zcr)],'color','green');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -