scipy Python中两信号的归一化互相关

tgabmvqs  于 2022-11-10  发布在  Python
关注(0)|答案(2)|浏览(196)

我想计算两个信号的归一化互相关函数,其中“x”轴是时间延迟,“y”轴是-11之间的相关值。所以我决定使用scipy。
我使用命令corr = signal.correlate(s1['Strain'], s2['Strain'], mode='full')
其中,s1['Strain']s2['Strain']是Pandas Dataframe 值,但它不返回以“x”轴作为时间延迟的归一化函数。

s1:

            Strain
0        -1.587702e-22
1        -1.425868e-22
2        -1.174897e-22
3        -8.559119e-23
4        -4.949480e-23
.             .
.             .
.             .

对于s2,它看起来很相似。我知道两个数据集的采样,都是4096 kHz。
谢谢你的帮助。

djmepvbi

djmepvbi1#

首先得到归一化系数(这样当滞后为0时,我们得到Pearson相关系数):

  • 将两个信号除以它们的标准偏差
  • 按完成卷积的信号的长度缩放(最短信号)
out = correlate(x/np.std(x), y/np.std(y), 'full') / min(len(x), len(y))

现在对于滞后,从official documentation of correlate可以读出互相关的完整输出由下式给出:

z[k] = (x * y)(k - N + 1)
     = \sum_{l=0}^{||x||-1}x_l y_{l-k+N-1}^{*}\]

其中*表示卷积,k精确地从0到||x|| + ||y|| - 2。N是max(len(x), len(y))
滞后在上面被表示为卷积(x * y)的自变量,因此它们的范围从0 - N + 1||x|| + ||y|| - 2 - N + 1,即n - 1n=min(len(x), len(y))
此外,通过简单查看源代码,我认为如果方便的话,他们有时会交换xy ......(因此在上面的标准化中使用min(len(x), len(y))。然而,这意味着要更改滞后的开始,因此:

N = max(len(x), len(y))
n = min(len(x), len(y))

# if len(x) < (len(y):

lags = np.arange(-N + 1, n)

# else:

lags = np.arange(-n + 1, N)

摘要

在两个时间序列上检查此代码,您要绘制以下项的交叉相关性:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import correlate

def plot_xcorr(x, y): 
    "Plot cross-correlation (full) between two signals."
    N = max(len(x), len(y)) 
    n = min(len(x), len(y)) 

    if N == len(y): 
        lags = np.arange(-N + 1, n) 
    else: 
        lags = np.arange(-n + 1, N) 
    c = correlate(x / np.std(x), y / np.std(y), 'full') 

    plt.plot(lags, c / n) 
    plt.show()
vmjh9lq9

vmjh9lq92#

为了计算两个信号之间的时间延迟,我们需要找到两个信号之间的互相关,并找到argmax。
假设data_1data_2是两个信号的样本:

import numpy as np 
import pandas as pd

correlation = np.correlate(data_1, data_2, mode='same')
delay = np.argmax(correlation) - int(len(correlation)/2)

相关问题