doing autocorrelation simply means that you take the cross-correlation of one vector with yourself. This is not unusual.
so in your case do:
vDSP_conv(x, 1, x, 1, result, 1, 2*len_X-1, len_X);
check the sample code for more details: (which does the convolution)
http://disanji.net/iOS_Doc/#documentation/Performance/Conceptual/vDSP_Programming_Guide/SampleCode/SampleCode.html
EDIT: This borders on ridiculous, but you need to compensate for the value of x by a certain number of zeros, which is just crazy.
Below is the working code, just set the filter to the x value you want 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); 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]; 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(signal); free(filter); free(result);
Rasman
source share