2012-06-06 42 views
7

Ich muss die Autokorrelation eines Arrays (Vektor) durchführen, aber ich habe Probleme bei der Suche nach dem richtigen Weg. Ich glaube, dass ich die Methode "vDSP_conv" aus dem Accelerate Framework brauche, aber ich kann nicht folgen, wie man es erfolgreich einrichtet. Das Ding, das mich am meisten abschreckt, ist die Notwendigkeit von 2 Eingängen. Vielleicht habe ich die falsche Funktion, aber ich konnte keine finden, die auf einem einzelnen Vektor operierte.Führen Sie Autokorrelation mit vDSP_conv von Apple Accelerate Framework

Die Dokumentation entweder here

kopiert von der Website

vDSP_conv

Führt Korrelation oder Faltung auf zwei Vektoren gefunden werden; single Präzision.

Hohlraum 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);

Parameter

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

Nehmen wir zum Beispiel an, Sie haben ein Array von float x = [1.0, 2.0, 3.0, 4.0, 5.0]. Wie würde ich die Autokorrelation davon nehmen?

Der Ausgang etwas ähnliches wie 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 sein sollte

Antwort

4

Autokorrelation Durchführung einfach bedeutet, dass Sie die Kreuzkorrelation eines Vektors mit sich selbst nehmen. Da ist nichts Besonderes.

so in Ihrem Fall zu tun:

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

Überprüfung eines Beispielcode für weitere Informationen: (was eine Faltung tut)

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

EDIT: Diese Grenzen zu lächerlich, aber Sie müssen den x-Wert um eine bestimmte Anzahl von Nullen versetzen, was einfach verrückt ist.

die folgende ist ein Arbeitscode, gerade eingestellten Filter auf den Wert von x Sie wünschen, und es wird den Rest in die richtige Position gebracht:

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

Ich habe gerade versucht, dies mit meinem Beispiel. Aber es gibt etwas falsche Daten aus. Was mache ich falsch? x = 1 bis 5 und Ergebnis ist Größe 9 (5 · 2 -1) vDSP_conv (x, 1, x, 1, Ergebnis, 1, 9, 5); -> outputs -> 55.0, 40.0, 26.0, 14.0, 5.0, 0.0, 0.0, 0.0, 294.0 – MrHappyAsthma

+0

Ich denke, ich habe einen Fehler gemacht, müssen Sie möglicherweise x mit Nullen auffüllen ... Ich habe meinen Mac nicht vor von mir, aber es scheint, dass die Eingabe länger sein sollte als die Ausgabe (was seltsam ist, um es am wenigsten zu sagen) – Rasman

+0

Blah: P Das stinkt. Ich werde versuchen, damit herumzuspielen. Wenn Sie einen Weg finden, um es sicher zu beheben, dann bitte posten: D – MrHappyAsthma