信号(互)相关及其应用 您所在的位置:网站首页 互相关函数有什么用途 信号(互)相关及其应用

信号(互)相关及其应用

2024-07-09 18:34| 来源: 网络整理| 查看: 265

原文地址:

http://blog.csdn.net/xiahouzuoxin/article/details/19286077

在信号处理中,经常要研究两个信号的相似性,或者一个信号经过一段时间延迟后自身的相似性,以便实现信号检测、识别与提取等。

可用于研究信号相似性的方法称为相关,该方法的核心概念是相关函数和互相关函数。

1 相关函数定义

无限能量信号,信号x(n)与y(n)的互相关函数定义为

等于将x(n)保持不动,y(n)左移m个抽样点后,两个序列逐点对应相乘的结果。

当x(n)与y(n)不是同一信号时,rxy中的x、y顺序是不能互换等价的。

当x(n)与y(n)为同一信号时,记

为信号x(n)的自相关函数在m时刻的值。自相关函数反映了x(n)和其自身发生m个采样点平移后的相似程度。

可以想象,当m=0时,即原信号不做任何平移,一一对应的叠加时rx(m)值最大,这个结论很重要。

对于有限能量信号或周期信号,设信号为复信号,自相关函数和互相关函数可表达为

注意:

(1)m的取值范围可以从-(N-1)到(N-1),对于N点信号,rx共可计算得2N-1点相关函数结果值

(2)对于给定的m,因为实际信号总是有限长的N,所以要计算rx(m),n+m=N-1,因此实际写程序时注意n的实际可取长度为N-1-m

(3)当m值越大时,对于N点有限长信号,可用于计算的信号长度越短,计算出的rx(n)性能越差,因此实际应用中常令m0; k--) {  /* -(N-1)~0 PART */          kk = n-1-k;          r[kk].real = 0.0;          r[kk].imag = 0.0;          for (j=k; j xcorr(x,y) ans =    30.0000   31.0000   37.0000   42.0000   54.0000   37.0000   24.0000   11.0000    4.0000

结果一致,只是存储顺序相反。

3 使用FFT计算相关函数

采用暴力的按定义计算信号相关的方法的计算复杂度约O(N^2),当数据点数N很大时,尤其在DSP上跑时耗时过长,因此采用FFT和IFFT计算互相关函数显得尤为重要。

那么,互相关函数与FFT之间又是一种什么样的关系呢?

设y(n)是x(n)与h(n)的互相关函数,

则,

诶,这不对啊,不是说两个信号时域的卷积才对应频域的乘积吗?难道时域的互相关和时域的卷积等价了不成??

这里说明下,通过推倒可以得到,相关于卷积的关系满足:

不管如何,与直接卷积相差一个负号。这时,看清楚了,相关函数在频域也不完全是乘积,是一个信号的共轭再与原信号乘积,这就是与“时域卷积频域相乘不同的地方”。

所以,请记住这个有用的结论,

两个信号的互相关函数的频域等于X信号频域的共轭乘以Y信号的频域。

我们就有计算互相关的新方法了:将信号x(n)和h(n)都进行FFT,将FFT的结果相乘计算得互相关函数的FFT,在进行逆变换IFFT得到互相关函数y(m)。

[cpp] view plain copy print ? 在CODE上查看代码片 派生到我的代码片 typedef complex TYPE_CORREL;    /*  * @brief  To estimate the biased cross-correlation function  *   of TYPE_CORREL arrays x and y.   *   the result will store in x, size of x must be >=2*m  * @input params       x : n dimensioned TYPE_CORREL array.       y : n dimensioned TYPE_CORREL array.      m : the dimension of x and y.          n : point numbers of correlation.      icorrel: icorrel=1, cross-correlation; icorrel=0, auto-correlation  * @retval None  *  * ====  * TEST OK 2013.01.14  */  void zx_xcorrel(TYPE_CORREL x[], TYPE_CORREL y[], int m, int n, int icorrel)  {      int s,k;      TYPE_CORREL z;        assert_param(n >= 2*m);        /* n must be power of 2 */      s = n;      do {          s = s >> 1;          k = s - 2;      } while (k > 0);      if (k 0); if (k


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有