相关(偏移检测)问题 - 信号功率集中在域的边缘
Correlation (offset detection) issues - Signal power concentrated at edge of domain
我有点手足无措 - 我太深了,无法快速应用另一种技术,所以这里什么也没有...
我正在通过将矩阵的每一行与下面的行相关联并采用相关性的最大值来计算偏移量来进行线跟踪。它工作得非常好,除非信号到达域的边缘。它只是给出一个 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 个样本剪切其中一个信号,关联信号的梯度,以及其他一些不成功的方法...
非常感谢任何帮助!非常感谢!
与其寻找最大幅度,不如寻找相位差。
这可以使用 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
我最终最小化了两个向量之间的平均绝对差。对于每个时移,我计算了重叠点的绝对值 difference/number。这是我的函数
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
我有点手足无措 - 我太深了,无法快速应用另一种技术,所以这里什么也没有...
我正在通过将矩阵的每一行与下面的行相关联并采用相关性的最大值来计算偏移量来进行线跟踪。它工作得非常好,除非信号到达域的边缘。它只是给出一个 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 个样本剪切其中一个信号,关联信号的梯度,以及其他一些不成功的方法...
非常感谢任何帮助!非常感谢!
与其寻找最大幅度,不如寻找相位差。 这可以使用 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
我最终最小化了两个向量之间的平均绝对差。对于每个时移,我计算了重叠点的绝对值 difference/number。这是我的函数
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