python - 找出两个相似波形之间的时间偏移

标签 python numpy signal-processing correlation

我必须比较两个时间电压波形。由于这些波形来源的特殊性,其中一个可以是另一个的时移版本。

如何确定是否存在时移?如果是的话,多少钱。

我在 Python 中执行此操作,并希望使用 numpy/scipy 库。

最佳答案

scipy 提供了一个相关函数,该函数适用于小输入,并且如果您想要非循环相关,这意味着信号不会环绕。请注意,在 mode='full' 中,signal.correlation 返回的数组大小是信号大小的总和减一(即 len(a) + len(b) - 1 ),所以 argmax 的值与您预期的相差(信号大小 -1 = 20)

from scipy import signal, fftpack
import numpy
a = numpy.array([0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0, 0, 0, 0, 0])
b = numpy.array([0, 0, 0, 0, 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0])
numpy.argmax(signal.correlate(a,b)) -> 16
numpy.argmax(signal.correlate(b,a)) -> 24

这两个不同的值对应移位是在a还是b

如果您想要循环相关和大信号大小,您可以使用卷积/傅里叶变换定理,但需要注意的是,相关性与卷积非常相似但不完全相同。

A = fftpack.fft(a)
B = fftpack.fft(b)
Ar = -A.conjugate()
Br = -B.conjugate()
numpy.argmax(numpy.abs(fftpack.ifft(Ar*B))) -> 4
numpy.argmax(numpy.abs(fftpack.ifft(A*Br))) -> 17

同样,这两个值对应于您解释的是 a 中的转变还是 b 中的转变。

负共轭是由于卷积翻转了其中一个函数,但在相关性中没有翻转。您可以通过反转其中一个信号然后进行 FFT 或对信号进行 FFT 然后进行负共轭来撤消翻转。即以下情况为真:Ar = -A.conjugate() = fft(a[::-1])

关于python - 找出两个相似波形之间的时间偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4688715/

相关文章:

python - 在 2D 数组上向量化 NumPy 三重积

c# - 如何在.Net 中进行实时音高检测?

c++ - 如何使用 kissFFT 计算峰值?

python - 时间序列、趋势和趋势偏差

Python Beautiful Soup 最有效的查找标签的方法

python - 与 houghlines opencv+python 平行的线

python - 如何在 openCV python 中使用 HoughLines 变换准确检测线条?

python - 根据 True/False "sets"在 pandas dataframe 中添加后续值

python - 在没有循环的 Numpy 中添加子矩阵

python - Python-与平台无关的5.1声音库