Soundstreams Mixen (Theorie)



  • Hallo Leute,

    Ich mache mir seit ein paar Tagen darüber Gedanken wie man n Soundquellen (Streams) zu einem zusammenführen kann. Rein theoretisch bräuchte man ja nur alle Pegel miteinander zu summieren und dann ausgeben.

    y = a + b + c + ...

    Allerdings geht dies ja recht schlecht, wenn es zu Überschreitungen des Wertebereichs kommt.

    Also dachte ich mir, man könnte doch einfach den Mittelwert der Soundquellen nehmen.

    y = (a + b + c + ...) / n

    Dies führt allerdings zu dem Problem das jeder einzelne Pegel auf eine Lautstärke von M / n reduziert wird. (M - Maximale Lautstärke)

    Auch das Mischen mit Hilfe einer Logarithmusfunktion brachte mir keine brauchbaren Resultate.

    Bei einem analogen Mixer regelt man ja jeden Kanal einzeln und verhindert somit das man den Pegel überschreitet. Wenn ich aber ein Spiel programmieren würde, dann sollte ein Schuss möglichst Laut sein. Aber der Sound darf auch nicht übersteuern, wenn eben mal 3 Player auf der gleichen Stelle stehen und sich ihre Audiosignale überlagern.

    Also, bin ich jetzt zu doof, oder mache ich hier einen fatalen Fehler bei der Herangehensweise?

    PS: Meine Testsignale liegen mir PCM kodiert vor.

    mfG
    Tobain



  • Ich würde mich vielleicht mal über Kompressor oder Limiter schlau machen...



  • In irgendnem Winamp-Plugin wurde das einfach so gemacht:

    short int sample1;
    short int sample2;
    short int mixed;
    
    mixed=(sample1 + sample2) >> 1;
    

    ...verwende das selber auch in nem winamp plugin um ein stereo-signal in ein mono-signal umzuwandeln - Funktioniert einwandfrei, wobei ich keinen Schimmer hab was der Quellcode genau macht 😕



  • Also das kann ich dir ganz leicht sagen.

    Das ist nämlich: (a+b) / 2;

    Also genau eine Variante die ich nicht will. Für die Umwandlung in Mono ist es ja ganz brauchbar, aber zum Verbinden von n-Soundquellen ehr nicht.



  • Hmm, sowas hab ich mir schon fast gedacht 😃



  • Die empfundene Lautstärke hängt doch sowieso von noch vielen anderen Dingen ab.

    Alle Soundquellen hinreichend weit unter Maximalamplitude abspielen, addieren und einen Limiter einsetzen. Denk ich mal 🙂

    (google mal nach audio dynamic range limiter, peak limiter, compressor)



  • Also, wenn es sich tatsächlich um sehr viele quellen handelt würde ich mir auf jeden Fall einen kleinen Headroom freihalten (also einfach mit einem konstanten Faktor 0 < faktor < 1 multiplizieren).
    Ansonsten wie bereits gesagt einen Limiter nachschalten.



  • Besonder der mix mit (a+b+c+ ...)/n macht normal keinen sinn, da sich die max amplitutden der singale nicht addieren, im Falle unkorrelierter Singale, wovon man ja hier ausgehen kann.



  • hallo, das Problem mit dem Mixen haben wir auch, die Lösung davon ist verständlich, doch wie Bestimme ich aus der WAV-Datei welche Daten sich in linken bzw. rechten Kanal befinden? Werden die einzelnen Bytes abwechselnd angeordnet oder sind es Blöcke von 4 8 oder mehr Bytes?
    Danke in voraus
    Gruß
    BACEK



  • Bei Windows Wave Filen mit 16Bit Stereo kommen immer vorzeichenbehaftete shorts abwechselnd für links und rechts.

    Also zumindest im allgemeinen unkomprimierten Fall.
    http://www.sonicspot.com/guide/wavefiles.html


Log in to reply