MATLAB计算自相关函数和互相关函数

  • 转自http://blog.sina.com.cn/s/blog_737adf530100ytsl.html
  • 要求:t[n]=f(n)*g(n),把g(n)翻转,向右移动n格与f(n)的乘积和。
  • 假设f(n)长度为L,g(n)长度为P,则卷积后的有效点数为L+P-1,其余为全零。
  • 由傅里叶变换定理:时域卷积等效于频域乘积,即 T(e^jw)=F(e^jw)G(e^jw)。用w=(2*pi/N)k,代替可得:T~[k]=F~[k]G~[k],取k=0-N-1则可得到T[k]=F[k]G[k]。
  • 一个“周期序列”的DFS相当于对“一个周期”的序列傅里叶变换做频域抽样w=(2*pi/N)k,且抽样后满足x~[n]=∑x[n-rN]。N为周期。
  • 由于DFS无论时域还是频域都可以用N个点表示所有信息,所以定义DFT,只取时域N个点并对应频域N个点,借助DFS便可相互恢复。方法为取x~[n]从0到N-1即可。
  • 计算F[k]G[k],首先要保证N>=L+P-1,则将f(n)、g(n)补全至长度N,补零。

二、自相关函数:定义f(t)*f(-t)   ∫f(t)f(t-α)

    互相关函数:定义f(t)*g(-t)   ∫f(t)g(t-α)

 

MATLAB实现:例如A=[1 2 3]

 自相关函数应该为:n=-2 -1 0 1 2 对应 值为 3 8 14 8 3

 

    1. 使用xcorr函数:

       xcorr(A)= 3.0000    8.0000   14.0000    8.0000    3.0000

    2. 自己使用FFT实现:

       基本原理是两信号的FFT乘积相当于时域卷积结果的∑x[n-rN]。

       原本卷积过程是y轴对称的平移相称,而这里自相关和互相关不要求y轴翻转过程,相当于t(-n)的卷积过程;t(-n)对应的是X(e-jw),如果是实数即为conj(X(ejw))

       conj()求复数共轭

       若直接ifft(fft(A).*conj(fft(A))),得到 k=0 1 2  对应值  14 11 11,明显因x[n]长度为5,而这里N=3使得∑x[n-rN]混叠了了;其实,两个等长的序列的FFT点乘得到的是时域以此长度为周期,循环卷积的结果。

       因此令B=[A 0 0]补成一个周期长度N=5,这样虽然依然混叠(不可避免),但是混叠的区间都是值为0的。没有关系,反而得到了k=-2 -1的值,在k=3、4无失真显示。

       B=[A 0 0]

       ifft(fft(B).*conj(fft(B)))

       得到:14     8     3     3     8 和上面分析一样

 

三、小m序列生成:查书可得生成多项式的抽头系数,线性循环寄存器产生出来即可,寄存器初始状态不影响小m序列,仅仅是造成一个移位而已。

    Gold序列生成:找到优选对的小m的序列进行模2加即可。

你可能感兴趣的:(MATLAB计算自相关函数和互相关函数)