2015-07-30 25 views
9

Mam macierz zapisaną w rzędzie-większej kolejności. Próbuję obliczyć DCT ub-macierzy za pomocą FFTW, i mam nonsens. W poniższych akapitach opiszę problem i moje rozwiązanie, a ja chciałbym, abyś pomógł ci zrozumieć, dlaczego to nie działa.Transmitowana macierz FFTW z rzeczywistą transformacją

względu niektóre i i l, ja jak obliczyć DCT o sub-matrycy, która składa się ze wszystkich rzędach k dla których k mod l == i. Załóżmy na przykład, że l = 3 i i = 2. W poniższej macierzy pod-macierz, którą chcę przekształcić zaznaczono na czerwono (2 mod 3 = 2, 5 mod 3 = 2, 8 mod 3 = 2).

Matrix

źródłowym i docelowym macierze mają ten sam układ, oraz przekształcony matrycy powinna być zapisana w tym samym miejscu w tablicy docelowej.

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

Aktualizacja

ja testowałem to na prostym przypadku gdy i=l=1. Nawet w takim przypadku mam nonsens. Testowałem z matrycą 3x4, która jest dokładnie jeden z wektorów bazowych DCT:

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

Spodziewałem się uzyskać wynik, gdzie wszystkie elementy są (prawie) zerowa wyjątkiem jednego. Ale otrzymuję wynikową macierz, która wygląda następująco:

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 

Wydaje się dość dziwne.

Aktualizacja 2

również badane w prosty matrycy, gdzie (0,0) elementu wynosi 1, a pozostałe to zero. W tym przypadku też, i=l=1 (pod-macierz jest całą macierzą). Oto wynik:

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

Czy możesz przetestować niektóre oczywiste dane wejściowe (proste wzorce 1 i 0) i zobaczyć, jakie dane wyjściowe otrzymasz? Może opublikuj to tutaj, aby ktoś wpadł na pomysł, co jest nie tak? –

+0

Zrobiłem coś innego. Napełniłem pod-macierz jednym z wektorów bazowych DCT. Otrzymuję coś, co jest * nie * zerami, z wyjątkiem pojedynczego niezerowego elementu. Otrzymuję wiele niezerowych elementów w wyniku. – Alex

+0

Nie określasz nigdzie, że twój krok wejściowy wynosi 2 * wiersze. –

Odpowiedz

Powiązane problemy