【问题标题】:Using cross correlation in python在python中使用互相关
【发布时间】:2021-11-19 03:46:44
【问题描述】:

我正在尝试解决一个相关问题,我需要找到在信号序列中找到模式序列的位置。在某些时候,我能够找到正确的解决方案,只是开始尝试优化代码,而我完成的代码没有保存。现在互相关函数无法正确求解,我不知道为什么。我已经多次重启内核了。

这里是代码和包含信号和模式的文本文件的链接。

https://drive.google.com/file/d/1tBzHMUfmcx_gGR0arYPaQ5GB9MybXKRv/view?usp=sharing https://drive.google.com/file/d/1TeSe9t8TeVHEp2BxKXYz6Ndlpah--yLg/view?usp=sharing

import numpy as np
import matplotlib.pyplot as plt

patron = np.loadtxt('patron.txt', delimiter=',', skiprows=1)
senal = np.loadtxt('señal.txt', delimiter=',', skiprows=1)
Fs=100
ts = np.arange(0,len(senal))

plt.figure(figsize=(20,8))
plt.subplot(3,1,1)
plt.plot(ts,patron)
plt.subplot(3,1,2)
plt.plot(ts,senal)


corr = np.correlate(senal,patron,"same")
print(np.where(corr == np.amax(corr))) #this should be where correlation reaches its maximum value, and where the functions are most "similar"

plt.subplot(3,1,3)
plt.plot(ts,corr, 'r')

我怎么知道我做对了?我绘制了移动了 799 个位置的“senal”序列(代码正确时的值):

np.roll(senal,799)
plt.plot(senal)

这导致了这个图表。当它在索引 799 处产生最大相关性时,它看起来非常直观:

【问题讨论】:

    标签: python numpy jupyter-notebook jupyter cross-correlation


    【解决方案1】:

    您好,我在关联函数函数中翻转了 'patron' 和 'senal' 值,看起来不错:

    import numpy as np
    import matplotlib.pyplot as plt
    
    patron = np.loadtxt('patron.txt', delimiter=',', skiprows=1)
    senal = np.loadtxt('señal.txt', delimiter=',', skiprows=1)
    Fs=100
    ts = np.arange(0,len(senal))
    
    plt.figure(figsize=(20,8))
    plt.subplot(3,1,1)
    plt.plot(ts,patron)
    plt.subplot(3,1,2)
    plt.plot(ts,senal)
    
    
    corr = np.correlate(patron,senal,'same')
    print(np.argmax(corr)) #this should be where correlation reaches its maximum value, and where the functions are most "similar"
    
    plt.subplot(3,1,3)
    plt.plot(corr, 'r')
    

    【讨论】:

    • 感谢您的调查。你是对的,根据相关性的 numpy 文档,我应该将顾客序列作为 np.correlate 函数的第二个参数。但是我仍然不明白如何提取我之前得到的 799 位移,这看​​起来太巧合了,不可能是错误的。我通过切换 correlate 内部的序列并检查其最大值得到的索引仍然让我得到一个我无法理解的奇怪索引。
    • 我不知道您为什么认为 799 指数是一个很好的值,如果您查看 799 点的信号轴,信号看起来根本不一样。在我发布的示例中,它们更接近。我不知道您是否有另一个处理步骤可能会计算滞后并更好地重新调整它们?
    • 因为这就是我在某个时候得到的,所以将顾客序列移动了那个数量,它看起来是一样的。另外,我刚刚得到了问题的解决方案,它是 800(相差一个位置),只是我自己无法解决它。可能存在一些我对相关性不了解的理论问题。并不是说在 799 处序列看起来相同,而是 799 位赞助人位置的变化使其看起来与 senal 相同,就像我在上一张图中显示的那样。
    • @GustavoHenriqueFossNeves 是的,我明白如果您将信号移动 799,您会说它看起来很相似,但如果您实际上查看 799 点在图表上的位置,则信号根本不是对齐的位置。点 799 更左边。但也许你正在以不同的方式转移信号而我不知道,如果它工作正常就可以了。如果其他人有同样的问题,您可以发布答案吗?我也想看看有什么不同。
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2012-09-01
    相关资源
    最近更新 更多