互相关之前的上采样没用吗?

信息处理 过滤器 互相关 峰值检测
2022-01-06 06:18:51

考虑一个简单的情况,其中来自两个不同传感器的两个信号是互相关的,并且到达时间延迟是根据它们的互相关函数峰值的横坐标计算得出的。

现在让我们进一步假设由于两个天线的维数限制和最大可能采样率的限制,可能的最大可达到延迟为D,对应 10 个样本。

问题:

由于这些限制,您计算的延迟可能与 0 到 10 个样本之间的任何数值不同,即:0D10. 这是有问题的,因为我真正想要的是对撞击我的天线的两个信号之间的延迟进行分数延迟区分,并且改变尺寸或采样率不是一种选择。

一些想法:

  • 自然,对于这种情况,我首先想到的是在执行互相关之前对信号进行上采样。但是我认为这在某种程度上是“作弊”,因为我并没有真正将任何新信息添加到系统中。

  • 我不明白从某种意义上说,上采样不是“作弊”。是的,我们正在根据当前观察到的频率信息重建我们的信号,但这如何让我们了解信号真正开始的位置,例如,D=7D=8? 原始信号中包含的信息在哪里确定信号的真正分数延迟开始实际上是在D=7.751?

问题:

  • 这真的是“作弊”吗?

    • 如果不是,那么这些新的“信息”从何而来?
    • 如果是,那么还有哪些其他选项可用于估计分数延迟时间?
  • 我知道对互相关的结果进行上采样,以试图获得延迟的子样本答案,但这也不是“作弊”的一种形式吗?为什么它与互相关之前的上采样不同?

如果上采样确实不是“作弊”,那么我们为什么需要提高采样率呢?(从某种意义上说,更高的采样率不是总是比插值低采样信号更好吗?)

这样看来,我们可以以非常低的速率进行采样并根据需要进行插值。鉴于简单地将信号插入到我们内心的愿望中,这难道不会使增加采样率“无用”吗?我意识到插值需要计算时间,而简单地从更高的采样率开始不会,但那是唯一的原因吗?

谢谢。

4个回答

这不是作弊,也没有添加任何新信息。您正在做的事情与任何上采样 LPF 正在做的事情相同 - 添加零,然后使用已知的频率信息重建波形。因此,没有新信息,但仍有更精细的时间分辨率。

对结果进行上采样是相似的——没有新信息,但时间分辨率更高。你可以通过二次插值做一些非常相似的事情

所有这些方法(上采样和多项式插值)都可以从峰本身及其邻居中获取分数峰所在位置的信息。一个快速的图片示例。 平衡峰值

上图中的蓝线是我模拟的互相关数据(尽管它可以是任何结果,而不仅仅是互相关)。这就是我所说的“平衡”峰值,因为邻居是对称的。如您所料,得到的二次插值(红线)表明真正的峰值为零。

另一方面,下图显示了一个不平衡的峰值。请注意,除了两个最近邻居的值外,结果没有任何变化。但是,这会导致插值器改变其对分数峰值的估计。 在此处输入图像描述

这些方法(多项式插值和上采样)的一个很好的附带好处是它还可以为您提供真实峰值的估计,尽管我们通常对位置更感兴趣。

如果上采样确实不是“作弊”,那么我们为什么需要提高采样率呢?

满足奈奎斯特准则。

从某种意义上说,更高的采样率不是总是比插值低采样信号更好吗?

不。从理论的角度来看,只要满足奈奎斯特标准,采样率是多少都没有关系。从实际的角度来看,您通常会使用尽可能低的采样率来减少存储需求和计算负载,从而减少所需的资源和功耗。

可以内插任何带限信号。“样本之间”的附加信息包含在相邻样本中,加上信号在采样之前是带限的(这往往会在相邻样本之间传播信息)。如果两个信号是带限的,那么互相关也是如此,因此也可以对互相关进行插值。上采样只是另一种插值形式,一种非常精确的带限信号插值形式;但您也可以使用 Sinc 插值(两者都比二次或抛物线插值更准确)。

插值可能会显示样本之间的峰值。因此也许不是没用的。

