Iphone 使用Apple Accelerate框架中的vDSP_conv执行自相关

Iphone 使用Apple Accelerate框架中的vDSP_conv执行自相关,iphone,c,accelerate-framework,cross-correlation,Iphone,C,Accelerate Framework,Cross Correlation,我需要执行数组(向量)的自相关,但我很难找到正确的方法。我相信我需要加速框架中的方法“vDSP_conv”,但我无法理解如何成功地设置它。最让我恼火的是需要两个输入。也许我有错误的函数,但我找不到一个在单个向量上运行的函数 可以找到文档 从网站上复制 vDSP_conv 对两个向量执行相关或卷积;单一的 精确性 无效vDSP_conv(常数浮点u vDSP_信号[],vDSP_跨步 __vDSP_信号步长、常量浮点vDSP_滤波器[]、vDSP_步长vDSP_滤波器、浮点vDSP_结果[]、vD

我需要执行数组(向量)的自相关,但我很难找到正确的方法。我相信我需要加速框架中的方法“vDSP_conv”,但我无法理解如何成功地设置它。最让我恼火的是需要两个输入。也许我有错误的函数,但我找不到一个在单个向量上运行的函数

可以找到文档

从网站上复制

vDSP_conv

对两个向量执行相关或卷积;单一的 精确性

无效vDSP_conv(常数浮点u vDSP_信号[],vDSP_跨步 __vDSP_信号步长、常量浮点vDSP_滤波器[]、vDSP_步长vDSP_滤波器、浮点vDSP_结果[]、vDSP_步长vDSP_结果、vDSP_长度vDSP_结果、vDSP_长度vDSP_滤波器)

参数

__vDSP_信号

Input vector A. The length of this vector must be at least __vDSP_lenResult + __vDSP_lenFilter - 1.
__vDSP_信号灯

The stride through __vDSP_signal.
__vDSP_滤波器

Input vector B.
__vDSP_滤波器

The stride through __vDSP_filter.
__vDSP_结果

Output vector C.
__vDSP_结果

The stride through __vDSP_result.
__vDSP_lenResult

The length of __vDSP_result.
__vDSP_滤波器

The length of __vDSP_filter.
例如,假设您有一个
float x=[1.0,2.0,3.0,4.0,5.0]
数组。我如何计算它的自相关性


输出应该类似于使用Matlab的xcorr(x)函数生成的
float y=[5.0,14.0,26.0,40.0,55.0,40.0,26.0,14.0,5.0]//执行自相关只意味着将一个向量的互相关带到自身。这一点也不奇怪

因此,在您的情况下,请执行以下操作:

vDSP_conv(x, 1, x, 1, result, 1, 2*len_X-1, len_X); 
检查示例代码以了解更多详细信息:(哪个代码进行卷积)

编辑:这近乎荒谬,但您需要将x值偏移特定数量的零,这太疯狂了

下面是一个工作代码,只需将filter设置为所需的x值,其余的将被置于正确的位置:

float          *signal, *filter, *result;

int32_t         signalStride, filterStride, resultStride;

uint32_t        lenSignal, filterLength, resultLength;

uint32_t        i;



filterLength = 5;

resultLength = filterLength*2 -1;

lenSignal = ((filterLength + 3) & 0xFFFFFFFC) + resultLength;



signalStride = filterStride = resultStride = 1;



printf("\nConvolution ( resultLength = %d, "

       "filterLength = %d )\n\n", resultLength, filterLength);



/* Allocate memory for the input operands and check its availability. */

signal = (float *) malloc(lenSignal * sizeof(float));

filter = (float *) malloc(filterLength * sizeof(float));

result = (float *) malloc(resultLength * sizeof(float));



for (i = 0; i < filterLength; i++)

    filter[i] = (float)(i+1);

for (i = 0; i < resultLength; i++)
    if (i >=resultLength- filterLength)
        signal[i] = filter[i - filterLength+1];


/* Correlation. */

vDSP_conv(signal, signalStride, filter, filterStride,

          result, resultStride, resultLength, filterLength);


printf("signal: ");
for (i = 0; i < lenSignal; i++)        
    printf("%2.1f ", signal[i]);


printf("\n filter: ");
for (i = 0; i < filterLength; i++)
    printf("%2.1f ", filter[i]);

printf("\n result: ");
for (i = 0; i < resultLength; i++)
    printf("%2.1f ", result[i]);


/* Free allocated memory. */

free(signal);

free(filter);

free(result);
float*信号、*滤波器、*结果;
int32_t signalStride、filterStride、resultStride;
uint32透镜信号、滤波器长度、结果长度;
uint32_t i;
过滤器长度=5;
结果长度=过滤器长度*2-1;
lenSignal=((过滤器长度+3)和0xFFFFFFFC)+结果长度;
signalStride=filterStride=resultStride=1;
printf(“\n卷积(结果长度=%d,”
“filterLength=%d)\n\n”,结果长度,filterLength);
/*为输入操作数分配内存并检查其可用性*/
信号=(浮点*)malloc(lenSignal*sizeof(浮点));
filter=(float*)malloc(filterLength*sizeof(float));
结果=(float*)malloc(resultLength*sizeof(float));
对于(i=0;i=结果长度-过滤器长度)
信号[i]=滤波器[i-滤波器长度+1];
/*相关性*/
vDSP_conv(信号、信号跨距、滤波器、滤波器栅极、,
结果、结果列、结果长度、过滤器长度);
printf(“信号:”);
对于(i=0;i
我刚刚用我的例子尝试了这一点。但它输出的数据略有错误。我做错了什么?x=1到5,结果是大小为9(5*2-1)的vDSP_conv(x,1,x,1,result,1,9,5);->输出->55.0,40.0,26.0,14.0,5.0,0.0,0.0,0.0,294.0我想我犯了一个错误,你可能需要用零填充x。。。我面前没有我的Mac电脑,但似乎输入应该比输出长(至少说起来很奇怪)等等:P真糟糕。我试着把它弄得乱七八糟。如果您遇到了一种解决方法,请发布:D@MrHappyAsthma这花了我一段时间,但我明白了。请参见上面的编辑。幸运的是,这太奇怪了,必须这样做,但它确实有效D非常感谢你!!!