Fehleranalyse - Diskrete Cosinus Transformation + Inverse DCT

LemE.Tweakit

Mitglied
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]
 

Neue Themen


Oben