2015-07-30 11 views
9

Ich habe eine Matrix in Zeile-Haupt-Reihenfolge gespeichert. Ich versuche, die DCT einer ub-Matrix mit FFTW zu berechnen, und ich bekomme Unsinn. In den folgenden Abschnitten werde ich das Problem und meine Lösung beschreiben, und ich möchte Ihre Hilfe verstehen, warum es nicht funktioniert.FFTW Real-to-Real-Transformation schreitet Array

Da einige i und l würde Ich mag die DCT eines Untermatrix berechnen, die k mod l == i aller Zeilen k, für die besteht. Nehmen wir zum Beispiel an, dass l = 3 und i = 2. In der folgenden Matrix ist die Submatrix, die ich transformieren möchte, rot markiert (2 mod 3 = 2, 5 mod 3 = 2, 8 mod 3 = 2).

Matrix

Die Quell- und Ziel-Arrays hat die gleiche Anordnung, und die transformierte Matrix sollte an der gleichen Stelle in dem Ziel-Array gespeichert werden.

void transform(double* src, double* dest, size_t rows, size_t cols, size_t l, size_t i) 
{ 
    int rank = 2; 
    fftw_iodim64 dims[] = { 
     { rows/l, l, l }, 
     { cols, rows, rows } }; 
    fftw_r2r_kind kind = FFTW_REDFT10; 

    fftw_plan plan = fftw_plan_guru64_r2r(rank, dims, 0, NULL, src + l, dest + l, &kind, FFTW_ESTIMATE | FFTW_UNALIGNED | FFTW_PRESERVE_INPUT); 
    fftw_execute(plan); 
    fftw_destroy_plan(pla); 
} 

aktualisieren

ich es für den einfachen Fall getestet i=l=1 wenn. Selbst in diesem Fall bekomme ich Unsinn. I getestet, mit einer 3x4-Matrix, die genau einer der DCT-Basisvektoren ist:

A(i,j) = cos((i + 0.5)*2*pi/3) * cos((j + 0.5)*3*pi/4) 

I erwartet, dass ein Ergebnis zu erhalten, in der alle Elemente (in der Nähe) Null mit Ausnahme eines. Aber ich bekomme eine resultierende Matrix, die wie folgt aussieht:

0    -2.22045e-016 1.33227e-015 2.22045e-016 
2.22045e-016 -2.77556e-016 9.99201e-016 5.55112e-017 
-8.88178e-016 -1.62359  7.83938  1.62359 

Scheint ziemlich komisch.

Update 2

I auch mit einer einfachen Matrix getestet, wo das (0,0) Element 1 und der Rest ist gleich Null sind. In diesem Fall auch i=l=1 (die Untermatrix ist die gesamte Matrix). Hier ist das Ergebnis:

 2  2  2  0 
1.73205 1.73205 1.73205  0 
     1  1  1  0 
+0

Können Sie mit einigen offensichtlichen Eingaben (einfache Muster von 1s und 0s) testen und sehen, welche Ausgabe Sie erhalten? Vielleicht hier posten, damit man eine Idee bekommt, was schief läuft? –

+0

Ich habe etwas anderes gemacht. Ich füllte die Untermatrix mit einem der DCT-Basisvektoren. Was ich bekomme, ist etwas, das * nicht * nur Nullen ist, außer für ein einzelnes Nicht-Null-Element. Ich bekomme viele Nicht-Null-Elemente im Ergebnis. – Alex

+0

Sie geben nirgends an, dass Ihr Eingabe-Schritt 2 * Zeilen ist. –

Antwort