我有点束缚-我太深了,无法快速应用另一种技术,所以这里什么也没做...
我正在通过以下方式进行行跟踪:将矩阵的每一行与下面的行相关,并采用相关的最大值来计算偏移量。除了当信号超出域的边缘时,它的效果非常好。它只是给出一个0。我怀疑这是因为简单地添加就位而不是将0移到边缘是有利的。这是导致问题的一些示例信号。这些信号不是零均值,但它们在我相关时(我减去平均值)。我得到了第三张图像的正确偏移量,但没有获得前两张图像的偏移量。
这是我的相关代码
x0 -= mean(x0)
x1 -= mean(x1)
x0 /= max(x0)
x1 /= max(x1)
c = signal.correlate(x1, x0, mode='full')
m = interp_peak_offset(c)
foffset =(m - len(x0) + 1) * (f[2] - f[1])
我已经尝试过将信号中的每一个都从20个样本中剪切掉,使信号的梯度相关联,而其他一些奇怪的方法也没有成功...
任何帮助将不胜感激!非常感谢!
答案 0 :(得分:0)
您应该寻找相位差,而不是寻找最大振幅。 这可以通过使用PHAT(相位变换)方法来实现:
def PHAT(x, y, fs, nperseg=50):
f, pxy = csd(x, y, fs=1.0, nperseg=nperseg, return_onesided=False)
pxy_phase = np.divide(pxy, np.abs(pxy))
gcc_fun = np.real(ifft(pxy_phase)) # generelized cross correlation.
TDOA = np.argmax(gcc_fun) / float(fs)
return TDOA
答案 1 :(得分:0)
我最终使两个向量之间的平均绝对差最小化。对于每个时移,我都计算了绝对差/重叠点数。这是我这样做的功能
def offset_using_diff(x0, x1, f):
#Finds the offset of x0 from x1 such that x0(f) ~ x1(f - foffset). Does so by
#minimizing the average absolute difference between the two signals, with one signal
#shifted.
#In other words, we minimize |x0 - x1|/N where N is the number of points overlapping
#between x1 and the shifted version of x0
#Args:
# x0,x1 (vector): data
# f (vector): frequency vector
#Returns:
# foffset (float): frequency offset
OMAX = min(len(x0) // 2, 100) # max offset in samples
dvec = zeros((2 * OMAX,))
offsetvec = arange(-OMAX + 1, OMAX + 1)
y0 = x0.copy()
y1 = x1.copy()
y0 -= min(y0)
y1 -= min(y1)
y0 = pad(y0, (100, 100), 'constant', constant_values=(0, 0))
y1 = pad(y1, (100, 100), 'constant', constant_values=(0, 0))
for i, offset in enumerate(offsetvec):
d0 = roll(y0, offset)
d1 = y1
iinds1 = d0 != 0
iinds2 = d1 != 0
iinds = logical_and(iinds1, iinds2)
d0 = d0[iinds]
d1 = d1[iinds]
diff = d0 - d1
dvec[i] = sum(abs(diff))/len(d0)
m = interp_peak_offset(-1*dvec)
foffset = (m - OMAX + 1)*(f[2]-f[1])
return foffset