基音周期估计

来源:互联网 发布:原生js图片上传 编辑:程序博客网 时间:2024/04/30 17:23
实验目的 

本次试验的目的是通过matlab编程,验证课本中基音周期估计的方法,本实验采用的方法是自相关法。

实验原理 
1、基音周期 
基音是发浊音时声带震动所引起的周期性,而基音周期是指声带震动频率的倒数。基音周期是语音信号的重要的参数之一,它描述语音激励源的一个重要特征,基音周期信息在多个领域有着广泛的应用,如语音识别、说话人识别、语音分析与综合以及低码率语音编码,发音系统疾病诊断、听觉残障者的语音指导等。因为汉语是一种有调语言,基音的变化模式称为声调,它携带着非常重要的具有辨意作用的信息,有区别意义的功能,所以,基音的提取和估计对汉语更是一个十分重要的问题。


由于人的声道的易变性及其声道持征的因人而异,而基音周期的范围又很宽,而同—个人在不同情态下发音的基音周期也不同,加之基音周期还受到单词发音音调的影响,因而基音周期的精确检测实际上是一件比较困难的事情。基音提取的主要困难反映在:①声门激励信号并不是一个完全周期的序列,在语音的头、尾部并不具有声带振动那样的周期性,有些清音和浊音的过渡帧是很难准确地判断是周期性还是非周期性的。②声道共振峰有时会严重影响激励信号的谐波结构,所以,从语音信号中直接取出仅和声带振动有关的激励信号的信息并不容 易。③语音信号本身是准周期性的(即音调是有变化的),而且其波形的峰值点或过零点受共振峰的结构、噪声等的影响。④基音周期变化范围大,从老年男性的50Hz到儿童和女性的450Hz,接近三个倍频程,给基音检测带来了一定的困难。由于这些困难,所以迄今为止尚未找到一个完善的方法可以对于各类人群(包括男、女、儿童及不向语种)、各类应用领域和各种环境条件情况下都能获得满意的检测结果。


尽管基音检测有许多困难,但因为它的重要性,基音的检测提取一直是一个研究的课题,为此提出了各种各样的基音检测算法,如自相关函数(ACF)法、峰值提取算法(PPA)、平均幅度差函数(AMDF)法、并行处理技术、倒谱法、SIFT、谱图法、小波法等等。


自相关函数 
对于离散的语音信号x(n),它的自相关函数定义为:


如果信号x(n))具有周期性,那么它的自相关函数也具有周期性,而且周期与信号x(n)的周期性相同。自相关函数提供了一种获取周期信号周期的方法。在周期信号周期的整数倍上,它的自相关函数可以达到最大值,因此可以不考虑起始时间,而从自相关函数的第一个最大值的位置估计出信号的基音周期,这使自相关函数成为信号基音周期估计的一种工具。

短时自相关函数 
语音信号是非平稳的信号,所以对信号的处理都使用短时自相关函数。短时自相关函数是在信号的第N个样本点附近用短时窗截取一段信号,做自相关计算所得的结果 


实验过程(步骤) 
1、读取wav文件; 
2、利用自相关法进行基音周期估计;

3、去除野点。


clc;clear all;close all;        
%
% 读取预料,同时对其进行低通滤波(900Hz)和分帧
[y,fs,wmode,fidx]=readwav('sunday.wav','p',-1,-1);
f=enframe(y,160);       %分析帧长:20ms(160样点)
lpf_900 = fir1(39,900/fs);
f_l = conv2(f,lpf_900,'same');
figure;plot(f_l(5,:));xlabel('n');ylabel('幅值');title('语音信号波形(低通滤波)');
% 阈值设定
%
% 对每帧预料进行阈值选择
f_l_max = [max(abs(f_l(:,1:60)),[],2) max(abs(f_l(:,101:160)),[],2)];
CL = 0.68*min(f_l_max,[],2);    
figure; stem(CL);xlabel('帧序号');ylabel('阈值大小');title('阈值分布');
CL = repmat(CL,1,160);
%削波处理
%
% 三电平量化
f_3 = zeros(size(f));
f_3(f>CL) = 1;
f_3(f<-CL) = -1;
figure;plot(f_3(5,:));xlabel('n');ylabel('幅值');title('语音信号波形(三电平量化)');
%
% 中心削波
f_c = zeros(size(f));
f_c(f>CL) = f(f>CL) - CL(f>CL);
f_c(f<-CL) = f(f<-CL) + CL(f<-CL);
figure;plot(f_c(5,:));xlabel('n');ylabel('幅值');title('语音信号波形(中心削波)');
% 互相关求基音频率
% 互相关 (采用卷积计算)
f_3_inv = f_3(:,end:-1:1);
f_c_inv = f_c(:,end:-1:1);
for n = 1:45
    f_xcorr(n,:) = conv(f_c(n,:),f_c_inv(n,:));
end
f_xcorr = f_xcorr(:,160:319);

% 找出最大值位置
[f_xcorr_max,f_postition] = max(f_xcorr(:,21:160),[],2);
f_postition = f_postition+20;
noPitch = f_xcorr_max<f_xcorr(:,1)/4;   % 清音检测
pitchFrequence = fs./f_postition;       % 基音频率
pitchFrequence(noPitch==1) = 0;
figure;stem(pitchFrequence);xlabel('帧序号');ylabel('基音频率(Hz)');
title('基音频率检测');grid on;


http://wenku.baidu.com/link?url=1yVchTQ3Q9gzDEFoHZtpHambRbwmlUMcaJIWJ_ytIPybMWI7zKFMd_WN8mjJ46zyHqJlhXuTRSlupD34Ob0D_Q1K60CfNb878vEI8d7z9RW



0 0
原创粉丝点击