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).
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
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? –
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
Non state specificando da nessuna parte che il passo di input sia 2 * righe. –