matlab中有函数xcorr可完成相关性分析,本文为加深理解,采用快速傅里叶变换进行了一次实现。
自相关分析实现
分析原理
工程上对信号相似程度的研究,可以使用以下公式进行分析。
Rxy(τ)=∫−∞+∞x(t)y(t+τ)dx
利用时域上的卷积等于频域的乘积则有
x(n)⟶FFTX(k)y(n)⟶FFTY(k)
Rxy(k)⇒Rxy(n)=X(k)Y(k)=Rxy(k)⟶IFFTRxy(n)
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
|
实现效果
自相关分析效果
互相关效果