# Fehleranalyse - Diskrete Cosinus Transformation + Inverse DCT



## LemE.Tweakit (30. Dez 2014)

Hallo liebe Java Folks,
wir haben hier ein Problem mit der DCT. Wir wollen eben eine kleine Matrix z.B. 8x8 Werte Transformieren und anschließend wieder rücktransformieren um zu unseren Ausgangswerten zu kommen.
Wir sind bereits seit mehreren Wochen an dem Problem und können keinen Fehler aus mathematischer Sicht finden. Das einzige was wir uns noch vorstellen könnten wäre eine uns unbekannte Eigenheit von Java die die Daten in einer Weise manipuliert die wir nicht auf dem Schirm haben.
Wir sind wirklich für jeden Strohalm dankbar....

Viele Grüße und schonmal herzlichen Dank...


[Java]
public class TestDCT
{

    public static double[][] varianteEins(double [][] eingabe)
	{
		double [][] ergebnis = new double [8][8];
		double N = 8.0;
		double Ci = 0.0;
		double Cj = 0.0;
		double merker = 0.0;
		double schreibe = 0.0;

		for(int zeileErgebnis = 0; zeileErgebnis < 8; zeileErgebnis++)
		{
			for(int spalteErgebnis = 0; spalteErgebnis < 8; spalteErgebnis++)
			{
				for(int zeileEingabe = 0; zeileEingabe < 8; zeileEingabe++)
				{
					for(int spalteEingabe = 0; spalteEingabe < 8; spalteEingabe++)
					{
						merker = eingabe[zeileEingabe][spalteEingabe] * Math.cos(((2.0 * zeileEingabe + 1.0) * zeileErgebnis * Math.PI) / (2.0 * N)) * Math.cos(((2.0 * spalteEingabe + 1.0) * spalteErgebnis * Math.PI) / (2.0 * N));
						schreibe = schreibe + merker;
						merker = 0.0;
					}
				}
				if (zeileErgebnis == 0)
				{
					Ci = 1.0 / Math.sqrt(2);
				}
				else
				{
					Ci = 1.0;
				}
				if (spalteErgebnis == 0)
				{
					Cj = 1.0 / Math.sqrt(2);
				}
				else
				{
					Cj = 1.0;
				}
				schreibe = (2.0 / N) * Ci * Cj * schreibe;
				ergebnis[zeileErgebnis][spalteErgebnis] = schreibe;
				schreibe = 0.0;
			}
		}

		return ergebnis;
	}

    public static double[][] dekomprimieren(double [][] eingabe)
	{
		double [][] ergebnis = new double [8][8];
		double N = 8.0;
		double Ci = 0.0;
		double Cj = 0.0;
		double merker = 0.0;
		double schreibe = 0.0;

		for(int zeileErgebnis = 0; zeileErgebnis < 8; zeileErgebnis++)
		{
			for(int spalteErgebnis = 0; spalteErgebnis < 8; spalteErgebnis++)
			{
				for(int zeileEingabe = 0; zeileEingabe < 8; zeileEingabe++)
				{
					for(int spalteEingabe = 0; spalteEingabe < 8; spalteEingabe++)
					{
						if (zeileErgebnis == 0)
						{
							Ci = 1.0 / Math.sqrt(2);
						}
						else
						{
							Ci = 1.0;
						}
						if (spalteErgebnis == 0)
						{
							Cj = 1.0 / Math.sqrt(2);
						}
						else
						{
							Cj = 1.0;
						}
						merker = eingabe[zeileEingabe][spalteEingabe] * Math.cos(((2.0 * zeileEingabe + 1.0) * zeileErgebnis * Math.PI) / (2.0 * N)) * Math.cos(((2.0 * spalteEingabe + 1.0) * spalteErgebnis * Math.PI) / (2.0 * N));
						schreibe = (2.0 / N) * Ci * Cj * merker + schreibe;
						merker = 0.0;
					}
				}
				ergebnis[zeileErgebnis][spalteErgebnis] = schreibe;
				schreibe = 0.0;
			}
		}

		return ergebnis;
	}

    public static double[][] erzeugeTestdaten()
	{
		double[][] testdaten = new double[8][8];
		for(int i = 0; i < 8; i++)
		{
			for(int j = 0; j < 8; j++)
			{
				testdaten_[j] = 10.0;//(double)((i + j * 8.0) % 256);
			}
		}
		return testdaten;
	}

    public static void print(double [][] daten)
	{
		for(int i = 0; i < 8; i++)
		{
			for(int j = 0; j < 8; j++)
			{
				System.out.print(daten[j] + "\t");
			}
			System.out.println();
		}
		System.out.println();
	}



    public static void main(String[] args) 
    {
	double[][] testVar1;
	double[][] testVar1komp;
	double[][] testdaten;

        testdaten = erzeugeTestdaten();
	print(testdaten);

	testVar1 = varianteEins(testdaten);

	testVar1komp = dekomprimieren(testVar1);

	print(testdaten);

	print(testVar1);

	print(testVar1komp);
    }

}
[/Java]_


----------



## LemE.Tweakit (21. Jan 2015)

Hat sich erledigt, 
es waren nur triviale Fehler.... *schäm*

...


----------

