使用vDSP函数的自相关

Autocorrelations using vDSP functions

本文关键字:自相关 函数 vDSP 使用      更新时间:2023-10-16

给定浮点数或双精度的1D矢量,如何使用加速框架中的vDSP库中的函数计算该矢量的自相关性?

人们可能会怀疑vDSP_acor()和vDSP_acorD()函数会执行此计算,但是文档vDSP_Library.pdf(在这里可获得)并没有很好地解释如何使用函数参数。

类似地,vDSP_conv()和vDSP_convD()函数提到了在两个向量之间执行关联和卷积的能力,但没有提供足够的解释或示例代码让我能够成功地使用它们。例如,如果使用过滤器内核对2D矩阵进行卷积,我认为需要两次调用vDSP_convD(),使用不同的signalStride值,但文档中省略了这一点。另一个遗漏是如何包装过滤器中的数据。如果填充了0,0出现在前面还是最后有关系吗?或者它们需要均匀地分布在非零项的两边吗?对过滤器长度、结果长度和输入长度有要求吗?

对一个有用示例的建议:使用vDSP_acor()和vDSP_conv()实现向量与自身的自相关。使用vDSP_fft2d_zrip()将打包为实际数据的两个频域中数组的并进乘法,这些数据将在IFT返回未标准化的答案之前用于计算自相关函数。实现一个高斯核卷积的一维和二维数组。总的来说,这是一个很棒的库(你能说快吗?!),但我发现这些特殊的函数有点难以理解,前面提到的例子可能会被广泛使用,因为它们在信号处理和图像分析中非常常见。

对vDSP_Library参考文档维护者的建议:我假设"空间域"answers"时间域"在整个文档中是等效的。如果不是,请区分一下。此外,请检查任何公式是否具有定义良好的形参,并与所讨论的函数中声明的实参名称相匹配。

脚注:这里我所指的自相关定义为:A[T] = <(X[T]-m) (X[T -T]-m)>/v,其中A[T]是滞后T处的自相关,T是信号X的指标,m是X对所有T的平均值,v是X对所有T的方差,尖括号<>表示间隔T的所有可用X对的平均值。

vDSP_acorD的文档对我来说似乎相当清晰,如果有点稀疏,并且在参数描述中似乎有一个错字。

void vDSP_acorD (double * A,
    double * C, int N, int M);

A是输入信号,C是自相关输出,NA中的样本数,MC中需要的输出值的数量(即C将保持从0M - 1的滞后值)。

如果vDSP_acorD不可用,那么你可以使用vDSP_conv,因为卷积与将其中一个输入信号反转的相关操作相同。

或者,您可以使用自相关相当于功率谱的逆FFT这一事实来滚动自己的快速自相关,因此:

auto_correlation = IFFT(MAG(FFT(x)))

,

FFT = forward FFT
IFFT = inverse FFT
MAG = magnitude of complex spectrum (sqrt(re * re + im * im))

,然后使用vDSP的FFT例程