【问题标题】:The normalized cross-correlation of two signals in pythonpython中两个信号的归一化互相关
【发布时间】:2020-07-20 01:08:13
【问题描述】:

我想计算两个信号的归一化互相关函数,其中“x”轴是时间延迟,“y”轴是-11 之间的相关值。所以我决定使用 scipy。

我使用命令corr = signal.correlate(s1['Strain'], s2['Strain'], mode='full')

其中s1['Strain']s2['Strain'] 是pandas 数据帧值,但它不会返回带有“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。

感谢您的帮助。

【问题讨论】:

  • 如果您可以为s1s2 提供一些示例数据并显示它确实返回的内容以及您所期望的内容,将会有所帮助。

标签: python scipy correlation cross-correlation


【解决方案1】:

首先得到归一化系数(比如滞后0,我们得到皮尔逊相关性):

  • 将两个信号除以它们的标准差
  • 按进行卷积的信号长度(最短信号)进行缩放
out = correlate(x/std(x), y/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 / std(x), y / std(y), 'full') 

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

【讨论】:

    【解决方案2】:

    要计算两个信号之间的时间延迟,我们需要找到两个信号之间的互相关并找到argmax。

    假设data_1data_2 是两个信号的样本:

    import numpy as np 
    import pandas as pd
    
    correlation = np.correlate(data_1,data_2,mode='same')
    delay = np.argmax(correltion)-int(len(correlation)/2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-03
      • 2018-05-27
      • 2017-07-24
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多