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

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

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)性能越差,因此实际应用中常令m<<N

(4)Matlab自带的xcorr函数可用于计算互相关,但计算结果是没有除以N的结果。

2 基于定义的相关函数计算

[cpp] view plaincopyprint?
  1. /*
  2. * FileName : correl.c
  3. * Author   : xiahouzuoxin    xiahouzuoxin@163.com
  4. * Date     : 2014/2/16
  5. * Version  : v1.0
  6. * Compiler : gcc
  7. * Brief    :
  8. */
  9. #include <stdio.h>
  10. typedef struct {
  11. float real;
  12. float imag;
  13. } complex;
  14. static void assert_param(int32_t x)
  15. {
  16. }
  17. /*---------------------------------------------------------------------
  18. Routine CORRE1:To estimate the biased cross-correlation function
  19. of complex arrays x and y. If y=x,then it is auto-correlation.
  20. input parameters:
  21. x  :n dimensioned complex array.
  22. y  :n dimensioned complex array.
  23. n  :the dimension of x and y.
  24. lag:point numbers of correlation.
  25. output parameters:
  26. r  :lag dimensioned complex array, the correlation function is
  27. stored in r(0) to r(lag-1).
  28. ---------------------------------------------------------------------*/
  29. void corre1(complex x[],complex y[],complex r[],int n,int lag)
  30. {
  31. int m,j,k,kk;
  32. assert_param(lag >= 2*n-1);
  33. for (k=n-1; k>0; k--) {  /* -(N-1)~0 PART */
  34. kk = n-1-k;
  35. r[kk].real = 0.0;
  36. r[kk].imag = 0.0;
  37. for (j=k; j<n; j++) {
  38. r[kk].real += y[j-k].real*x[j].real+y[j-k].imag*x[j].imag;
  39. r[kk].imag += y[j-k].imag*x[j].real-y[j-k].real*x[j].imag;
  40. }
  41. //        r[kk].real=r[kk].real/n;
  42. //        r[kk].imag=r[kk].imag/n;
  43. }
  44. for (k=0; k<n; k++) {  /* 0~(N-1) PART */
  45. kk = n-1+k;
  46. m = n-1-k;
  47. r[kk].real = 0.0;
  48. r[kk].imag = 0.0;
  49. for (j=0; j<=m; j++) {
  50. r[kk].real += y[j+k].real*x[j].real+y[j+k].imag*x[j].imag;
  51. r[kk].imag += y[j+k].imag*x[j].real-y[j+k].real*x[j].imag;
  52. }
  53. //        r[kk].real=r[kk].real/n;
  54. //        r[kk].imag=r[kk].imag/n;
  55. }
  56. return;
  57. }
  58. #define SIG_N    5
  59. complex x[SIG_N];
  60. complex y[SIG_N];
  61. complex r[2*SIG_N-1];
  62. int main(void)
  63. {
  64. int i = 0;
  65. x[1].real = 1;
  66. x[2].real = 2;
  67. x[3].real = 3;
  68. x[4].real = 4;
  69. x[0].real = 5;
  70. x[1].imag = 0;
  71. x[2].imag = 0;
  72. x[3].imag = 0;
  73. x[4].imag = 0;
  74. x[0].imag = 0;
  75. y[1].real = 2;
  76. y[2].real = 4;
  77. y[3].real = 5;
  78. y[4].real = 6;
  79. y[0].real = 1;
  80. y[1].imag = 0;
  81. y[2].imag = 0;
  82. y[3].imag = 0;
  83. y[4].imag = 0;
  84. y[0].imag = 0;
  85. corre1(x,y,r,5,9);
  86. for (i=0; i<2*SIG_N-1; i++) {
  87. printf("r[%d].real=%.2f, r[%d].imag=%.2f\n", i, r[i].real, i, r[i].imag);
  88. }
  89. }

运行输出结果如下,
r[0].real=4.00, r[0].imag=0.00
r[1].real=11.00, r[1].imag=0.00
r[2].real=24.00, r[2].imag=0.00
r[3].real=37.00, r[3].imag=0.00
r[4].real=54.00, r[4].imag=0.00
r[5].real=42.00, r[5].imag=0.00
r[6].real=37.00, r[6].imag=0.00
r[7].real=31.00, r[7].imag=0.00
r[8].real=30.00, r[8].imag=0.00

