我必须比较两个时间电压波形。由于这些波形来源的特殊性,其中一个可以是另一个的时移版本。
如何确定是否存在时移?如果是的话,多少钱。
我在 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/