语音信号处理实验报告
- 格式:doc
- 大小:229.01 KB
- 文档页数:8
语音信号处理实验报告实验一:语音信号的端点检测
学院:电子与信息学院
专业:11级信息工程
姓名:
学号:
提交日期:2014.4.23
实验一:语音信号的端点检测
1、 实验内容
语音信号端点检测技术其目的就是从包含语音的一段信号中准确地确定语音的起始点和终止点,区分语音和非语音信号,它是语音处理技术中的一个重要方面。本实验的目的就是要掌握基于MATLAB 编程实现带噪语音信号端点检测,利用MATLAB 对信号进行分析和处理,学会利用短时过零率和短时能量,对语音信号的端点进行检测。
2、 实验方法
本实验中,端点检测的方法有两种:短时能量和短时过零率。
2.1.1、短时能量
语音和噪声的区别可以体现在它们的能量上,语音段的能量比噪声段能量大,语音段的能量是噪声段能量叠加语音声波能量的和。在信噪比很高时,那么只要计算输入信号的短时能量或短时平均幅度就能够把语音段和噪声背景区分开。这是仅基于短时能量的端点检测方法。
信号{x(n)}的短时能量定义为:
1
20()N n n m E x m -==∑
2.1.2、短时平均过零率
短时过零表示一帧语音信号波形穿过横轴(零电平)的次数。过零分析是语音时域分析中最简单的一种。对于连续语音信号,过零意味着时域波形通过时间轴;而对于离散信号,如果相邻的取样值的改变符号称为过零。过零率就是样本改变符号次数。
信号{x(n)}的短时平均过零率定义为:
1
1|sgn[()]sgn[(1)]|2N n n n m Z x m x m -==--∑ 2.2、检测方法
利用过零率检测清音,用短时能量检测浊音,两者配合。首先为短时能量和
过零率分别确定两个门限,一个是较低的门限数值较小,对信号的变化比较敏感,很容易超过;另一个是比较高的门限,数值较大。低门限被超过未必是语音的开始,有可能是很短的噪声引起的,高门限被超过并且接下来的自定义时间段内的语音超过低门限,意味着信号开始。
此时整个端点检测可分为四段:静音段、过渡段、语音段、结束。实验时使用一个变量表示当前状态。静音段,如果能量或过零率超过低门限,就开始标记起始点,进入过渡段。过渡段当两个参数值都回落到低门限以下,就将当前状态恢复到静音状态。而如果过渡段中两个参数中的任一个超过高门限,即被认为进入语音段。处于语音段时,如果两参数降低到门限以下,而且总的计时长度小于最短时间门限,则认为是一段噪音,继续扫描以后的语音数据,否则标一记结束端点。
2.3、实验过程
1、录取一段录音,采样率8K,单声道
2、用MATLAB的wavread函数把录音都进来并进行归一化处理
3、对语音信号进行预加重,分帧处理
4、对每帧分别计算短时能量和短时门限过零率
5、进行短时能量阈值、过零率阈值等参数
6、编写程序实现语音检测端点并绘出检测图
3、实验结果
4、实验分析
4.1结果分析
从结果图可知,本次实验是成功的,语音信号的端点基本都检测出来了。短时能量和短时过零率的检测结果和信号的端点分布一致。语音段的能量值比过渡段和静音段的能量都大,语音的过零率比过渡段和静音段的也都大。
4.2实验总结
这次实验利用MATLAB对信号进行分析和处理,利用短时过零率和短时能量,对语音信号的端点进行检测。由于知识储备的不足,在实验过程中还是遇到比较大的困难,端点检测代码是参考网上的,在理解的基础上加以修改和改进。但是预处理、加窗分帧、短时能量、短时过零率的代码都是我自己根据原理编写的,所有总的来说收获还是很大的。
代码如下:
function point_check()
s1=wavread('1_1.wav');
s=s1/max(abs(s1));
s=filter([1 -0.9375],1,s);%预加重
plot(s);
len=length(s);
round=160;%帧长
repeat=80;%帧移
inc=round-repeat;%b_len-2*repeat;
ka=ceil((len-round)/(round-repeat))+1;%总帧数
s=[s;zeros((round-repeat)*(ka-1)+round-len,1)];
len=length(s);
%以下进行分针操作
w=zeros(round,ka);
for i=1:ka
for k=1:round
w(k,i)=s(k+(i-1)*(round-repeat),1);
end
end
%计算过零率
ST=0.01;%过零门限
f=zeros(ka,1);
%计算短时能量幅度差
F=zeros(ka,round);
for i=1:ka
for k=0:round-1
for j=1:round-k
F(ka,k+1)=F(ka,k+1)+abs(w(j,i)-w(j+k,i));%计算短时能量幅度差
end
if(k if(w(k+1,i)>0&&w(k+2,i)<0) z=sign(w(k+1,i)-ST)-sign(w(k+2,i)+ST);%计算过零率 elseif(w(k+1,i)<0&&w(k+2,i)>0) z=sign(w(k+2,i)-ST)-sign(w(k+1,i)+ST);%计算过零率 end if(z==2) f(i,1)=f(i,1)+1;%计算过零率 end end end end amp=sum(abs(w).^2,1); %计算端点