语音信号基音频率的提取
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%输入一个序列,如果 相邻两个点异号,统计 数字加1 %这个结果可以作为判 断是否是噪音的一个依 据 %当counor Day
@WPS官方微博 @kingsoftwps
四、corr
function r=corr(s,d,flag) epsilon=1.0e-10; % 防止被零整除 L=length(s); NM=120; if flag==1 % From left to right for i=20:min(L-d,NM)%自相关错位值 temp=0.0; temp1=0.0; temp2=0.0; for j=1:d temp=temp+s(j)*s(j+i); temp1=temp1+s(j+i)*s(j+i); temp2=temp2+s(j)*s(j); end pw1=sqrt(temp1)+epsilon; pw2=sqrt(temp2)+epsilon; r(i-19)=temp/(pw1*pw2); end
五、pitch
语音信号基音频率的提取
一、综述
此matlab程序用于提取基音频率的提取。 人在发浊音时,气流通过声门使声带产生张驰振荡式振动, 产生一股准周期脉冲气流,这一气流激励声道就产生浊音, 又称有声语音,它携带着语音中的大部分能量。这种声带 振动的频率称为基频。 在语音信号处理中,语音信号参数提取的准确性非常重要。 只有获得准确的参数,才能利用这些参数进行高效的处理, 而在许多参数提取中,基音周期的提取尤为重要,广泛地 应用于语音压缩编码、语音分析合成以及语音识别等方面, 所以,准确可靠地估计并提取基音周期对语音信号处理至 关重要 。它直接影响到合成语音是否真实再现原始语音 信号,影响到语音识别的识别率,影响到语音压缩编码的 正确率。
E[ y1* y 2] E ( y1 ) E ( y 2 )
2 2
语音的基音周期一般在20到140,因此 小于20没有周期 i+20-1,因此pitch.m在调用这个时需要 有一句p=19+ind_pitch;
二、主程序pitch
[maxim,mxi]=max(rr);%maxim存放最大值,mxi存放最 大值位置 ind_pitch=mxi; if mxi>THR_largePitch %与限定值比较 mi=maxx(rr,THR_maxx);%实际上就是以最大值 点的t倍为界找出这个界以上的左右极值点的位置 %这个序列的第一个值是1,最后一个是序列rr的长度 %一开始看到这里的时候会觉得比较多余了,直接一次 maxim*THR_pitch分界比较就可以了 %事实上,下面的比较没有只针对极值点处理。 %maxx的作用是筛选出大于maxim*THR_maxx的极值点 出来,所以这个还是必须的 for i=1:length(mi) if rr(mi(i))>max(THR_corr,maxim*THR_pitch); ind_pitch=mi(i); break;%break说明只取第一个满足条件的 end end end p=19+ind_pitch;%rr(i)对应的是i+19 mx=rr(ind_pitch);
五、mass函数
function mi=maxx(s,t) %首先求出序列s的最大 max_value=max(s); 值max_value %然后如果序列中的一 oldstate=0; 个点比相邻两个点都大 L=length(s); %而且还大于 j=1; max_value的t倍 mi=[1]; %就把这个点的位置存 for i=1:L-1 放在序列mi中 if s(i)>s(i+1) %在序列mi最后再补上 newstate=-1; 序列的最后一个点 end %考虑到第一个点和最 if s(i)<s(i+1) 后一个点有可能满足要 求 newstate=1; %但这两个点都不能跟 end 旁边的比较 if s(i)==s(i+1) newstate=oldstate;%所以还是把这两个点 保留了,放在mi序列的 end
二、大体思路
原理:周期信号的自相关函数将在时延等于函数周期的地 方产生一个极大值,因此通过计算语音信号的自相关函数 可以估计信号的基音。 1、输入序列,求其自相关序列 2、求第一周期极大值点 3、根据语音特点筛选最大值点 4、根据此最大值点位置得出语音频率
三、主程序pitch
• function [p,mx]=pitch(s)%输入一个语音序列 • THR_pitch=0.75; • THR_maxx=0.7; • THR_corr=0.33; • THR_largePitch=60;%限定最大值的范围 • epsilon=1.0e-10;%防止被零整除,添加一个极小的数 • L=length(s);%求序列长度 • d=100;% • rr=corr(s,d,0);%最后一个参数限定求自相关时的方向
第一个和最后一个 if newstate==-1 & oldstate ==1 if s(i)>t*max_value j=j+1; mi(j)=i; end end
oldstate=newstate; end
ll=length(mi); mi(ll+1)=length(s);
六、zero函数
function zc=zerocros(s) L=length(s); count=0; for i=1:L-1 if s(i)*s(i+1)<0 count=count+1; end end zc=count;