PDA

View Full Version : [Frage] audio process methode


moaxl
14-01-2003, 20:07
falls es jemand braucht hier eine kurze Erklärung von bimbo mit großem Dankeschön an ihn für seine Erläurterungen:
*****************

was ich bisher(glaube ich) weis:

ein sample besteht aus den 2 nacheinanderfolgenden einträgen im
inData[], die muss man irgendwie verknüpfen, und das geht halt mit dem
"|" ich hab leider nicht die genaue funktionsweise im kopf aber ich
denk, dass das so wie eine addition funkt. zuerst veriebt man den ersten
teil nach rechts (<< 8 = multiplikation mit 256), und addiert dann binär
den 2ten teil( so bekommt man das sample)

ich glaub ungefähr so:
binär:
tempH = 10001011
tempH << 8 = 10001011 - 00000000
tempL = 01111111
((tempH <<8) |tempL) = 10001011 - 01111111

(die bindestriche sind nur als abgrenzung, und kein minus)

das verdoppeln der lautstärke kannst aber erst machen wenn du das ganze
sample hast(=((tempH <<8) |tempL) ) das kannst du mit 2 multiplizieren.

bimbo
14-01-2003, 21:04
was da steht sind nur vermutungen, die ich aufgestellt ab um mir das konzept zu erklären.
ich garantiere nicht für die richtigkeit

dem moaxl schon gsagt, ist eigentlich nicht wirklich relevant, da man "nur" 2 samples braucht, und die dan addiert und wieder durch 2 dividiert, um sie zu mischen. der code dahinter is glaub i net so relevant, aber trotzdem.

gck
15-01-2003, 13:38
ja, es stimmt so weit. Bis auf die Tatsache, dass es nicht standardisiert ist, ob der Wave Strom big oder little endian gespeichert ist, d.h. es kann auch sein, dass das hsb und lsb genau umgekehrt im Strom steht, je nachdem, was für ein Wave File ihr spielt...
ihr könnt entweder noch einen Codec vorschalten (auch wegen Samplefrequenz differenzen etc.. empfehlenswert), oder eine Funktion setEndian() in die Kontrollen aufnehmen, die entsprechend tempH und tempL vertauscht...

ansonsten möchte ich noch auf folgendes hinweisen, was vorallem im High Gain Betrieb einiges an Kopfzerbrechen erzeugen kann

short sample1, short sample2;

...

sample1 += sample2;
sample1 /= 2;

ist falsch, da ein Overflow bei der Addition passieren kann, weshalb Daten verloren gehen -> unpredictable results, wie rauschen, knacken, etc..

richtig: entweder int verwenden oder

sample1 /= 2;
sample1 += sample2/2;