char zu long konvertieren
-
hallo ich möchte die samples eines Musikstückes ( 16 bit, 44,1 khz, stereo)
in long werte umwandelnangenommen 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 samplejetzt 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