2016-05-30 26 views
2

Ich teste die Bibliothek nur mit einer diskreten Cosinus-Transformation.Verwendung von fftw3-Bibliothek für dct

#include <fftw3.h> 
void dump_vector(int n, double* vec) { 
    for(int i = 0; i < n; i++) 
     printf("%f ", vec[i]); 
    printf("\n"); 
} 
int main() 
{ 
    double a[] = {0.5, 0.6, 0.7, 0.8}; 
    double b[] = {0, 0, 0, 0}; 
    printf("Original vector\n"); 
    dump_vector(4, a); 
    fftw_plan plan = fftw_plan_r2r_1d(4, a, a, FFTW_REDFT10, FFTW_ESTIMATE); 
    fftw_execute(plan); 
    printf("DCT\n"); 
    dump_vector(4, a); 
    fftw_plan plani = fftw_plan_r2r_1d(4, a, a, FFTW_REDFT10, FFTW_ESTIMATE); 
    fftw_execute(plani); 
    printf("IDCT\n"); 
    dump_vector(4, a); 
    return 0; 
} 

Ich hoffe, das gleiche a, oder vielleicht eine Annäherung zu erhalten, aber meine ouput ist folgende:

Original vector 
0.500000 0.600000 0.700000 0.800000 
DCT 
5.200000 -0.630864 0.000000 -0.044834 
IDCT 
9.048603 9.208347 8.182682 5.179908 
+2

Es sieht aus wie in beiden Fällen Sie die Vorwärts ausführen verwandeln, nicht invers. Sie brauchen 'REDFT01' für den zweiten Fall, wenn ich das Dokument richtig lese –

+0

Ja, ich habe es bearbeitet. Vielen Dank – FacundoGFlores

+2

Nun, nicht bearbeiten, wie die Antworten über das Original sind. Aber wie auch immer, jetzt scheint es wie die Skalierung Sache (Faktor 8, wie ich sehe) –

Antwort

2

Siehe the documentation of fftw about real to real transforms

FFTW_REDFT10 eine REDFT10 Transformation berechnet, dh ein DCT-II (manchmal "DCT" genannt). (Logical N = 2 * n, invers ist FFTW_REDFT01.)

daher das Flag FFTW_REDFT01 muss für die inverse Transformation anstelle von FFTW_REDFT10 verwendet werden.

Darüber hinaus skaliert FFTW die Ausgabe der Transformation nicht neu. Folglich muss der Ausgang entweder durch n oder n*n dividiert werden, wobei n die Länge des Vektors ist. (Ich werde es in ein paar Minuten testen ...)

EDIT: der Skalierungsfaktor ist weder n noch n*n es 2*n ist ...

+0

Vielen Dank Ich habe vergessen, die Flagge zu ändern. Ihre Antwort auf den Skalierungsfaktor war richtig! – FacundoGFlores