look up table erzeugen



  • 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 😃


Anmelden zum Antworten