2016-05-30 44 views
2

我正在使用離散餘弦變換來測試庫。對於dct使用fftw3庫

#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; 
} 

我希望能獲得相同a,也許近似,但我的輸出中如下:

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

它看起來像在這兩種情況下,你正在執行的正變換,不逆。如果我正確閱讀文檔,您需要'REDFT01'作爲第二種情況。 –

+0

是的,我編輯了它。謝謝 – FacundoGFlores

+2

好吧,不要編輯,因爲答案是關於原件。但無論如何,現在它看起來像縮放比例(因爲我看到的因素8) –

回答

2

the documentation of fftw about real to real transforms

FFTW_REDFT10計算的REDFT10變換,即DCT-II(有時稱爲「DCT」)。 (邏輯N = 2 * N,逆是FFTW_REDFT01。)

因此,該標誌FFTW_REDFT01必須用於逆變換,而不是FFTW_REDFT10

而且,FFTW不會重新縮放變換的輸出。因此,輸出必須由nn*n來劃分,其中n是向量的長度。 (我將在一兩分鐘的測試...)

編輯:縮放倍率是既不n也不n*n2*n ...

+0

謝謝我忘了更改國旗。你對比例因子的回答是正確的! – FacundoGFlores