相关性(偏移检测)问题-信号功率集中在域的边缘

时间:2018-08-22 19:04:59

标签: image-processing signal-processing fft correlation cross-correlation

我有点束缚-我太深了,无法快速应用另一种技术,所以这里什么也没做...

我正在通过以下方式进行行跟踪:将矩阵的每一行与下面的行相关,并采用相关的最大值来计算偏移量。除了当信号超出域的边缘时,它的效果非常好。它只是给出一个0。我怀疑这是因为简单地添加就位而不是将0移到边缘是有利的。这是导致问题的一些示例信号。这些信号不是零均值,但它们在我相关时(我减去平均值)。我得到了第三张图像的正确偏移量,但没有获得前两张图像的偏移量。

Sample Bad signal 1

Sample Bad signal 2

Good Signal 1

这是我的相关代码

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个样本中剪切掉,使信号的梯度相关联,而其他一些奇怪的方法也没有成功...

任何帮助将不胜感激!非常感谢!

2 个答案:

答案 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