Realisierung einer Lookup Tabelle an Stelle der Berechnung



  • lovepulse schrieb:

    void lut(short *x, short *y) {
         // Folgende Berechnung soll durch eine LUT im Cash gelößt sein
         // es handelt sich mal wieder um ein embedded system auf dem eine LUT
         // mit 600 diskreten Werten eingebunden werden soll zwecks Performancegründen
         
         *y = (*x)*2; // Hier soll an Stelle der Berechnung ein Zugriff auf eine LUT stehen
         
         } // void lut ende
    

    Hallo lovepulse,

    Eine Multiplikation mit 2 ist sicher nicht gerade das Paradebeispiel für eine Lookup Table. Aber so in etwa sollte es aussehen:

    void lut(short *x, short *y) 
    {
         short table[] = {....}; // Hier müssen die Werte rein
         *y = table[*x]; 
    }
    


  • Eine ganz einfach Lookup-Table würde ich z.B. so machen:

    void lut(short *x, short *y) {
        const short table[] = {0,2,4,6,8,10,12,14,16,18,20};
        const unsigned char upper_limit = sizeof(table)/sizeof(*table) - 1;
        const unsigned char lower_limit = *table;
    
        if(*x > upper_limit){
            *y = table[upper_limit];
        }
        else if(*x < lower_limit){
            *y = table[lower_limit];
        }
        else{
            *y = table[*x];
        }
    }
    

    PS: #define max 5 ist ja mal ultraböse.



  • Bei x*2 macht das ja überhaupt keinen Sinn.

    Normalerweise speichert man eben N Werte einer Funktion in einem Array und linear interpoliert dann zwischen den Werten. Aber das lohnt sich eben nur für Funktionen, wo linear interpolieren wesentlich schneller ist, als das ausrechnen der Funktion (zB die Trigonometrischen Funktionen)



  • Und weil wir das für ein Embedded System programmieren wollen, machen wir die Tabelle static.
    🙂



  • Au weia... 🙄



  • TactX schrieb:

    Au weia... 🙄

    wieso? ganz falsch liegt er nicht damit. sollen in die tabelle nicht 600 items rein? so'n grossen stack gibt's da meistens nicht
    :xmas2:



  • Deswegen macht man sie const und nicht static. Weil soviel RAM zum verschenken gibt's da meistens nicht.



  • ach ja, ein 'const' war ja drin, hab' ich glatt übersehen.
    naja, aber verlassen würde ich mich auf keins dieser c-keywords, dass das dann nicht vielleicht doch im ram landet...
    :xmas2:



  • Hi net,

    klar, wenn der Compiler scheisse baut ist das aber eher ein anderes Problem 😉



  • TactX schrieb:

    Hi net,

    hey, du hast mich aber schnell erkannt 🙂
    jaja, manchmal muss man einfach aufräumen. ~5000 auf dem counter war mir echt nicht mehr geheuer 😉



  • ten schrieb:

    TactX schrieb:

    Hi net,

    hey, du hast mich aber schnell erkannt 🙂

    Naja, schwer war's ja nicht 😉



  • vielen Dank für Eure Hilfe. Die LUT ist als "const" eingebaut. Es sind 1024 Werte die aus einem Polynom höherer Ordnung offline berechnet wurden. Programmabschnitt funktioniert 🙂


Anmelden zum Antworten