Transformata kosinusowa - algorytm JPG

0

Witajcie,
Na potrzeby jednego z moich projektów muszę "ogarnąć" algorytm JPG. Zatrzymałem się na etapie transformacie kosinusowej. Otóż coś nie za bardzo chce ze mną współpraować. Zacznę od tego, że jestem w drugiej klasie liceum ogólnokształcącego i nie miałem nigdy styczności z tak rozbudowanymi wzorami i nie wiem czy dobrze je zinterpretowałem. Korzystałem z kilku, ogólnodostępnych materiałów, np. ten( http://www.uz.zgora.pl/~pstec/files/kompresja.pdf ) lub ten( http://www.zsk.ict.pwr.wroc.pl/zsk/repository/dydaktyka/tech_wiz/tw_cwiczenie_5.pdf ). W pierwszym odnośniku podany został przykład. Dla niego pierwsza wartość się zgadza, lecz dalej jest już totalna herezja. Jeżeli moglibyście mnie naprowadzić na poprawne rozwiązanie to byłbym wielce wdzięczny.

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
using namespace std;
 
int main()
{
    srand(time(NULL));
    int width = 8;
    int height = 8;
    int blok[8][8];
    int suma = 0;
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {
            int a;
            cin >> a;
            blok[x][y] = a;
        }
    }
    int transformatakosinusowa[8][8];
    for(int k = 0; k < height/8; k++) {
        for(int l = 0; l < width/8; l++) {
            float c_u, c_v;
            for(int u = 0; u < 8; u++) {
                for(int v = 0; v < 8; v++) {
                    if(u == 0) c_u = 1/sqrt(2); else c_u = 1;
                    if(v == 0) c_v = 1/sqrt(2); else c_v = 1;
                    suma = 0;
                    for(int x = 0; x < 8; x++) {
                        for(int y = 0; y < 8; y++) {
                            suma += blok[x][y] * cos(((2*x+1)/16)*u*M_PI) * cos(((2*y+1)/16)*v*M_PI);
                        }
                    }
                    transformatakosinusowa[u][v] = c_u*c_v*suma/4;
                    cout << u << " " << v << " " << blok[u][v] << " " << transformatakosinusowa[u][v] << "\n";
                }
            }
        }
    }
}

Wynik możecie sprawdzić, np. tu: http://ideone.com/798V1Q . Przepraszam za trochę chaotyczny kod, ale jest to wycięta część całego programu.
Proszę o nie kierowanie mnie na gotowe biblioteki !

Z góry dziękuję,
Pozdrawiam,
jpowie01

2
#include <iostream>
#include <iomanip>
#include <cmath> 
using namespace std;

const size_t width=8;
const size_t height=8;
 
int main()
  {
   int blok[height][width]
   //*/// magiczny przełącznik: usuń jedną łamaną na początku wiersza
     =
     {
      {186,198,199,190,182,177,182,197},
      {179,184,183,176,173,172,175,184},
      {188,182,180,178,174,172,171,166},
      {132,130,139,146,151,169,191,201},
      {131,134,137,140,139,139,139,138},
      {153,157,161,172,177,145,89,49},
      {190,178,192,196,120,43,39,47},
      {176,184,187,112,41,39,43,44},
     };
   /*/
   ;
   for(size_t y=0;y<height;++y)
     {
      for(size_t x=0;x<width;++x)
        {
         cin>>blok[x][y];
        }
     }
   //*///
   float transformatakosinusowa[height][width];
   //float C[]={0.5,0.25*sqrt(2)},pi8=M_PI/8;
   float C[]={0.25,0.125*sqrt(2),0.125},pi8=M_PI/8;
   for(size_t v=0;v<width;++v)
     {
      for(size_t u=0;u<height;++u)
        {
         double suma=0;
         for(size_t x=0;x<width;++x)
           {
            for(size_t y=0;y<height;++y)
              {
               suma+=blok[y][x]*cos((y+0.5)*v*pi8)*cos((x+0.5)*u*pi8);
              }
           }
         //transformatakosinusowa[v][u]=C[!v]*C[!u]*suma;
         transformatakosinusowa[v][u]=C[!v+!u]*suma;
        }
     }
   cout.setf(ios::fixed);
   for(size_t y=0;y<height;++y,cout<<endl)
     {
      for(size_t x=0;x<width;++x)
        {
         cout<<setw(8)<<setprecision(4)<<transformatakosinusowa[y][x]/1000;
        }
     }
   return 0;
  }
0

Niezmierne dzięki ! Działa jak należy.
Bez Twojej pomocy pewnie utknąłbym w miejscu. Jeszcze raz wielkie dzięki ;)

Pozdrawiam,
jpowie01

1 użytkowników online, w tym zalogowanych: 0, gości: 1