look up table erzeugen
-
hallo,
kann mir jemand sagen wo her der fehler im erzeugen der loop up table liegt? kann ich die cosines nicht aufsummieren?
http://openpaste.org/en/24505/umrechnung ist folgende angewendet: http://img52.imageshack.us/img52/1671/formel.png
lg
-
Benenne deine auftretenden Fehler konkret und lasse hier nicht danach suchen.
Benutze passendere Cloud-Systeme wie www.codepad.org oder www.ideone.com, die du dort ohne Compilierfehler vorbereitest.
-
result ist vor der ersten Nutzung nicht initialisiert.
Was ist CosT[l][k]?
Nimm double statt float.
-
klar ist result initialisiert, einmal beim deklarieren, und nach der zuweisung!
gegeben ist:
x[0][0] = 95.0;
rauskommen sollte da:
z[0][0] = 1115.5;nach dem initialisieren der tabelle steht für:
cosT[0][0] = 64;
das aufsummieren von result mit x[m][n] ergibt: 8926
dem nach wäre:
z[0][0]= result * CosT[0][0] * alphak * alphal * mult_factor
z[0][0]= 8924 * 64 * 0,707 * 0,707 * 0,25 = 71370,4 --> also falsch!
-
Nur aus den Zahlen:
8924 / ( 64 * 0,707 * 0,707 * 0,25) = 1115,5;
-
warum division?
-
miket schrieb:
klar ist result initialisiert, einmal beim deklarieren, und nach der zuweisung!
Bei
float result, alpha_k, alpha_l = 0.0;
wird alpha_l mit 0 initialisiert. result und alpha_k nicht.
Dann benuzt du in Zeile 19 result += .... Da wird aber schon der Wert von result benötigt.
Evtl. hast du Glück un es steht schon 0.0 drin.
-
Wo kommt denn die 64 her? Der cosT[0][0] ist doch 1.
8924 * 1* 0,707 * 0,707 * 0,25 = 1115,5
-
damit, was ist hier falsch?
// Init cosine table for(l=0;l<N;l++) { for(k=0;k<N;k++) { result = 0.0; for(n=0;n<N;n++) { for(m=0;m<N;m++) { result += cosf((pi*(2*m+1)*k)/(2*N)) * cosf((pi*(2*n+1)*l)/(2*N)); } } CosT[l][k] = result; } }
-
Da muss noch das x[m][n] mit rein:
result += x[m][n] * cosf((pi*(2*m+1)*k)/(2*N)) * cosf((pi*(2*n+1)*l)/(2*N));
-
x[m][n] sind ja die input pixel...die transformiert werden! dachte es wäre nur sinnvoll die cosines in die tabelle zu geben...
-
Den Cosinus kannst du vorher berechnen, da reicht dann aber
Schleife über m schleife über k CosT[m][k] = cos((pi*(2*m+1)*k)/(2*N));
Da für n,l der Cosinus genauso berechnet wird.
Und nimm bitte double statt float.
und dann
Schleife über l Schleife über k result = 0.0; Schleife über n Schleife über m result += x[m][n]* CosT[m][k]* CosT[n][l] .... alpha_k = (k == 0) ? sqrt_factor : 1; alpha_l = (l == 0) ? sqrt_factor : 1; Rest wie gehabt
So ungefähr jedenfalls