语音信号的短时自相关序列求解以及xcorr与autocorr问题
来源:互联网 发布:淘宝店转让风险大吗 编辑:程序博客网 时间:2024/05/23 19:23
对于语音来说,短时自相关函数分析是一个重要的方法,能够用来求得浊音的基音周期,也可以用来求得语音识别中的特征参数。它的短时自相关函数为:
但是,在计算短时自相关时,窗选语音段为有限长度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;endfor k=1:K A1(k)=A(k)/A(1);endsubplot(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')的结果。
- 语音信号的短时自相关序列求解以及xcorr与autocorr问题
- 语音信号的短时自相关序列求解以及xcorr与autocorr问题
- Matlab中求自相关函数xcorr和autocorr的区别
- 时间序列分析的matlab自相关函数autocorr
- Matlab的autocorr自相关函数
- 语音信号的短时语音能量
- Matlab的自相关函数xcorr
- Matlab用xcorr求自相关函数出现的一点问题
- 与语音信号处理相关的期刊
- xcorr 自相关 c++实现
- matlab中的xcorr和autocorr
- 语音信号的短时平均能量matlab程序
- Matlab中autocorr和xcorr函数
- 语音信号分析之短时相关函数及matlab程序
- Matlab 自相关检测 :自相关函数xcorr
- Matlab 超前滞后相关,自相关xcorr
- 语音信号处理相关的书籍
- matlab中的xcorr 自相关函数(转)
- 关闭退出Activity
- 第二站,黑夜不寂寞——点亮你的LED
- HTTP协议学习,post于get;用Fiddler测试请求
- Windows Store apps开发[44]AppBar总结
- 第三站,我们才是统治者——KEY按键
- 语音信号的短时自相关序列求解以及xcorr与autocorr问题
- 第四站,把握生命的节奏——CLK初始化
- Adobe Reader卸载或升级后,删除Adobe Reader的Cmap文件夹及文件
- 第五站,我想对社会说——uart串口程序分析
- 闲聊linux中的input设备(5) 她那含情脉脉的眼神
- 第六站,来到大都市——nandflash程序完全解析
- struts第十三天--输出带占位符的资源信息
- win7建立无线wifi热点的几个常见的问题
- libvirt(virsh命令介绍)