char zu long konvertieren



  • hallo ich möchte die samples eines Musikstückes ( 16 bit, 44,1 khz, stereo)
    in long werte umwandeln

    angenommen ich habe einen Teil des Stückes zum Beispiel 1152 samples pro kanal, das entspricht 4608 byte ( bei den oben genannten parametern),
    also 2 byte pro sample

    jetzt möchte ich, da 16 bit die 2 byte zusammenfassen zu einem short wert

    char *samples;
    
    const short *samplesAlsShort = (short *)samples;
    

    Ist dieser Cast Prozessor unabhängig???? Was geschieht mit den 2 byte, wie werden sie zusammengefasst?

    Dann möchte ich die short zu long casten und mono daraus machen:

    int size = 4608/4
    
    for(int i = 0; i< size; ++i, ++samplesAlsShort)
    {
    float samplesAlsLong = ((float)(((int)*samplesAlsShort)/ 32768 + ((int)*++samplesAlsShort)/32768))/2     
        (*m_input)[i] = sampleAslong;
    }
    

    Meint ihr diese Anweisungen sind so Korrekt? Wo könnte es probleme geben?
    Es kommen werte heraus...ich möchte nur sicher gehen das sie Richtig sind.

    Grüße



  • Der Cast ist definitiv nicht vom Prozessor abhängig - je nach System wird "*samplesAsShort" entweder "samples[0]+samples[1]<<8" oder anderherum sein. Genauso sieht es bei dem Gebilde darunter aus. Wenn du dir bei der Byte-Reihenfolge sicher sein willst, mußt du das manuell zusammensetzen:

    char* data;
    short sdat = data[0]+data[1]<<8;
    long  ldat = data[0]+data[1]<<8+data[2]<<16+data[3]<<24;
    


  • erstmal danke für die antwort,

    ich habe in meinem ersten posting etwas verwechselt:

    ich möchte natürlich die short zu float casten und nicht zu long
    so wie es auch im quelltext steht



  • Wenn du nur den Mittelwert aus den beiden short's bestimmen willst, solltest du bei der Ganzzahl-Arithmetik bleiben. Andernfalls wäre es angebracht, die Ausgangswerte der Rechnung schon nach float zu casten:

    float val = ( (float)sdat[0] + (float)sdat[1] )/65536.0f;
    

    (int-Divisionen schneiden die Nachkommastellen ab - da dürftest du als Ergebnis konstant 0 erhalten, egal was du reinsteckst)



  • ich habe mir jetzt noch mal eine andere Variante überlegt

    for(int n =0; 4608/4;++n)
    {
     float sampleAsfloat = (((float) ((unsigned char) data[(n*4)] + (data[(n*4) + 1] << 8)) / 32768) + ((float) ((unsigned char) data[(n*4)+2] + (data[(n*4) + 3] << 8)) / 32768)) / 2.0f;
        (*m_input2)[n] = sampleAsfloat;
        cout << (*m_input2)[n] << endl;
    }
    

    leider kommen andere Werte al bei dir raus... hast du eine Idee Warum?

    Grüße


Anmelden zum Antworten