我想找到两个时间戳数组之间的偏移量.它们可以代表两个音轨中的哔哔声.
注意:两个轨道中可能有额外或缺少的开始.
我找到了一些关于互相关的信息(例如https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar)看起来很有希望.
我假设每个音轨的持续时间为10秒,并将哔哔声表示为"方波"的峰值,采样率为44.1 kHz:
import numpy as np
rfft = np.fft.rfft
irfft = np.fft.irfft
track_1 = np.array([..., 5.2, 5.5, 7.0, ...])
# The onset in track_2 at 8.0 is "extra," it has no
# corresponding onset in track_1
track_2 = np.array([..., 7.2, 7.45, 8.0, 9.0, ...])
frequency = 44100
num_samples = 10 * frequency
wave_1 = np.zeros(num_samples)
wave_1[(track_1 * frequency).astype(int)] = 1
wave_2 = np.zeros(num_samples)
wave_2[(track_2 * frequency).astype(int)] = 1
xcor = irfft(rfft(wave_1) * np.conj(rfft(wave_2)))
offset …Run Code Online (Sandbox Code Playgroud) 我需要执行数组(向量)的自相关,但我找不到正确的方法.我相信我需要Accelerate Framework中的方法"vDSP_conv",但我无法按照如何成功设置它.最让我失望的是需要2个输入.也许我有错误的功能,但我找不到一个在单个矢量上运行的功能.
文档可以在这里找到
从网站复制
vDSP_conv
对两个向量执行相关或卷积; 单精度.
void vDSP_conv(const float __vDSP_signal [],vDSP_Stride __vDSP_signalStride,const float __vDSP_filter [],vDSP_Stride __vDSP_strideFilter,float __vDSP_result [],vDSP_Stride __vDSP_strideResult,vDSP_Length __vDSP_lenResult,vDSP_Length __vDSP_lenFilter);
参数
__vDSP_signal
Run Code Online (Sandbox Code Playgroud)Input vector A. The length of this vector must be at least __vDSP_lenResult + __vDSP_lenFilter - 1.__vDSP_signalStride
Run Code Online (Sandbox Code Playgroud)The stride through __vDSP_signal.__vDSP_filter
Run Code Online (Sandbox Code Playgroud)Input vector B.__vDSP_strideFilter
Run Code Online (Sandbox Code Playgroud)The stride through __vDSP_filter.__vDSP_result
Run Code Online (Sandbox Code Playgroud)Output vector C.__vDSP_strideResult
Run Code Online (Sandbox Code Playgroud)The stride through __vDSP_result.__vDSP_lenResult
Run Code Online (Sandbox Code Playgroud)The length of __vDSP_result.__vDSP_lenFilter
Run Code Online (Sandbox Code Playgroud)The length of __vDSP_filter.
举个例子,假设你有一个数组float x = …
对于matchTemplate()的CV_TM_CCORR_NORMED方法,我的老板和我不同意这是怎么回事; 在openCV中.
你能解释一下这里发生了什么,特别是这个等式的平方根方面.
我有两个相互关联的信号,它们同时被两个不同的测量设备捕获。由于这两个测量不是时间同步的,因此我想计算它们之间的时间延迟很小。此外,我需要知道哪个信号是领先的。
可以假设如下:
我认为为此目的使用互相关。非常感谢如何在 Python 中实现它的任何建议。
请让我知道我是否应该提供更多信息以找到最合适的算法。
我有大量的交叉相关来计算,我正在寻找最快的方法.我假设向量化问题会有所帮助,而不是用循环来做
我有一个标记为电极x时间点x试验的3D阵列(形状:64x256x913).我想计算每次试验时每对电极的时间点的最大互相关性.
具体来说:对于每次试验,我想取每对电极组合并计算每对的最大互相关值.这将导致单行/向量中的4096(64*64)个最大互相关值.这将针对每个试验进行,将每个行/向量堆叠在彼此之上,从而产生包含最大互相关值的最终2D阵列形状913*4096
这是很多计算,但我想尝试找到最快的方法来做到这一点.我使用列表作为容器来模拟一些原型代码,这可能有助于更好地解释问题.可能存在一些逻辑错误,但无论哪种方式代码都不能在我的计算机上运行,因为计算python只是冻结了这么多.就这个:
#allData is a 64x256x913 array
all_experiment_trials = []
for trial in range(allData.shape[2]):
all_trial_electrodes = []
for electrode in range(allData.shape[0]):
for other_electrode in range(allData.shape[0]):
if electrode == other_electrode:
pass
else:
single_xcorr = max(np.correlate(allData[electrode,:,trial], allData[other_electrode,:,trial], "full"))
all_trial_electrodes.append(single_xcorr)
all_experiment_trials.append(all_trial_electrodes)
Run Code Online (Sandbox Code Playgroud)
对于这类事情,显然循环非常慢.是否有使用numpy数组的矢量化解决方案?
我已经检查了像correlate2d()之类的东西,但我认为它们并不适用于我的情况,因为我没有将2个矩阵相乘
我有两条不规则的线作为 [x,y] 坐标列表,其中有波峰和波谷。列表的长度可能略有不同(不相等)。我想测量它们的相似性,以便检查峰和谷(具有相似的深度或高度)是否以适当的间隔出现并给出相似性度量。我想在 Python 中做到这一点。是否有任何内置功能可以做到这一点?
python signal-processing matplotlib correlation cross-correlation
ccf()我在使用(Python)库中的方法时遇到一些问题statsmodels。等效操作在 R 中运行良好。
ccf产生两个变量之间的互相关函数,在我的示例A中B。A我有兴趣了解领先指标的程度B。
我正在使用以下内容:
import pandas as pd
import numpy as np
import statsmodels.tsa.stattools as smt
Run Code Online (Sandbox Code Playgroud)
我可以模拟A如下B:
np.random.seed(123)
test = pd.DataFrame(np.random.randint(0,25,size=(79, 2)), columns=list('AB'))
Run Code Online (Sandbox Code Playgroud)
当我运行时ccf,我得到以下信息:
ccf_output = smt.ccf(test['A'],test['B'], unbiased=False)
ccf_output
array([ 0.09447372, -0.12810284, 0.15581492, -0.05123683, 0.23403344,
0.0771812 , 0.01434263, 0.00986775, -0.23812752, -0.03996113,
-0.14383829, 0.0178347 , 0.23224969, 0.0829421 , 0.14981321,
-0.07094772, -0.17713121, 0.15377192, -0.19161986, 0.08006699,
-0.01044449, -0.04913098, 0.06682942, -0.02087582, 0.06453489,
0.01995989, -0.08961562, 0.02076603, …Run Code Online (Sandbox Code Playgroud) 假设这两个系列是:
x = [4,4,4,4,6,8,10,8,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
y = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,8,10,8,6,4,4]
Run Code Online (Sandbox Code Playgroud)
系列 x 明显滞后 y 12 个时间段。但是,按照Python 互相关中的建议使用以下代码:
import numpy as np
c = np.correlate(x, y, "full")
lag = np.argmax(c) - c.size/2
Run Code Online (Sandbox Code Playgroud)
导致错误的滞后 -0.5。
这是怎么回事?
下图显示了两个半径相同的圆,使用抗锯齿渲染,只是左圆水平移动了一半像素(请注意,圆水平中心在左侧的像素中间,在右侧的像素边界处)。
如果执行互相关,则可以在相关数组上取最大值的位置,然后计算偏移。但是由于像素位置始终是整数,所以我的问题是:
“如何使用Numpy / Scipy中的互相关来获得两个图像之间的子像素(浮点)偏移?”
在我的脚本中,我使用scipy.signal.correlate2d或scipy.ndimage.filters.correlate,它们似乎产生相同的结果。
这里的圆圈只是示例,但是我特定于域的功能倾向于具有亚像素偏移,并且当前仅获得整数偏移会导致效果不佳...
任何帮助都感激不尽!

我找不到为什么计算两个系列A和B之间的相关性numpy.correlate给出的结果与我得到的结果不同的原因statsmodels.tsa.stattools.ccf
以下是我提到的这种差异的一个例子:
import numpy as np
from matplotlib import pyplot as plt
from statsmodels.tsa.stattools import ccf
#Calculate correlation using numpy.correlate
def corr(x,y):
result = numpy.correlate(x, y, mode='full')
return result[result.size/2:]
#This are the data series I want to analyze
A = np.array([np.absolute(x) for x in np.arange(-1,1.1,0.1)])
B = np.array([x for x in np.arange(-1,1.1,0.1)])
#Using numpy i get this
plt.plot(corr(B,A))
Run Code Online (Sandbox Code Playgroud)
#Using statsmodels i get this
plt.plot(ccf(B,A,unbiased=False))
Run Code Online (Sandbox Code Playgroud)

结果看起来质量上有所不同,这种差异来自哪里?
python ×8
numpy ×3
correlation ×2
statsmodels ×2
arrays ×1
c ×1
fft ×1
iphone ×1
lag ×1
matplotlib ×1
opencv ×1
python-2.7 ×1
scipy ×1
time-series ×1
waveform ×1