2015-07-30 15 views
9

Ho una matrice memorizzata in ordine di riga principale. Sto cercando di calcolare il DCT di una ububrix usando FFTW, e ottengo assurdità. Nei paragrafi seguenti descriverò il problema e la mia soluzione, e vorrei il tuo aiuto nel capire perché non funziona.FFTW matrice a trasformazioni real-to-real

Dato un i e l, desidero calcolare la DCT di un sub-matrice che consiste di tutte le righe k per cui k mod l == i. Ad esempio, supponiamo che l = 3 e i = 2. Nella seguente matrice, la sottomatrice che desidero trasformare è segnata in rosso (2 mod 3 = 2, 5 mod 3 = 2, 8 mod 3 = 2).

Matrix

La sorgente e di destinazione array hanno la stessa struttura, e la matrice trasformata devono essere memorizzati nella stessa posizione nella matrice di destinazione.

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

Aggiornamento

ho provato per il caso semplice quando i=l=1. Anche in quel caso ottengo assurdità. Ho provato con una matrice 3x4 che è esattamente uno dei vettori di base DCT:

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

mi aspettavo di ottenere un risultato in cui tutti gli elementi sono (vicino a) nullo tranne una. Ma ottengo una matrice risultante simile a questa:

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 

Sembra abbastanza strano.

Aggiorna 2

ho testato anche con una semplice matrice in cui il (0,0) elemento è 1 e il resto sono zero. Anche in questo caso, i=l=1 (la sottomatrice è l'intera matrice). Ecco il risultato:

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

Puoi testare con qualche input ovvio (pattern semplici di 1s e 0s) e vedere quale output ottieni? Magari postarlo qui in modo che si possa avere un'idea di cosa sta andando storto? –

+0

Ho fatto qualcos'altro. Ho riempito la sottomatrice con uno dei vettori di base DCT. Quello che ottengo è qualcosa che * non * tutti zeri tranne un singolo elemento diverso da zero. Ottengo molti elementi diversi da zero nel risultato. – Alex

+0

Non state specificando da nessuna parte che il passo di input sia 2 * righe. –

risposta