Implementacja prostego wzoru na DCT

0

Witam,
Próbuję zaimplementować wzór na DCT. Jest on dostępny tutaj:
http://www.cafekarol.republika.pl/dct.html
Napisałem taki kod:

void dct (short int probki [][8], short int transformata [][8])
{
	for (int i=0; i<8; i++)
	{
		for (int j=0; j<8; j++)
		{
			double fi=0;
			for (int x=0; x<8; x++)
			{
				for (int y=0; y<8; y++)
				{
					double cos1=cos(((2*(double)x+1)/16.000*(double)i*3.14));
					double cos2=cos(((2*(double)y+1)/16.000*(double)j*3.14));
					fi+=probki[x][y]*cos1*cos2;
					
				}
			}
			if (j!=0)
			{
				int a=1;
			}
			transformata [i][j]=fi;
		}
	}
}

Na razie z pominięciem tych współczynników przed sumą, ale niestety nie działa.
Podejrzewam, że straszną głupotę muszę gdzieś robić, ale nie mogę znaleźć gdzie:/
Proszę o pomoc.

0
      if (j!=0)
                        {
                                int a=1;
                        }

Ten kawałek to oczywiście przypadek:)

0

A gdzie warunki odnośnie C(u) i C(v)?

0

Dopisałem transformację odwrotną, i wykonując:
dct(obraz,transformata);
idct(zrekonstruowany, transformata);
Powinno wyjść mniej więcej to samo, ale no nie wychodzi.
Oto kod:

void dct (short int probki [][8], short int transformata [][8])
{
	for (int u=0; u<8; u++)
	{
		for (int v=0; v<8; v++)
		{
			double sum=0;
			for (int x=0; x<8; x++)
			{
				for (int y=0; y<8; y++)
				{
					double cos1=cos(((2*(double)x+1)/16.000*(double)u*3.14));
					double cos2=cos(((2*(double)y+1)/16.000*(double)v*3.14));
					sum+=probki[x][y]*cos1*cos2;
					
				}
			}
			double Cu=1;
			double Cv=1;
			if (u==0)
			{
				int Cu=1/sqrt(2.0);
			}
			if (v==0)
			{
				int Cv=1/sqrt(2.0);
			}
			transformata [u][v]=sum*Cu*Cv*0.25;
		}
	
	
	}
}

void idct (short int probki [][8], short int transformata [][8])
{
	for (int x=0; x<8; x++)
	{
		for (int y=0; y<8; y++)
		{
			double sum=0;
			for (int u=0; u<8; u++)
			{
				for (int v=0; v<8; v++)
				{
					double Cu=1;
					double Cv=1;
					if (u==0)
					{
						int Cu=1/sqrt(2.0);
					}
					if (v==0)
					{
						int Cv=1/sqrt(2.0);
					}
			
					double cos1=cos(((2*(double)x+1)/16.000*(double)u*3.14));
					double cos2=cos(((2*(double)y+1)/16.000*(double)v*3.14));
					sum+=Cu*Cv*transformata[u][v]*cos1*cos2;
					
				}
			}
			
			probki [x][y]=sum*0.25;
		}
	}
}

Jakby ktoś chciał przetestować to taki przykładowy main:

int main(array<System::String ^> ^args)
{
	short int obraz [8][8]=
{-76,	-73,	-67,	-62,	-58,	-67,	-64,	-55,
-65,	-69,	-73,	-38,	-19	,-43,	-59,	-56,
-66,	-69,	-60,	-15,	16	,-24,	-62,	-55,
-65,	-70,	-57,	-6,	-26	,-22,	-58,	-59,
-61,	-67,	-60,	-24,	-2	-40,	-60,	-58,
-49,	-63,	-68,	-58,	-51	-60,	-70,	-53,
-43,	-57,	-64,	-69,	-73	-67,	-63,	-45,
-41,	-49,	-59,	-60,	-63	-52,	-50,	-34};


	short int dct2d[8][8];
	short int odwrotna [8][8];

	dct(obraz, dct2d);
	idct( odwrotna, dct2d);

Dajcie chłopaki cynk co tu jest nie tak, bo ja nie ruszy w miarę szybko to leżę i kwiczę:/

0
double Cu = (u == 0) ?  0.70710678118654746 /* 1.0 / sqrt(2.0) */ : 1.0;
double Cv = (v == 0) ?  0.70710678118654746 /* 1.0 / sqrt(2.0) */ : 1.0;

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