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


12

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

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

问题:

由于这些限制,你的计算延迟可以由任何变化整数:0和10之间的样品值,即0D10。这是有问题的,因为我真正想要的是区分撞击在我天线上的两个信号之间的延迟的小数延迟,并且改变尺寸或采样率不是一种选择。

一些想法:

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

  • 从某种意义上说,我不了解上采样是不是“作弊”。是的,我们正在基于其当前观察到的频率信息重建信号,但是这如何使人们知道信号在D=7之间真正从哪里开始D=8呢?哪里是确定包含在原始信号信息,该信号的真实分数延迟启动实际上是在D=7.751

问题:

  • 这真的是“作弊”吗?

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

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

这样看来,我们可以以非常低的速率采样并根据需要进行内插。那么,仅仅根据我们内心的需求插入信号,是否会使采样率“无用”?我意识到插值需要花费计算时间,而从较高的采样率开始就不会,但是那是唯一的原因吗?

谢谢。


3
我怀疑有一个在精度任何区别,因为信息量是相同的两种方式,但它肯定更便宜,插值第一互相关仅在比上采样的一切感兴趣的区域,然后做所有这些额外的乘法。
endolith

@endolith好点。现在,我更清楚这是为什么/如何工作的,是的,在这种情况下,对结果进行采样将是可行的方法。
Spacey 2012年

Answers:


12

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

对结果进行上采样是相似的-没有新信息,但时间分辨率更好。您可以通过二次插值来做类似的事情。

所有这些方法-上采样和多项式插值-从峰本身及其相邻峰中获取有关分数峰的位置的信息。一个简单的图片示例。 平衡峰

上图中的蓝线是我模拟的互相关数据(尽管可能是任何结果,而不仅仅是互相关)。我称之为“平衡”峰,因为邻居是对称的。如您所料,产生的二次插值(红线)表示真实峰值为零。

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

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

如果确实确实存在上采样不是“作弊”的情况,那为什么我们还要提高采样率呢?

满足奈奎斯特准则。

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

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


1
Fs

1
@Mohammad是和否。来自结果本身或量化噪声的噪声最终将使提高时间分辨率变得毫无意义。但是,在那之前,是的,更多的上采样应会提高估计的准确性。
Jim Clay

1
二次/抛物线插值的注释和示例代码:gist.github.com/255291#file_parabolic.md以及其他一些插值方法:dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith

2
@JimClay有机会睡觉了。现在很明显-信息总是存在的-可以说它只是编码在样本之间的关系中。这就是多边形拟合实际上在其插值中使用的。而且由于信号是频带受限的(即只能在一个时间跨度内如此快速地变化),因此在样本之间存在信号的方式非常多。
Spacey 2012年

8

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

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

如果您的信号包含更宽的频谱,则它可以包含更多信息。因此,以更高的速率对其进行采样将提供更多信息,但仅在新频带限制频率的一半以下,并且仅当信号包含的实际有用频谱频率内容高于旧频带限制时,并且如果您现在可以获取此附加信号,才可以提供更多信息。通过使用新的更宽带的频带限制过程或滤波器,而不是较旧的有损耗的频谱来实现频谱分析。在已经被带宽限制到低于Fs / 2的低得多频率的信号上以更高的频率采样数据只会为您带来插值,而不会带来更多的信息内容。

如果对采样进行了量化,由于量化误差的抖动或噪声整形,以较高的采样率可以为您提供一小部分LSB的更多信息。但这取决于采样率的信噪比和精度以及采样中使用的精确量化过程。

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


1
谢谢hotpaw2。因此,可以正确地说,是否对两个信号都进行上采样然后再进行相关处理,或者先进行相关处理再对结果进行上采样处理,这并不重要吗?由于带宽限制,这两种方法应该给您相同的结果?
Spacey 2012年

@Mohammad:我认为无论哪种方式它都包含相同的信息,但是由于插值并不完美,因此根据实现的不同,结果会略有不同。
Endlith 2012年

3

我认为我能给您的最好的答案是:您有能力自行找出答案。建立一个示例“向后”。使用Matlab,首先以很小的采样周期采样两个信号(因此它们几乎是连续时间的信号)。计算互相关,并找到峰(如果您想要的话),您将可以高精度地进行该操作。然后,对两个信号进行下采样并重复该过程。将第二个峰的位置和高度与第一个峰进行比较。我敢肯定第二个会更糟。如果您在互相关之前进行了升采样,那么从第二个到第一个的改进就是您所获得的。

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


感谢Telaclavo。我真正不清楚的一件事是“带宽受限”的术语。我知道这是什么意思,但我不明白为什么在这里提到它。任何系统,除了可能的噪声,都是“频带受限的”,那么为什么在这种意义上一遍又一遍地提及它?
Spacey 2012年

3

要为先前的答案添加一些信息,可以通过使相关变量为非整数来获得与上采样的带限互相关等效。

τ

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

即,找到互相关的最大值。

abf(n) ñ = { 0 1 Ñ - 1 } ñ τ [ - Ñ + 1 Ñ - 1 ]g(n)n={0,1,...,N1}Nτ[N+1,N1]

目的是说明如何对由闭包定义的非整数进行互相关。这使用了数组,该数组描述了复相量在每个离散频率处的旋转,该频率对应于时移。然后为每个班次缩放此比例。显然,为了保持实时信号,负频率的旋转仅为正频率的旋转的倍(对于相应的频率对)。τ = 1 τ - 1τ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

1
我需要考虑您的问题是否正确(并且我现在没有时间)。我的想法是,您正在改变信号的群延迟,您可以按照自己的喜好进行调整。这完全等效于在时域中具有sinc函数的圆形卷积,sinc偏移了(但仍在与原始信号相同的位置处采样)。值得注意的是,对于整数,sinc的所有零交叉都与采样时间对齐,除了(它为)之外,这就是信号微不足道的原因。τ τ 1τττ1
亨利·戈默索尔

哦,你的问题消失了!不过,我将答复留在那里。
亨利·戈默索尔

tau

N2N(logN+1)

另外,我发现在傅立叶领域的思考实际上要简单得多。但这可能不正常!
亨利·戈默索尔

2

有一个直观的证据表明,在互相关之前进行升采样等效于在其之后进行升采样:

互相关是与时间反转的其他信号进行卷积。时间倒转不会影响带宽。卷积是频域中的乘法,也不会增加带宽。如果原始信号被适当地限制为采样频率的一半,则互相关结果也将是这样。没有引入别名会破坏结果。之后插值可以节省工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.