使用vDSP功能的自相关

时间:2011-04-05 04:26:04

标签: c++ macos signal-processing fft accelerate-framework

给定一个浮点数或双精度的一维向量,如何使用加速框架中的vDSP库中的函数计算该向量的自相关?

有人会怀疑vDSP_acor()和vDSP_acorD()函数会执行此计算,但文档vDSP_Library.pdf(available here)在解释如何使用函数参数方面做得并不好。

类似地,vDSP_conv()和vDSP_convD()函数提到了在两个向量之间执行相关和卷积的能力,但是没有为我提供足够的解释或示例代码以便能够成功使用它们。例如,如果使用过滤器内核来卷积2D矩阵,我会想象需要两次调用vDSP_convD(),使用不同的signalStride值,但文档中省略了这一点。另一个遗漏是如何打包过滤器中的数据。如果用零填充,如果零首先,最后,或者它们是否需要均匀分布在非零条目的两侧,这是否重要?滤波器长度,结果长度和输入长度是否有要求?

有用示例的建议:使用vDSP_acor()和vDSP_conv()实现向量的自相关。频域中两个数组的二进制乘法,打包为真实数据,使用vDSP_fft2d_zrip()进行前向FFT,将在IFT返回非规范化答案之前用于计算自相关函数。在1D和2D阵列上实现高斯核卷积。一般来说这是一个很棒的库(你能说FAST吗?!),但我发现这些特殊功能有点难以理解,上述例子可能会被广泛使用,因为它们在信号处理和图像分析中非常常见。

vDSP_Library参考文档维护者的建议:我假设“空间域”和“时域”在整个文档中是等效的。如果没有,请做出区分。另外,请检查所有公式都有明确定义的参数,这些参数与正在讨论的函数中声明的参数名称相匹配。

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

1 个答案:

答案 0 :(得分:9)

vDSP_acorD的文档对我来说似乎相当清楚,如果有点稀疏,并且参数描述中似乎确实存在拼写错误。

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

A是输入信号,C是自相关输出,NA中的样本数,M是数字C中需要的输出值(即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例程。