2012-06-06 19 views
7

'dan vDSP_conv ile otomatik korelasyon gerçekleştirin Bir dizinin (vektör) otomatik korelasyonunu gerçekleştirmem gerekiyor, ancak bunu yapmak için doğru yolu bulmakta zorlanıyorum. Accelerate Framework'den "vDSP_conv" yöntemine ihtiyacım olduğuna inanıyorum, ancak başarılı bir şekilde nasıl kurulacağımı takip edemiyorum. Beni en çok üzen şey, 2 girdiye duyulan ihtiyaç. Belki yanlış fonksiyona sahibim, ama tek bir vektör üzerinde çalışan birini bulamadım.Apple Accelerate Framework

belgeleri

here sitesinden kopyalanan bulunabilir

vDSP_conv

gerçekleştirir iki vektör bağıntı veya kıvrım ya; Tek hassas.

void vDSP_conv (const şamandıra __vDSP_signal [], vDSP_Stride __vDSP_signalStride const yüzer __vDSP_filter [], vDSP_Stride __vDSP_strideFilter, yüzer __vDSP_result [], vDSP_Stride __vDSP_strideResult, vDSP_Length __vDSP_lenResult, vDSP_Length __vDSP_lenFilter);

Parametreler

__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. 

Örneğin, yalnızca bir dizi float x = [1.0, 2.0, 3.0, 4.0, 5.0] olduğunu varsayalım. Bunun otokorelasyonunu nasıl alırdım?

çıkış otokorelasyon gerçekleştiren 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

cevap

4

benzer bir şey olmalı basitçe kendisiyle bir vektör çapraz korelasyon almak anlamına gelir. Bu konuda hiç hoş bir şey yok.

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

DÜZENLEME (a konvolüsyonunu yapar): Daha fazla detay için

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

çek bir örnek kod: senin durumunda böyle

yapmak saçma üzerindeki bu sınırlar, ancak x değerini belirli bir sayıda sıfır ile dengelemek gerekir, ki bu sadece çılgınlıktır. Aşağıdaki

bir çalışma kodu, arzu x değerine sadece set filtre olduğunu ve doğru konumda kalan koyacağız:

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

Ben sadece örnekle çalıştı. Ama biraz yanlış veri çıkışı veriyor. Neyi yanlış yapıyorum? x = 1 ila 5 ve sonuç 9 (5 * 2 -1) vDSP_conv (x, 1, x, 1, sonuç, 1, 9, 5); -> çıktılar -> 55.0, 40.0, 26.0, 14.0, 5.0, 0.0, 0.0, 0.0, 294.0 – MrHappyAsthma

+0

Sanırım bir hata yaptım, x'i sıfır ile doldurmanız gerekebilir ... Önümdeki Mac'im yok benden, ama daha sonra çıktı (yani en az söylemek için garip) çıktı daha uzun olması gerektiği görünüyor. – Rasman

+0

Blah: P O kokuyor. Onunla uğraşmayı deneyeceğim. Eğer emin olmak için bir yolla karşılaşırsanız o zaman lütfen gönderin: D – MrHappyAsthma