从0~8依次存储的是m=-(N-1)到(N-1)的结果。为验证正确性,我们不妨用matlab自带的xcorr计算

>> y = [1 2 4 5 6]
y =
     1     2     4     5     6
>> x = [5 1 2 3 4]
x =
     5     1     2     3     4

>> 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 plaincopyprint?
  1. typedef complex TYPE_CORREL;
  2. /*
  3. * @brief  To estimate the biased cross-correlation function
  4. *   of TYPE_CORREL arrays x and y.
  5. *   the result will store in x, size of x must be >=2*m
  6. * @input params
  7. x : n dimensioned TYPE_CORREL array.
  8. y : n dimensioned TYPE_CORREL array.
  9. m : the dimension of x and y.
  10. n : point numbers of correlation.
  11. icorrel: icorrel=1, cross-correlation; icorrel=0, auto-correlation
  12. * @retval None
  13. *
  14. * ====
  15. * TEST OK 2013.01.14
  16. */
  17. void zx_xcorrel(TYPE_CORREL x[], TYPE_CORREL y[], int m, int n, int icorrel)
  18. {
  19. int s,k;
  20. TYPE_CORREL z;
  21. assert_param(n >= 2*m);
  22. /* n must be power of 2 */
  23. s = n;
  24. do {
  25. s = s >> 1;
  26. k = s - 2;
  27. } while (k > 0);
  28. if (k<0) return;
  29. /* Padding 0 */
  30. for (k=m; k<n; k++) {
  31. x[k].real = 0.;
  32. x[k].imag = 0.0f;
  33. }
  34. fft(x, n);
  35. if (1 == icorrel) {
  36. /* Padding 0 */
  37. for (k=m; k<n; k++) {
  38. y[k].real = 0.;
  39. y[k].imag = 0.0f;
  40. }
  41. fft(y, n);
  42. /* conjuction */
  43. for (k=0; k<n; k++) {
  44. z.real = x[k].real;
  45. z.imag = x[k].imag;
  46. x[k].real = (z.real*y[k].real + z.imag*y[k].imag)/(float)m;
  47. x[k].imag = (z.real*y[k].imag - z.imag*y[k].real)/(float)m;
  48. }
  49. } else {
  50. for (k=0; k<n; k++) {
  51. x[k].real = (x[k].real*x[k].real+x[k].imag*x[k].imag) / (float)(m);
  52. x[k].imag = 0.0f;
  53. }
  54. }
  55. ifft(x, n);
  56. return;
  57. }

FFT的程序参考本博客内博文FFT算法的完整DSP实现。

Matlab中自带的xcorr也是通过FFT实现的互相关函数计算,这将互相关函数计算的复杂度降低到

4 应用

互相关函数有许多实际的用途,比如通过不同的传感器检测不同方向到达的声音信号,通过对不同方位传感器间的信号进行互相关可计算声音到达不同传感器间的时延。自相关函数还可以用来计算周期信号的周期。对此,有时间将还会对此进行详细研究。

参考资料

[1] 《数字信号处理——理论、算法与实现》,胡广书
[2]  刘永春,陈琳. 基于广义互相关时延估计算法声源定位的研究.
[3]  金中薇,姜明顺等. 基于广义互相关时延估计算法的声发射定位技术. 传感技术学报. 第26卷11期,2013年11月.

