您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页基于MATLAB的语音信号时频域参数分析

基于MATLAB的语音信号时频域参数分析

来源:小侦探旅游网
科技广场2007.9

22

[y, fs, nbits]=wavread(waveFile);y=y*2^nbits/2;% waveReadInt: Same as wavread, but return inte-ger value of y

% Usage: [y, fs, nbits]=wavReadInt(waveFile)% If nbits=8, then -128<=y<=127

% If nbits=16, then -32768<=y<=32767

waveFile='lcq.wav'; frameSize=256; overlap=128;[y, fs, nbits]=wavReadInt(waveFile);

fprintf('Length of %s is %g sec.\n', waveFile,length(y)/fs);

frameMat=buffer(y, frameSize, overlap);

frameNum=size(frameMat, 2);volume1=zeros(frameNum,1);

volume2=zeros(frameNum, 1);for i=1:frameNum

frame=frameMat(:,i);

frame=frame-mean(frame);% zero-justified

volume1(i)=sum(abs(frame));% method 1

volume2(i)=10*log10(sum(frame.^2));% method 2end

time=(1:length(y))/fs;

frameTime=((0:frameNum-1)*(frameSize-overlap)+0.5*frameSize)/fs;

subplot(3,1,1); plot(time, y); ylabel(waveFile);

subplot(3,1,2); plot(frameTime, volume1, '.-');ylabel('Volume (Abs. sum)');

subplot(3,1,3); plot(frameTime, volume2, '.-');ylabel('Volume (Decibels)');xlabel('Time (sec)');

waveFile='lcq';frameSize=256;overlap=0;[y, fs, nbits]=wavReadInt(waveFile);frameMat=buffer(y, frameSize, overlap);

zcr1=sum(frameMat(1:end-1, :).*frameMat(2:end, :)<0);% Method 1

zcr2=sum(frameMat(1:end-1, :).*frameMat(2:end, :)<=0);% Method 2

time=(1:length(y))/fs;frameNum=size(frameMat, 2);frameTime=((0:frameNum-1)*(frameSize-overlap)+0.5*frameSize)/fs;

subplot(2,1,1);  plot(time, y);  ylabel(waveFile);subplot(2,1,2);  plot(frameTime, zcr1, '.-',frameTime, zcr2, '.-');

title('ZCR');  xlabel('Time (sec)');legend('Method1', 'Method 2');

基于MATLAB的语音信号时频域参数分析图二两种短时零率分析结果

从图二可以清楚得看出,清音的过零率要大于浊音的过零率。

2.1.3基音的估计

浊音信号的周期称为基音周期,它是声带振动频率的倒数,基音周期的估计称为基音检测。基音检测是语音处理中的一项重要技术,它在有调语音辨意、低速率语音编码、说话人识别等方面起着非常关键的作用。但在实现过程中,由于声门激励波形不是一个完全的周期脉冲串,再加上声道影响去除不易、基音周期定位困难、背景噪声影响强烈等一系列因素,基音检测面临着很大的困难。现在已有很多性能优越的基音检测算法,自相关基因检测算法就是一种基于语音时域分析理论较好的算法[6]。在这里基于声音文件比较稳定的基础上,使用观察法获取基音周期,下面给出了实现代码,图三给出了直观的结果。

图一两种短时能量分析结果

waveFile='lcq01.wav';[y, fs, nbits]=wavread(waveFile);

index1=11000;frameSize=256;index2=index1+frameSize-1;

frame=y(index1:index2); subplot(2,1,1);  plot(y);grid on title(waveFile); line(index1*[1 1], [-11], 'color', 'r');

line(index2*[1 1], [-1 1], 'color', 'r'); subplot(2,1,2); plot(frame, '.-');

grid on  point=[7, 189];

2.2频域分析短时傅立叶分析

在运用离散时间傅立叶变换分析语音信号的变化时,会

2.1.2短时过零率分析

过零就是信号通过零值。对于连续语音信号,可以考察其时域波形通过时间轴的情况。对于离散时间信号,如果相邻的取样值改变符号则称为过零。由此可以计算过零数,过零数就是样本改变符号的次数。单位时间内的过零数称为平均过零数。语音信号x(n)的短时平均过零数定义为: Zn=S{abs{sgn[x(n)]-sgn[x(n-1)]}.w(n-m)}。短时过零分析通常用在端点侦测,特别是用来估计清音的起始位置和结束位置。

下面给出了计算过零率两种方式的MATLAB代码,图二显示了分析结果。

23科技广场2007.9

24

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务