对于语音来说,短时自相关函数分析是一个重要的方法,能够用来求得浊音的基音周期,也可以用来求得语音识别中的特征参数。它的短时自相关函数为:
但是,在计算短时自相关时,窗选语音段为有限长度N,而求和上限为N-1-k,因此当k增加时可用于计算的数据就越来越少了,从而导致k增加时自相关函数的幅度减小。为了解决这个问题,提出了语音修正的短时自相关。修正的短时自相关函数,其定义如下:
为了用Matlab计算一帧语音的自相关序列,可以采用Matlab中提供的xcorr和autocorr函数,也可以自己按照上面的公式动手编写。
代码如下:
加上frame1帧长为256的信号。
%用修正的自相关函数计算自相关,采用两个不同长度的窗口
N=128; %
K=128;
A=[];
for k=1:K
sum=0;
for m=1:N
sum=sum+frame1(m)*frame1(m+k-1);
end
A(k)=sum;
end
for k=1:K
A1(k)=A(k)/A(1);
end
subplot(4,1,2);
plot(A1);
title('修改的自相关函数求自相关');
该方法计算得出的自相关序列只有128个点,但是如果想得到更多的点呢? 可是用Matlab提供的函数xcorr和autocorr可以计算数量为帧长256个自相关序列,其中xcorr计算出来的为对称序列,需要去掉负延迟(lag)的自相关序列。而autocorr只取了一边,不是对称的。
下面介绍下xcorr与autocorr的具体区别:
1.xcorr
C=xcorr(A,B),求向量A与B的互相关系数。如果A和B都是长度为M的向量,则返回2*M-1个胡相关系数C。
如果A和B的长度不一样,短的向量补0,然后计算互相关。如果A是行向量,C也是行向量。
xcorr(A),如果A是一个向量,则求自相关序列。如果A是一个M*N的矩阵,则求出的结果为2M-1行N^2列的自相关序列。延迟为0
的点位于该序列的中间。
xcorr(A,MaxLag),MaxLag=M-1,M为向量A的长度。求延迟为-MaxLag到MaxLag之间的相关函数。
[c,lags]=xcorr(A,MaxLag,ScaleOpt);返回的lags为延迟下标
ScaleOpt为归一化选项:'biased':自相关序列乘以1/M ;‘unbiased’:自相关序列乘以 1/(M-abs(lags))
'coeff':归一化序列让延迟为0的自相关序列为1.
‘none’:不归一化
例子: s=[1 2 3];
r=xcorr(s);
r =3.0000 8.0000 14.0000 8.0000 3.0000
上面的矩阵,M=3,最后得到5个结果,其中第三个是自己和自己相乘,最后相加的结果,值最大1*1+2*2+3*3=14。而第二个和
第四个分别是间隔正负1的结果也就是1*2+2*3=8,2*1+3*2=8。第1个和第五个分别是间隔正负2,也就是1*3=3,3*1=3。
可见:xcorr默认的MaxLag=M-1=2.ScaleOpt默认为none.
MaxLag=2;
r=xcorr(s,MaxLag,'biased');
r =1.0000 2.6667 4.6667 2.6667 1.0000
相当于乘以1/3
MaxLag=2;
[r,lags]=xcorr(s,MaxLag,'unbiased');
r=3.0000 4.0000 4.6667 4.0000 3.0000
abs(lags)= 2 1 0 1 2
相当于乘以1/(M-abs(lags)),第一个为1/(3-2)=1; 1/(3-1); 1/(3-0);1/(3-1);1/(3-2)
MaxLag=2;
[r,lags]=xcorr(s,MaxLag,'coeff'); (注该方法相当于修正的自相关函数)
r=0.2143 0.5714 1.0000 0.5714 0.2143
相当于r=r./r(M) 即3/14=0.2143 8/14=0.5714, 14/14=1.00;
2.autocorr
[acf,lags,bounds] = autocorr(y)
[acf,lags,bounds] = autocorr(y,numLags,numMA,numSTD)
计算随机时间变量y的自相关函数,当没有输出参数,将画出在置信区间的自相关函数。
numLags:为自相关函数的延迟,默认为min[20,length(y)-1];该函数忽略了延迟小于0的序列。
下面用修正的自相关函数和xcorr,autocorr来计算一帧语音的自相关序列
代码如下:
从上图可以看出autocorr(y)求得的结果相当于xcorr(y-mean(y),MaxLag,'coeff')的结果。