数字信号处理中的自相关和互相关计算和物理意义(二)相关推荐

  1. 数字信号处理中的自相关和互相关计算和物理意义(一)

    1.首先说说自相关和互相关的概念.     这个是信号分析里的概念,他们分别表示的是两个时间序列之间和同一个时间序列在任意两个不同时刻的取值之间的相关程度,即互相关函数是描述随机信号x(t),y(t) ...

  2. 用MATLAB绘制国债NSS模型,Matlab在数字信号处理中的运用.ppt

    <Matlab在数字信号处理中的运用.ppt>由会员分享,可在线阅读,更多相关<Matlab在数字信号处理中的运用.ppt(68页珍藏版)>请在装配图网上搜索. 1.第七讲 M ...

  3. 数字信号处理中的 SIMD

    系列文章目录 数字信号处理中的 SIMD Neon intrinsics 简明教程 文章目录 系列文章目录 0. 1. 前言 2. SIMD 是什么 3. SIMD 伪代码示例 4. SIMD 是如何 ...

  4. 数字信号处理中卷积的计算

    数字信号处理的一条原则呢就是把信号分解成一个一个的脉冲信号,输入到系统之后得到输出响应,再把这些输出响应做一个线性的叠加就可以得到真是的响应了.这一点是非常重要的,不管是卷积还是傅里叶变换,本质就是这 ...

  5. 【数字信号处理】相关函数应用 ( 使用 matlab 计算相关函数 )

    文章目录 一.相关函数应用场景 1.生成高斯白噪声 2.信噪比 SNR 3.根据信噪比 SNR 求信号幅度 4.产生单载波信号及最终信号 5.求自相关函数及功率 6.matlab 完整代码 一.相关函 ...

  6. 序列的自相关和互相关计算

    -- Ref [1] [2] [3] ------------------------------------------------------------------------ 1.自相关和互相 ...

  7. 归一化数字角频率_数字信号处理中的各种频率

    在学习数字信号处理时,很多种频率很容易搞混淆,有模拟/数字/频率/角频率等等,也不是特别清楚不同频率之间的关系,希望这篇文件可以为各种频率来个了结. 4种频率及其数量关系 实际物理频率表示物理信号的真 ...

  8. c语言复数序列求自相关,序列的自相关和互相关计算

    -- Ref [1] [2] [3] ------------------------------------------------------------------------ 1.自相关和互相 ...

  9. 数字信号处理中的归一化频率

    4种频率及其数量关系 实际物理频率表示AD采集物理信号的频率,fs为采样频率,由奈奎斯特采样定理可以知道,fs必须≥信号最高频率的2倍才不会发生信号混叠,因此fs能采样到的信号最高频率为fs/2. 角 ...

最新文章

  1. DCN-2655 gre隧道 vpn 嵌入IPSec配置:
  2. Android 动画小知识点
  3. 第十五届全国大学生华东赛赛区开赛啦
  4. 空洞卷积aspp 学习笔记
  5. MySQL 第二篇:增删改查
  6. 剑指Offer之字符串的排列
  7. Git 提交 .gitignore文件
  8. [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看
  9. jsk Star War (线段树维护区间最小最大值 + 二分)
  10. C语言 while 循环 - C语言零基础入门教程
  11. Red 编程语言 2019 开发计划:全速前进!
  12. 比特币、以太坊、瑞波币、万融链和区块链
  13. Linux运维之道(大量经典案例、问题分析,运维案头书,红帽推荐)
  14. BT3下载 与 BT3 U盘版制作
  15. 面试经验|华为二面分享 真难ε=(´ο`*)))唉
  16. python 新词发现
  17. sql server中如何修改视图中的数据?
  18. PIE-Engine上传矢量数据
  19. react的SSR(2)
  20. wordcloud出错_我在安装wordcloud时出错

热门文章

  1. 这道题你怎么看?长春理工大学2021电子竞赛
  2. SP-1CL3 陶瓷接收管 光电接收二极管 红外线接收管
  3. 对于初学者十条PCB元器件摆放小技巧
  4. img下面的png图片 vs 读不出来_VUX中XImg组件加载图片不正确,BusPlugin不好使,求解...
  5. oracle imp 00028,oracle中导入.dmp文件时出现IMP-00009 和IMP-00028异常提示
  6. ueditor编辑器java使用_ueditor编辑器的用法图文教程
  7. php try 并回滚,ThinkPHP异常处理、事务处理(事务回滚)
  8. python统计文件行数检测字符串_python统计文件中的字符串数目示例
  9. 为什么有TCP 的三次握手 和 四次挥手
  10. Android多个权限多次请求,android – 获取W / Activity:一次只能请求一组权限