【问题标题】:Perform autocorrelation with vDSP_conv from Apple Accelerate Framework使用 Apple Accelerate Framework 中的 vDSP_conv 执行自相关
【发布时间】:2012-06-06 16:07:05
【问题描述】:

我需要执行数组(向量)的自相关,但我无法找到正确的方法。我相信我需要来自 Accelerate Framework 的方法“vDSP_conv”,但我不知道如何成功设置它。最让我失望的是需要 2 个输入。也许我有错误的函数,但我找不到对单个向量进行操作的函数。

文档可以在here找到

从网站复制

vDSP_conv

对两个向量执行相关或卷积;单身的 精度。

void vDSP_conv ( const float __vDSP_signal[], vDSP_Stride __vDSP_signalStride, const float __vDSP_filter[], vDSP_Stride __vDSP_strideFilter, float __vDSP_result[], vDSP_Stride __vDSP_strideResult, vDSP_Length __vDSP_lenResult, vDSP_Length __vDSP_lenFilter );

参数

__vDSP_signal

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

__vDSP_signalStride

The stride through __vDSP_signal.

__vDSP_filter

Input vector B.

__vDSP_strideFilter

The stride through __vDSP_filter.

__vDSP_result

Output vector C.

__vDSP_strideResult

The stride through __vDSP_result.

__vDSP_lenResult

The length of __vDSP_result.

__vDSP_lenFilter

The length of __vDSP_filter.

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

输出应该类似于float y = [5.0, 14.0, 26.0, 40.0, 55.0, 40.0, 26.0, 14.0, 5.0] //generated using Matlab's xcorr(x) function

【问题讨论】:

    标签: iphone c accelerate-framework cross-correlation


    【解决方案1】:

    执行自相关仅仅意味着您获取一个向量与其自身的互相关。它没有什么花哨的。

    所以在你的情况下,这样做:

    vDSP_conv(x, 1, x, 1, result, 1, 2*len_X-1, len_X); 
    

    查看示例代码了解更多详情:(进行卷积)

    http://disanji.net/iOS_Doc/#documentation/Performance/Conceptual/vDSP_Programming_Guide/SampleCode/SampleCode.html

    编辑:这有点荒谬,但您需要将 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);
    

    【讨论】:

    • 我只是用我的例子试过这个。但它输出稍微错误的数据。我究竟做错了什么? 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 非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2014-12-19
    • 2013-11-06
    • 2020-11-22
    相关资源
    最近更新 更多