2012-06-06 42 views
7

我需要執行數組(矢量)的自相關,但我無法找到正確的方法來執行此操作。我相信我需要加速框架中的「vDSP_conv」方法,但我無法按照如何成功設置它。拋出我最多的東西是需要2個輸入。也許我有錯誤的功能,但我找不到在單個矢量上運行的功能。使用Apple Accelerate Framework中的vDSP_conv執行自相關

的文檔可以發現here

從站點複製

vDSP_conv

執行任一上的兩個向量的相關性或卷積;單精度 。

空隙vDSP_conv(常量浮子__vDSP_signal [],vDSP_Stride __vDSP_signalStride,常量浮子__vDSP_filter [],vDSP_Stride __vDSP_strideFilter,浮__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

回答

4

進行自相關的東西只是意味着你把一個向量的交叉相關與自身。沒有什麼奇特的。

你的情況

這樣,做:

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值,這只是瘋狂的。

下面是一個工作代碼,只需設置過濾器的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); 
+0

我只是想這跟我的例子。但是它輸出的數據有點不對。我究竟做錯了什麼? 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 – MrHappyAsthma

+0

我想我犯了一個錯誤,你可能需要用零填充x ...我前面沒有我的Mac的,但似乎輸入應該是更長的輸出(這是很奇怪的說至少) – Rasman

+0

布拉赫:P這太臭了。我試着亂搞一下。如果你遇到一種方法來確定它,那麼請發帖:D – MrHappyAsthma

相關問題