Matlab 自相关分析实现

matlab中有函数xcorr可完成相关性分析,本文为加深理解,采用快速傅里叶变换进行了一次实现。

自相关分析实现

分析原理

工程上对信号相似程度的研究,可以使用以下公式进行分析。

Rxy(τ)=+x(t)y(t+τ)dxR_{xy}(\tau)=\int^{+\infty}_{-\infty}{ x(t)y(t+\tau)}dx

利用时域上的卷积等于频域的乘积则有

x(n)FFTX(k)y(n)FFTY(k)x(n)\stackrel{FFT}{\longrightarrow}X(k) \\ y(n)\stackrel{FFT}{\longrightarrow}Y(k)

Rxy(k)=X(k)Y(k)Rxy(n)=Rxy(k)IFFTRxy(n)\begin{aligned} R_{xy}(k) &= X(k)\overline{Y}(k) \\ \Rightarrow R_{xy}(n) &= R_{xy}(k) \stackrel{IFFT}{\longrightarrow}R_{xy}(n) \end{aligned}

FFT 计算引入周期延拓问题,为了避免重叠失真,补等宽的零,导致另外一个问题,相关系数越来越小,以零值为中心向两边衰减。

通过将每个信号除以偏移长度,可以得到一个无衰减的结果。

程序实现

由于时间原因未能编写出无偏修正的算法,以下为FFT实现的相关性分析程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function Rxy = xcorrfuction(datax,varargin)
p = inputParser;%创建一个对象
%必填参数判断
p.addRequired('datax',@(x)validateattributes( x,{'numeric'},{'nonempty'}));
%可选参数判断
p.addOptional('datay',datax,@(x)validateattributes(x,{'numeric'},{'nonempty'}));
%无序选项判断
p.addParameter('option','biased',@(x)any(validatestring(x,'biased','unbiased'})));
%将参数传入
p.parse(datax,varargin{:});

%下面开始计算
N1=length(p.Results.datax);
N2=length(p.Results.datay);
x1 = [p.Results.datax zeros(1,N1)];
y1 = [p.Results.datay zeros(1,N2)];
Rxy2 = ifft(fft(x1).*conj(fft(y1)));
Rxy = fftshift(Rxy2);

%选择无偏
if (strcmp(p.Results.option , 'unbiased'))
N = length(Rxy)/2;
for i = 1:N
Rl(i) = Rxy(i)/i;
Rr(i) = Rxy(i+N)/(N+1-i);

end
Rxy = [Rl Rr];
end

end
%x = xcorrfuction([1,2,3],'biased');

实现效果

自相关分析效果

互相关效果