语音信号的短时自相关序列求解以及xcorr与autocorr问题

           对于语音来说,短时自相关函数分析是一个重要的方法,能够用来求得浊音的基音周期,也可以用来求得语音识别中的特征参数。它的短时自相关函数为:

         

但是,在计算短时自相关时,窗选语音段为有限长度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来计算一帧语音的自相关序列

代码如下:

clc;
clear all;
[y,fs,nbits]=wavread('1b.wav');
frameSize=256;
overLap=128;
lag=255;
frameMat=buffer2(y,frameSize,overLap);
[ndim,nFrame]=size(frameMat);
frame1=frameMat(:,50);
subplot(4,1,1);
%plot([1:frameSize]/fs,frame1);
%画出该语音帧的时域波形图
plot([1:frameSize],frame1);

%用修正的自相关函数计算自相关,采用两个不同长度的窗口
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('修改的自相关函数求自相关');
%xcorr求自相关时,没有减去均值,没有归一化,而autocorr求自相关是减去了均值也做了归一化处理
%%%%%xcorr不减去均值求自相关

[c,lags]=xcorr(frame1,lag, 'unbiased'); %unbiased估计不会衰减,默认的最大lag为frameSize-1;
%d=c./c(lag+1);%归一化,除以能量 已经用1/(M-abs(lags))进行了归一化
subplot(4,1,3);
plot(lags(lag+1:end),c(lag+1:end));
%axis([0,256,-1,1]);
title('xcorr求自相关unbiased(没有减去均值)');%该函数实现本身没有减掉均值做相关




[c,lags]=xcorr(frame1,lag, 'biased'); %unbiased估计不会衰减,默认的最大lag为frameSize-1;
%d=c./c(lag+1);%归一化,除以能量 已经用1/(M-abs(lags))进行了归一化
subplot(4,1,4);
plot(lags(lag+1:end),c(lag+1:end));
%axis([0,256,-1,1]);
title('xcorr求自相关biased(没有减去均值)');%该函数实现本身没有减掉均值做相关

[c,lags]=xcorr(frame1,lag, 'coeff'); 
%d=c./c(lag+1);%归一化,除以能量 已经用1/(c(lag+1))进行了归一化
figure;
subplot(4,1,1);
plot(lags(lag+1:end),c(lag+1:end));
%axis([0,256,-1,1]);
title('xcorr求自相关coeff(没有减去均值)');%该函数实现本身没有减掉均值做相关

%%%%%xcorr减去均值求自相关
frame2=frame1-mean(frame1);%减掉均值
[c1,lags1]=xcorr(frame2,lag, 'unbiased'); %unbiased估计不会衰减,默认的最大lag为frameSize-1;
%d1=c1./c1(lag+1);%归一化,除以能量
%figure;
subplot(4,1,2);
plot(lags1(lag+1:end),c1(lag+1:end));
%axis([0,256,-1,1]);
title('xcorr求自相关unbiased(减去均值)');%该函数实现本身没有减掉均值做相关




[c1,lags1]=xcorr(frame2,lag, 'coeff'); %unbiased估计不会衰减,默认的最大lag为frameSize-1;
%d1=c1./c1(lag+1);%归一化,除以能量
%figure;
subplot(4,1,3);
plot(lags1(lag+1:end),c1(lag+1:end));
%axis([0,256,-1,1]);
title('xcorr求自相关coeff(减去均值)');%该函数实现本身没有减掉均值做相关


%%%%用auotcorr求自相关
[c2,lags2,bound]=autocorr(frame1,lag);
subplot(4,1,4);
plot(lags2(1:end),c2(1:end));
%axis([0,256,-1,1]);
title('autocorr求自相关');%该函数减掉了均值在做相关,最后做了归一化

如下图所示:

从上图可以看出autocorr(y)求得的结果相当于xcorr(y-mean(y),MaxLag,'coeff')的结果。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值