互相关
设两个函数分别是f(t)和g(t),则互相关函数定义为:
它反映的是两个函数在不同的相对位置上互相匹配的程度。
线性卷积
在泛函分析中,是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与经过翻转和平移的g的重叠部分的累积。如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是"移动平均"的推广。
理解卷积的物理含义也许有点难,但是理解其计算却是相对容易,东南大学的数字信号课程里做了一个线性卷积的动画演示:http://zlgc./jpkc2/ipkc/signal/new/course/one/flash/juanji_swf.htm
因此,我们很容易理解,卷积和相关是相似的,两者就是多了一个旋转过程而已,卷积要先对Y轴旋转!
用卷积来表示相关就是:
通常来说,计算卷积都是在频域进行的,这主要是利用了FFT变换的卷积定理
快速傅里叶转换(FFT)计算卷积,在时域(time
domain)做卷积相当于这两个信号的离散傅里叶转换在频域(frequency domain)做相乘。
因此,matlabz中计算相关和卷积都是在频域计算的,再转回时域,这可以简单用代码来验证一下:
Matlab计算互相关函数xcorr,计算卷积函数conv;
C =
xcorr(x,y,'option'),如果x,y长度不同,matlab会自动给短向量后面补零,最终长度length=2*max(n,m)-1;
"biased"为有偏的互相关函数估计;
"unbiased"为无偏的互相关函数估计;
"coeff"为0延时的正规化序列的自相关计算;
"none"为原始的互相关计算,也是默认模式;
Z=
conv(x,y,'shape'),两向量长度不需要一致,最后卷积长度length=n+m-1;
"full"为默认模式,返回全部卷积(n+m-1);
"same",返回中间部分卷积,长度与x相同(n);
"valid",返回中间没有用零填充部分的卷积值,用滑动窗的方法解释的话,就是第2个窗口能够完全被第一个窗口重合、包含的部分(max(n-max(0,m-1),0),因此如果n
% 卷积法计算互相关的验证程序
dt=0.1;
t=[0:dt:100];
x=5*sin(4*t);
y=3*cos(3*t);
[a,b]=xcorr(x,y);
plot(b*dt,a);
yy=3*cos(3*fliplr(t)); % 以Y为轴对称翻转 yy=fliplr(y);
c=conv(x,yy);
err = a-c;
subplot(3,1,1);
plot(b*dt,a,'k');
title('Corr','fontsize',16);xlabel('Logs','fontsize',12);
subplot(3,1,2);
plot(b*dt,c,'r');
title('Conv','fontsize',16);xlabel('Logs','fontsize',12);
subplot(3,1,3);
plot(b*dt,err,'g');
title('Error','fontsize',16);xlabel('Logs','fontsize',12);
% 这里误差小于1e-13,本人认为是由matlab的数值误差所引起,可以忽略。