如果您的信号包含更宽的频谱,那么它可以包含更多信息。因此,以更高的速率对其进行采样将提供更多信息,但最多只能低于新频带限制频率的一半,并且仅当信号包含高于旧频带限制的实际有用频谱频率内容时,并且如果您现在可以获得这个额外的频谱通过使用新的更宽带的限带过程或滤波器,而不是旧的有损的。在已经被频带限制到低于 Fs/2 的低得多的频率的信号中以高得多的频率采样数据只会为您购买插值,而不是更多的信息内容。

如果采样被量化,则由于量化误差的抖动或噪声整形,以更高的速率采样可能会为您购买 LSB 的一小部分更多信息。但这取决于采样器的信噪比和精度以及采样中使用的精确量化过程。

如果两个信号在采样和互相关之前没有适当地进行带宽限制,那么不仅上采样或插值可能会给您带来垃圾结果,而且原始的非插值互相关也可能如此。

我想我能给你的最好答案是:你有办法自己找出来。建立一个“向后”的例子。使用 Matlab,从以非常小的采样周期采样的两个信号开始(因此它们几乎是连续时间信号)。计算互相关,并找到峰值(如果这是您想要的),您将能够以高精度完成。然后,对两个信号进行下采样并重复该过程。比较第二个峰的位置和高度与第一个峰。我相信第二个会更糟。如果您在互相关之前进行上采样,则从第二个到第一个的改进就是您所获得的。

要以正确的方式进行上采样,两个信号都需要进行频带限制,并且您需要知道这些带宽。您在问题中提到的“新”信息来自相邻样本,以及信号受频带限制的事实。

要在前面的答案中添加一点,您可以通过使相关变量为非整数来获得上采样带限互相关的等价物。

以下(python)代码计算τ, 在哪里

τ=argmaxτn=0N1f(n)g(n+τ)

也就是说,它找到了互相关的最大值。

输入变量ab描述对于并且都假设是带限和周期性的周期(在离散傅立叶域中实现移位)。范围内。f(n)g(n)n={0,1,...,N1}Nτ[N+1,N1]

目的是展示如何对由闭包定义的非整数执行互相关。这使用了数组,它描述了复相量在每个离散频率上的旋转,对应于时移然后为每个班次缩放。很明显,为了保持实时信号,负频率的旋转只是倍(对于相应的频率对)。τcorrelate_pointomegaτ=1τ1

一个微妙之处在于您如何处理样本(奈奎斯特频率),因为它在正带和负带之间共享。这里使用的解决方案是在正旋转相量和负旋转相量(它们是实轴上的反射)之间进行插值,即将单位旋转相量投影到实轴上,这是一个 cos 函数(这是因为是对应于奈奎斯特频率的值)。显然,该值需要为实数才能保持实时域信号。N2piomega

的任意精确值的互相关只需使用您喜欢的任何值调用闭包(可以作为可调用对象返回) 。ττ

import numpy
from numpy import fft
from scipy import optimize

def arg_max_corr(a, b):

    if len(a.shape) > 1:
        raise ValueError('Needs a 1-dimensional array.')

    length = len(a)
    if not length % 2 == 0:
        raise ValueError('Needs an even length array.')

    if not a.shape == b.shape:
        raise ValueError('The 2 arrays need to be the same shape')

    # Start by finding the coarse discretised arg_max
    coarse_max = numpy.argmax(numpy.correlate(a, b, mode='full')) - length+1

    omega = numpy.zeros(length)
    omega[0:length/2] = (2*numpy.pi*numpy.arange(length/2))/length
    omega[length/2+1:] = (2*numpy.pi*
            (numpy.arange(length/2+1, length)-length))/length

    fft_a = fft.fft(a)

    def correlate_point(tau):
        rotate_vec = numpy.exp(1j*tau*omega)
        rotate_vec[length/2] = numpy.cos(numpy.pi*tau)

        return numpy.sum((fft.ifft(fft_a*rotate_vec)).real*b)

    start_arg, end_arg = (float(coarse_max)-1, float(coarse_max)+1)

    max_arg = optimize.fminbound(lambda tau: -correlate_point(tau), 
            start_arg, end_arg)

    return max_arg