2016-05-30 1 views
2

Je teste la bibliothèque en utilisant simplement une transformée en cosinus discrète.Utilisation de la bibliothèque fftw3 pour le 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; 
} 

j'espère obtenir le même a, ou peut-être une approximation, mais mon ouput est la suivante:

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

On dirait que dans les deux cas, vous effectuez la transformation en avant, non inverse. Vous avez besoin de 'REDFT01' pour le second cas, si j'ai lu le document correctement –

+0

Oui, je l'ai édité. Merci – FacundoGFlores

+2

Eh bien, ne modifiez pas comme les réponses sont sur l'original. Mais de toute façon, maintenant il semble que la chose à l'échelle (facteur 8 comme je vois) –

Répondre

2

Voir the documentation of fftw about real to real transforms

FFTW_REDFT10 calcule transformer un REDFT10, à savoir une DCT-II (parfois appelé "le" DCT). (Logical N = 2 * n, inverse est FFTW_REDFT01.)

Par conséquent, le drapeau FFTW_REDFT01 doit être utilisé pour la transformation inverse au lieu de FFTW_REDFT10. En outre, FFTW ne redimensionne pas la sortie de la transformation. En outre, FFTW ne redimensionne pas la sortie de la transformation. Par conséquent, la sortie doit être divisée par n ou n*n, où n est la longueur du vecteur. (Je le tester en quelques minutes ...)

EDIT: le facteur d'échelle est ni n ni n*n il est 2*n ...

+0

Merci j'ai oublié de changer le drapeau. Votre réponse à propos du facteur d'échelle était juste! – FacundoGFlores