mutlab中打开语音信号用什么指令
发布网友
发布时间:2022-05-07 18:27
我来回答
共1个回答
热心网友
时间:2022-07-01 01:27
基于MATLAB 平台, 笔者将教学内容中一些难以理解的要点或者抽象的概念用MATLAB语言开发成可执行的程序, 并生成可执行的动画文件, 可以根据实际需要修改文件中的参数来分析结果的动态图形, 能够精确、*真地反映变化过程。本文以根据语音的短时自相关函数进行基音周期估计和根据能量和过零率进行端点检测为例, 对程序的开发过程进行详细介绍。
1 根据短时自相关函数进行基音周期估计
1.1 基本原理
基音周期是语音最重要的参数之一, 根据加窗语音来估计基音周期, 在语音编码器、语音识别、说话人识别等领域都很重要。由信号自相关函数的性质可知, 若原始信号是周期的, 则其自相关函数也是周期的, 且自相关函数的周期就是原始信号的周期。
由于浊音是周期信号, 其自相关函数也呈现明显的周期性, 且自相关函数的周期就是浊音的基音周期。浊音的自相关函数应在基音周期的整数倍位置上取得极大值。清音接近于随机噪声, 其短时自相关函数不具有周期性。根据这个性质可以判断一个语音信号是清音还是浊音, 还可以确定其基音周期。
1.2 估计方法及设计思想
语音是典型的非平稳信号, 但是在一个很短的时间内可以认为其近似为平稳信号。因此计算自相关函数前要对语音进行分段, 分段最常用的方法是加窗。一般情况下用矩形窗, 但是在本实验中可以自己选择所用的窗。矩形窗函数可表示为
w (n) =1 0 <= N <= N - 1
0 其它
假设S(n)是原始语音, Sw(n)是加窗语音, 非零区间为n= 0~N-1, 即Sw(n)=S(n)w(n)
Sw(n)的自相关函数就是S(n)的短时自相关函数, 定义为
Rw(l)=ΣSw(n)Sw(n+l)
式中: l∈[-N+1,n-1]。
可以证明, 自相关函数是偶函数, 且l=0在处取得最大值, 但是很多时候自相关函数第一最大峰值的位置并不能与基音周期相吻合, 产生这种情况的主要原因有两点:
1) 与窗长有关
一般认为窗长应至少大于两个基音周期, 窗长取40ms为宜。
2) 与声道特性的影响有关
要去除这种影响, 一般情况先对原始语音进行预处理, 预处理的过程包括两步: (1)用一个60~900Hz 的带通滤波器对原始语音滤波; (2)对语音进行非线性变换, 常用的非线性变换方法是进行中心削波, 中心削波函数为C(n)=S(n)-CL S(n)>CL
0 |S(n)|<=CL
S(n)+CL S(n)<CL
利用短时自相关函数进行基音周期估计的步骤如下:
(1) 对所加载的语音加窗;
(2) 计算加窗语音的短时自相关函数, 选取短时自相关函数的局部最大点;
(3) 对局部最大点进行清晰化, 以便确认其确实为最大点;
(4) 所有清晰点中最左边的点对应的就是语音的基音周期的估计值。
因为没有任何一种预测方法能够准确计算出所有的基音周期, 但绝大多数的点是比较准确的, 为此需要对计算结果进行平滑处理, 常用的对基音周期轨迹的平滑有三种方法: 中值滤波、线性滤波、组合平滑。实验中可以自己选择采用哪种滤波方法。
1.3 程序实现过程
基音周期估计过程完全由MATLAB语言编程实现。编程过程如下: 首先加载语音, 并对其作预处理(滤波和中心削波) 和加窗(窗函数可选),计算加窗语音的短时自相关函数, 确定自相关函数的最大值进行基音周期的估计, 对估计的基音周期作平滑处理(平滑方法可以选择)。其中计算短时自相关函数的程序如下:
function x= ista (wave, fs,w indow , start, lagstep)
wave 为输入语音, 先对其进行预处理。
对语音进行加窗处理。
w inSize= length (w indow ) ;
base= wave ( start: start+ w inSize- 1). 3 w indow
计算短时自相关函数:
lag k
n=1;
for k= 1: lagstep:winSize
x(n)=(sum(base*(wave(start+k:start+k+winSize-1).*window)));
n=n+1;
end
x=normalise (x) ;
1.4 运行结果
图1 示出了语音自相关函数实验, 利用菜单①加载声音文件(如图1 所示) , 点击信号面板中任意点可显示加载语音的波形, 同时会在信号面板中出现光标, 可以通过移动光标来选择不同段的语音④, 同时可以控制对语音的放大和缩小显示。移动左边的光标可刷新自相关函数面板并显示新选择语音的自相关函数, 同时在相应的基音周期面板中显示估计出来的基音周期③。