python的corr函数,python典型相关分析

  python的corr函数,python典型相关分析

  最近看kalibr源码的时候看到校准两个IMU的时间偏移就用了这样一个函数。

  #获取时移#使用互相关获取时移,参考我的博客# full将返回所有比较结果,前者(NP.size(absoluteomega) )- 1)表示absoluteomega()无效corr=NP。correlated) refer)、Full’)discrete _ shift=corr . arg max(--(NP . size(absolute omega)-1)# offset number # get cont . timeshift times=[fff diff(times))diff表示从后面的元素中减去前面的元素后的值,因为delta _ tshift=discrete _ shift * dt

  从这里转载互相关及其在Python中的实现。这里我想讨论一下“互相关”中的几个概念。为了让卷积有线性卷积和循环卷积的区别;互相关还包括线性互相关和循环互相关。线性互相关和循环互相关的基本公式是一样的,区别在于如何处理边界数据。本质区别在于对原始数据的看法不同。我想通过这篇文章梳理一下相关概念并举例说明。

  358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/Suppose我们手里有两组数据,分别有一个和一个具体操作,如图1和图2所示。这是在这两个序列中执行的“点积”操作。

  图一。线性互相关的计算过程简化

  图二。线性互相关结果序列中单个值的计算图像

  获取的互相关序列的全长,序列前后的值无效,聚合有效数据。线性互相关有效数据的第一分量的值是:

  1. ,即:

  一个简单的例子就是等式两边的运算得到的有效数据数量不一致。

  线性的实际意义是向量中与每个向量长度相同的子向量和向量的相似性。这样,中值最大的索引就是向量中最相似子向量的起始索引。通常,为了得到有效的互相关数据,我们总是用短数据来滑动长数据。

  并通过实际应用实例进行了验证。图3的第一副图显示雷达声纳发射探测信号。随着时间的推移,接收到如图3的第二子图所示的回波(具有一定的噪声)。此时,为了计算目标距离雷达的距离,需要注意如何确定回波何时是对探测信号的响应,使用线性互相关。第三个子图的“‘有效’”曲线是有效的互相关数据,其中清楚地出现了与检测信号相似的两个回波位置。

  图3。相关计算的一个例子:雷达回波分析

  线性关中有几个值得注意的概念:

  一个是线性相关(线性相关的计算公式。可见,为了计算完整的相关系数序列(包括这些“无效数据”的所有结果),需要使用几个“不存在”的点。这就需要人为的补充这些数值。在线性相关计算中,超出这些原始数据存储区域的值为零。

  第二个是Linear Cross-Correlation。从图1中可以看出,尾对尾互相关数据并没有完全“嵌入”两个原始序列的所有信息,而是或多或少地进行了人工补零。

  的影响。所以一般认为这些数据是没有的。

  三是计算模式的选择。这个问题其实是从问题二衍生出来的。就Python语言中的函数而言,至少有两个可以直接计算线性相关:

  numpy.correlate(a,v,mode)

  和

  scipy.signal.correlate(a,v,mode)

  他们的通话参数完全一样。通话时有三种模式可供选择。它们计算相同的内容,但返回值的长度不同:

  Mode= valid :只返回相关数据的有效部分,总计$ M-N 1 $;

  Mode= same :只返回与相同长度相关的$N$条数据;

  Mode= full :返回所有相关数据,总计M N-1个。

  图3的第三个子图显示了这三种模式的计算结果。在这个例子中,“有效”模式是最合适的。

  2. 循环互相关(Circular Cross-Correlation)的定义和计算循环互相关是表征两组等长周期性数据之间相似性的运算,它与线性互相关的区别也是由“等长”和“周期性”的特点造成的。在循环相关中,处理后的原始数据长度相等,即和。和序列之间的线性互相关运算表示为,结果也是一个序列,表示为。该公式与线性互相关一致:

  只有获得的互相关序列长度也是。互相关计算的具体过程如图4所示。注意,计算中应使用原始数据指标范围以外的数据,数据补充方式为“周期延拓”而非“补零”:即。这意味着循环互相关没有不同的计算模式,所有数据都是有效数据。

  图4。循环互相关计算过程示意图。

  注意,循环互相关也是不满足交换律

  这里给出一个循环相关的例子。两路原始数据分别由以下函数生成:

  如果将其视为线性系统的周期输入信号,则将其视为该线性系统的输出信号。由于外部干扰,输出信号并不完全由输入信号决定。此时循环互相关的实际意义在于区分输出信号的哪一部分(频率分量)是由输入信号产生的。

  图5。时域数据,从上到下:以及它们的循环互相关。

  图6。频谱,从上到下:以及它们的循环互相关

  从图5和图6可以看出,循环互相关的频谱准确地说明了那些测试信号的相关性。

  遗憾的是,Python的几个数值计算库中没有可以直接计算的循环相关函数。但是可用的(规范化的)cxcorr(a,v)函数可以用下面的代码构造:

  def cxcorr(a,v):

  nom=NP . linalg . norm(a[:])* NP . linalg . norm(v[:])

  return FFT pack . IR FFT(FFT pack . rfft(a)* FFT pack . rfft(v[:-1]))/nom

  图4中的数据是通过这个函数计算的。利用傅里叶变换和逆变换计算循环互相关,是可行的。它们之间的关系将在第四小节的问答中具体讨论。

  3. 用线性互相关处理周期性信号实际上,线性相关也可以处理周期信号,前提是将两组信号采样成长度相差较大的序列。这样,其有效的线性互相关也可以完美地反映数据之间的相关性。

  同样使用第2节中的例子。此时,为了保证足够有效的线性互相关数据,两组数据的长度故意不一致(但都足以表征其特征),如图7所示。它们的光谱如图8所示,仍然完美地反映了测试数据的相关性。

  图7。时域数据,从上到下:与其线性交叉相关

  图8。频谱,从上到下:和它们的线性互相关

  既然线性互相关也可以处理周期性数据,为什么我们还需要一个基于等长序列和周期性扩展的循环互相关?其实就像后面QA里具体讨论的,这是用快速傅立叶变换来加速计算。

  4. 相关问题QA迄今为止,总结了两种常用的互相关评价方法及其计算。然而,仍有一些细节有待解决。例如,序列和之间互相关的计算公式:

  卷积的定义是:

  同样,如果我们再想到傅里叶变换的卷积定理,至少会出现以下问题:

  Q.1:他们之间有更深层次的联系吗?A.1:参考文献[1]的答案很坚决:“不要让卷积和互相关的数学相似性迷惑了你,它们描述了不同的信号处理过程。它是卷积系统的输入信号、输出信号和脉冲响应之间的关系。互相关是一种在噪声背景下检测已知信号的方法。两者在数学上的相似只是巧合。”其实只要注意卷积操作是满足交换律的,互相关运算不满足交换律。仅这一点就可以解释他们根本不同。

  Q.2:利用Python中计算卷积的函数可以计算互相关吗?A.2:可以,但是只能用以计算线性互相关。Python中的numpy.convolve()函数可以计算两个序列之间的卷积。在计算卷积的过程中,还会自动执行零填充(而不是周期延拓,这就是为什么只能计算线性相关的原因)。这种卷积有时被称为线性卷积,还涉及到末端效应、有效数据长度等考虑因素。具体地,根据相关和卷积的表达式,如果希望计算序列和之间的线性互相关序列。等价地,只需要计算序列和之间的卷积。它的意思是序列的“反转”,即序列[1,2,3]到[3,2,1]的反转。

  Q.3:能否根据大眼包络叶变换性质中的卷积定理,利用大眼包络叶的正/逆变换计算互相关?A.3:可以,但是只能用于计算循环互相关。眼睛的大包络叶变换卷积定理中涉及的卷积是循环卷积。它不同于线性卷积。其实区别不在于卷积本身。它们的公式是一样的,只是如何看待卷积计算涉及的数据。线性卷积认为所有参与计算的数据都是零,而循环卷积认为参与计算的数据是无限循环的一段,3354。这导致他们完成“越界”数据的方式不同。就像线性互相关和循环互相关的区别一样!首先将循环互相关等效为一个循环卷积,然后通过快速傅里叶变换计算卷积。实际上,本文给出的cxcorr(a,v)函数就是利用这个性质来计算循环相关的。运算速度的提升是相当明显的。

  Q.4:如何归一化互相关比较数据?A.4:根据参考文献[4],使用公式:

  史蒂文史密斯。数字信号处理:工程和科学家实用指南[M]。

  智能钥匙,勤劳的钻石等。实用数字信号处理,从原理到应用[M]。人民邮电出版社,北京,2

  [2]马克欧文。实用信号处理[M]。

  赵霖译。实用信号处理[M]。电子工业出版社,北京,2009。

  [3]关于MATLAB中xcorr()的讨论

  http://www.mathworks.cn/cn/help/signal/ref/xcorr.html

  [4]关于MATLAB中cxcorr()的讨论

  http://www . mathworks . com/MATLAB central/file exchange/4810-循环-互相关

  [5]在线论坛Stackoverflow讨论了这个问题。

  http://stack overflow . com/questions/6991471/计算-互相关-函数

  http://stack overflow . com/questions/12323959/python中的快速互相关方法

  http://stack overflow . com/questions/9281102/n-fold-FFT-卷积和循环重叠

  http://stack overflow . com/questions/6855169/卷积计算-in-numpy-scipy

  http://stack overflow . com/questions/4688715/find-time-shift-two-similar-waveforms

  [6]关于互相关的定义

  http://mathworld.wolfram.com/Cross-Correlation.html

  http://paulbourke.net/miscellaneous/correlate/

  http://en.wikipedia.org/wiki/Cross-correlation

  [7]循环互相关的定义

  http://en.wikipedia.org/wiki/Circular_convolution

  http://cnx.org/content/m22974/latest/

  再附上一篇关于互相关的文章。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: