Problem z wyliczeniem DCT

0

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;  // 1/sqrt(8)
	  if (u != 0) wu = 0.5;		       // sqrt(2/8)	

	  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. Program w Borland C++ Builder. (StringGrid1 to tablica wejściowa)

0

LOL masz źle zdefiniowane PI! Zdefiniowałeś je jako stałą int (int jest typem domyślnym)!
Dalsze konsekwencje tego błędu są takie, że wykonujesz obliczania na int-ach wewnątrz cosinusów (bo tam mnożysz dzielisz same int-y), więc wartości cosinusów wychodzą ci bezsensu (bo jedynie z całkowitych wartości kątów (radianów)).

Trzeba pisać tak kod by nie było warningów, a tym na pewno miałeś warning coś w stylu "implicit int type".

0

Dzięki. Teraz jest OK.

Do tej pory używałem Delphi, a w C dopiero zaczynam.

Ps. Warningów nie było - pisałem w BDS 2010.

0

To popatrz do ustawień kompilatora i powłączaj wszystkie możliwe warningi (a najlepiej to jeszcze włącz "treat warning as errors")!
C++ nie jest aż tak troskliwy jak Delphi i pozwala strzelić sobie w stopę.

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