Perform autocorrelation with vDSP_conv from Apple Accelerate Framework

前端 未结 1 1129
栀梦
栀梦 2020-12-15 01:14

I need to perform the autocorrelation of an array (vector) but I am having trouble finding the correct way to do so. I believe that I need the method \"vDSP_conv\" from the

相关标签:
1条回答
  • 2020-12-15 01:36

    performing autocorrelation simply means you take the cross-correlation of one vector with itself. There is nothing fancy about it.

    so in your case, do:

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

    check a sample code for more details: (which does a convolution)

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

    EDIT: This borders on ridiculous, but you need to offset the x value by a specific number of zeros, which is just crazy.

    the following is a working code, just set filter to the value of x you desire, and it will put the rest in the correct position:

    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);
    
    0 讨论(0)
提交回复
热议问题