Problem z wyliczeniem DCT
Ostatnio zmodyfikowano 2009-10-05 19:54
maciekbyrwa Temat założony przez niniejszego użytkownika |
Problem z wyliczeniem DCT » 2009-10-04 12:31:18 Witam Mam problem z wyliczeniem DCT (dyskretnej transformaty kosinusowej). Na stronie http://cnx.org/content/m13173/latest/ znalazłem wzór wraz z przykładową macierzą oraz wyliczonymi dla niej współczynnikami DCT. Mój kod wylicza poprawnie tylko element [0][0] i nie wiem gdzie popełniam błąd. int u, v, x, y; float suma, wynik, wu, wv; const pi = 3.141592653589793;
for( u = 0; u < 8; u++ ) { for( v = 0; v < 8; v++ ) { suma = 0; if( u == 0 ) wu = 0.353553390593274; if( u != 0 ) wu = 0.5; if( v == 0 ) wv = 0.353553390593274; if( v != 0 ) wv = 0.5; for( x = 0; x < 8; x++ ) { for( y = 0; y < 8; y++ ) { suma = suma +( StringGrid1->Cells[ x ][ y ] * cos(( u *(( 2 * x ) + 1 ) * pi ) / 16 ) * cos(( v *(( 2 * y ) + 1 ) * pi ) / 16 ) ); } } wynik = RoundTo( wu * wv * suma, 0 ); StringGrid2->Cells[ u ][ v ] = wynik; } }
Ps. Piszę w Borland C++ Builder. (StringGrid1 to tablica wejściowa) |
|
DejaVu |
» 2009-10-05 18:33:33 Możliwe błędy: 1) źle przepisany algorytm 2) odwrotne indeksowanie tablicy x,y => y,x 3) sin/cos przyjmuje radiany, a wzór wyrażony jest w stopniach
|
|
maciekbyrwa Temat założony przez niniejszego użytkownika |
» 2009-10-05 19:54:26 >Możliwe błędy: >1) źle przepisany algorytm
Algorytm napisałem sam na podstawie znalezionego wzoru. Wzór ten znalazłem także w 3 książkach, a więc raczej jest dobry. W linku który podałem jest podana wyliczona macierz - sprawdzałem w Matlabie i dostaję taki sam wynik jak na stronie.
>2) odwrotne indeksowanie tablicy x,y => y,x Sprawdzałem - otrzymuje się takie same liczby tylko w innych miejscach macierzy.
>3) sin/cos przyjmuje radiany, a wzór wyrażony jest w stopniach To sprawdzę, ale co dziwne element o współrzędnych [0,0] jest wyliczany prawidłowo |
|
« 1 » |