sound channel mixing - Formel ?

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.

sound channel mixing - Formel ?

Beitragvon RedGuy » 09.07.2017, 12:33

Hi !


für mein Projekt eigener Computer https://zfx.info/viewtopic.php?f=10&t=4123 bin ich gerade an einem eigenen Sound-Chip dran ;) .

Jetzt stellt sich für mich eine triviale Frage:

Wenn man verschiedenen Kanäle für sound hat (zum Beispiel mehrere Geräuschquellen).
Wie berechnet man die resultierende Schallamplitude ?


Ich bin von einfacher Superposition (Wellenüberlagerung) also eine einfache Addition der Kanalamplituden ausgegangen.
So dürfte das nämlich in der Natur sein.

Wenn man sich das aber konkret mal zu Gemüte führt:
Da kommt man doch bei gerade mal 2 Geräuschquellen schnell an die Peak-Amplitude oder gar Übersteuerung.

Wenn man dann z.B. 50 Geräuschquellen hätte- alle mit einer normalen Lautstärke. Dann hat man definitiv Übersteuerung.


Kurzum: Gibt es da eine Formel für channel-mixing ?


Da könnte ich mir eine Funktion vorstellen, die sich bei hohen Amplituden weniger schnell steigert (weil der Schall immer mehr Widerstand bietet)...


Den Rest des sound-chips (also buffering und sampling) habe ich allerdings schon implementiert ;) .

Gruss
RedGuy
RedGuy
Manuel Hofmann
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: sound channel mixing - Formel ?

Beitragvon DerAlbi » 09.07.2017, 16:42

Wieso genau sind die Lösungen, die man per Google findet, keine Option für dich?
DerAlbi
 
Beiträge: 172
Registriert: 20.05.2011, 05:37

Re: sound channel mixing - Formel ?

Beitragvon RedGuy » 09.07.2017, 18:06

Hi !

also ich hab keine Formel gefunden- das ist das Problem :( .

Gruss
RedGuy
Manuel Hofmann
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: sound channel mixing - Formel ?

Beitragvon DerAlbi » 09.07.2017, 18:28

Da gibt es auch keine Formeln neben A+B... man kann noch mit einem Faktor multiplizieren.. z.B: 1/sqrt(2) weil sich unkorrelierte Signale nicht direkt addieren reicht die korrektur um 3dB und nicht um 6dB.
Das Problem ist, dass es dennoch zu clipping kommen kann - das ist unvermeidbar. Es geht vielmehr um Algorithmen, wie man das Clippen minimiert.. das läuft auf dynamische Kompression hinaus.
Die simpelste Variante, die wohl wirklich eine Formel anstatt eines Algorithmus ist, währe wohl tanh. Alternativ gibt es "A+B - AB".. was du sicher schon gefunden hast.. aber das hat aufgrund des Mischprodukts hässliche spektrale Effekte.
DerAlbi
 
Beiträge: 172
Registriert: 20.05.2011, 05:37

Re: sound channel mixing - Formel ?

Beitragvon RedGuy » 09.07.2017, 20:31

Hallo !

Danke an DerAlbi !


Also das mit dem Faktor multiplizieren ist eine gute Idee.
Man könnte ja den Durchschnitt berechnen.

Allerdings frage ich mich was eigentlich real ist.

Normalerweiße müsste man nun wirklich physikalisch hergehen und
das schwingende System Luftmolekül betrachten:

die Masse des Luftmoleküls, den Luftdruck als rücktreibende Kraft und ggf. zusätzliche Trägheit des Systems
und letztenendes den Schalldruck der Geräuschquelle als einwirkende Kraft auf das System.

Damit kann man die sich einstellende Auslenkung nach superpositionierten Kräften berechnen.

Hat jemand soetwas schoneinmal durchdacht, oder gar Akkustik im Studium gehabt oder Ähnliches ?!

Gruss
Red
RedGuy
Manuel Hofmann
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: sound channel mixing - Formel ?

Beitragvon DerAlbi » 09.07.2017, 21:42

Naja sowas gehört zu jedem Elektrotechnikstudium. Du bist vollkommen auf dem Holzweg. Die physikalischen Effekte, die du emulieren willst geschehen automatisch an der Membran des Lautsprechers, wenn du sie mit dem Summensignal ansteuerst. Und wie ich schon sagte, ist der Druchschnitt technisch verkehrt, da sich nichtkohärente Signal amplitudentechnisch nicht 1:1 addieren, sondern 1A + 1B = sqrt(2)(A+B). (wobei die Zahlen jetzt für den Leistungsgehalt des Signals stehen) Daher nur 3dB anstatt 6dB korrektur, wie ich sagte. Die 6dB-Korrektur [also 0.5*(A+B)] führt zwar zu numerischer Korrektheit aber insgesamt ist es leiser als es statistisch sein muss. Du musst auch überlegen, was passiert, wenn bei A+B das B sehr leise ist. Dann 0.5*(A+B) zu rechnen ist vollkommen sinnlos. Daher solltest du dynamisch komprimieren. Das geht aber eher per Algorithmus, als per Formel.
Etwas anderes ist es, wenn du korrelierte Signale aufaddieren willst, dann ist 0.5*(A+B) korrekt. Sowas passiert z.B . Wenn du von Stereo auf Mono zurück willst.
Angesichts deines Hintergrundwissens und deiner gedanklichen Fehlkonzeption was Audio angeht und deines Rechercheerfolgs, würde ich dir aber einfach dazu raten einfach A+B mit saturierender Arithmetik zu berechnen und es dabei bleiben zu lassen. Das wird viel viel akzeptabler sein, als du denkst. Ähnliche Probleme hast übrigens du auch, wenn du über digitale Filter nachdenkst - wie z.B. einem Low-Shelving Filter, der dir Bässe anhebt: aufgrund der begrenzten Dynamik ist das Design des Filters das trivialste am Gesamtproblem. Gedankengut auf Basis von Luftmolekülen hilft auch da nicht wirklich weiter.
Du müsstest auch mal etwas mehr recherche betreiben, was die Signale angeht, die du überhaupt addieren willst. Du würdest feststellen, wie schlimm heutzutage handelsübliche Musik übersteuert ist.
Die Variante mit dem A+B-AB ist, wie ich auch schon sagte leider nicht wirklich so schlau, wie es dir vorkommt, da A*B etwas ist, was sich nicht gut anhört. Du hast dann aber die Überlagerung von A, B und halt diesem AB und naja..
DerAlbi
 
Beiträge: 172
Registriert: 20.05.2011, 05:37

Re: sound channel mixing - Formel ?

Beitragvon Schrompf » 10.07.2017, 08:42

Albi hat das schon gut zusammengefasst. Rein physikalisch passiert genau das, womit Du angefangen hast: A plus B. Die Energien der verschiedenen Schallquellen addieren sich an Deinem Ohr. Das Audio-System am Rechner, über das Du dann abspielen willst, hat aber nur einen begrenzten Dynamik-Umfang. Daraus ergibt sich für Dich die Pflicht, die Audiosignale zu bearbeiten, so dass Du trotzdem im Rahmen des Computer-Audios bleibst. Und dafür gibt's jetzt diverse etablierte Lösungen, die Albi auch schon beschrieben hat, aber Du kannst auch was eigenes schreiben.

Nebenthema: die menschlichen Sinne funktionieren ja logarithmisch. Also beim Auge weiß ich es sicher, und ich vermute, dass das beim Ohr auch so ist. Und ob es wie bei Grafikkarten/Monitoren eine eingebaute Korrekturkurve auf der Amplitude gibt, die man korrigieren müsste.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3608
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: sound channel mixing - Formel ?

Beitragvon RedGuy » 10.07.2017, 12:41

Hallo !

Also, wenn man unter Anderem davon ausgeht, dass

-die Schallauslenkung vom Schalldruck bzw. direkt von einer Kraft abhängt,
-die Zeit (oder delta Zeit) innerhalb eines Samples konstant/gleich ist,
-sich die Kräfte superpositionieren und nicht die Auslenkung

,dann komme ich auf folgende Formel:

Code: Ansicht erweitern :: Alles auswählen
Auslenkung_gesamt = Fges / m_Luftmoleküle * 1/Quadratwurzel(2)


wobei

Code: Ansicht erweitern :: Alles auswählen
Fges = Summe aller n Kräfte Fx


und

Code: Ansicht erweitern :: Alles auswählen
Fx = Auslenkung_x * m_Luftmolekül * Quadratwurzel(2)

und
Code: Ansicht erweitern :: Alles auswählen
m_Luftmoleküle=n*m_Luftmolekül



Signifikant ist hierbei, dass sobald man nur noch eine Schallquelle/Kanal hat, alle Terme außer der Kanalauslenkung herausfallen, man also auch nur noch diesen Kanal hat.

Der Durchschnitt kann aus gewissen Gründen nicht stimmen.

Wenn man die Auslenkung über die obige Formel nicht mehr mikroskopisch haben möchte, skaliert man einfach den Wert.
Im Moment bezieht sich die Formel ja noch auf die Luftmolekülauslenkung und die Luftmolekülmasse. Das lässt sich wie gesagt leicht ändern.

Wie gesagt man braucht keine Korrektur (weil das ja in der Natur auch nicht der Fall ist) und es ist nicht A+B DER AUSLENKUNG (weil das in der Natur auch nicht der Fall ist;
sondern A+B DER KRAFT BZW. DES SCHALLDRUCKS ;) ).

Gruss
RedGuy
RedGuy
Manuel Hofmann
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: sound channel mixing - Formel ?

Beitragvon Schrompf » 10.07.2017, 13:04

Wat? Das war ein wahrhaft unverständlicher Braindump.

Aber, mach, was Du denkst. Immerhin steht ja schon oben: die Arbeit ergibt sich aus den Limitierungen des digitalen Systems, also ist erlaubt, was funktioniert.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3608
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: sound channel mixing - Formel ?

Beitragvon Spiele Programmierer » 10.07.2017, 13:25

Ich bin mir nicht sicher, dass ich eure Rechnungen wirklich verstehe.

Die Sache ist doch ganz klar Gesamt = A + B. Das folgert schließlich direkt aus dem Superpositionsprinzip.
Ein Mischen nach dem Prinzip Gesamt = (A + B) * Faktor wobei der Faktor != 1 (Beim Durchschnitt Faktor = 0.5) ist, ergibt auch offensichtlich keinen Sinn:
Wenn eine der beiden Soundquellen gerade absolut stumm ist (Sagen wir mal A=0), dann wird die andere in der Lautstärke verändert (Gesamt = B * f). Das die Anwesenheit einer potentiellen weiteren Soundquellem andere Sounds in der Lautstärke reduziert, ist offensichtlich nicht richtig. Ich denke auch nicht, dass das in der Praxis wünschenswert ist, allerdings kenne ich deinen exakten Verwendungszweck nicht.

Mir scheint, das es richtig, dass die Lautstärke (Amplitude) beim Mischen von zwei Signalen im Durchschnitt nur um sqrt(2) zunimmt. Allerdings heißt dass nicht, dass gelegentlich auch mal zwei maximale Samplewerte (nicht die Amplituden) aufeinandertreffen können und in dem Fall kommt es natürlich wieder zu gelegentlicher Übersteuerung.

Zur ursprünglichen Problemstellung: Mich würde interessieren, wie das Mixing in gäniger Software realisiert ist (z.B. Windows).
Ich vermute ehrlich gesagt, dass die Sounds einfach aufsummiert werden. Die maximal Lautstärke ist jedenfalls limitiert. Falls häufig eine Übersteuerung auftritt, könnte man eine Art dynamischer Kompression einsetzen (d.h. die Lautstärke automatisch ein wenig senken, so das keine Übersteuerung mehr auftritt). Das scheint mir relativ leicht umsetzbar, allerdings stellt sich die Frage, ob es einen Vorteil in der Praxis bringt.
Spiele Programmierer
 
Beiträge: 341
Registriert: 23.01.2013, 16:55

Re: sound channel mixing - Formel ?

Beitragvon RedGuy » 10.07.2017, 13:30

Hi Spiele Programmierer !

Wenn eine der beiden Soundquellen gerade absolut stumm ist (Sagen wir mal A=0), dann wird die andere in der Lautstärke verändert (Gesamt = B * f).


Das meinte ich mit:
Signifikant ist hierbei, dass sobald man nur noch eine Schallquelle/Kanal hat, alle Terme außer der Kanalauslenkung herausfallen, man also auch nur noch diesen Kanal hat.


Das spricht für meine Formel.



Ein Aufsummieren à la A+B kann, denke ich, NICHT stimmen, da es bei einer normalen Lautstärke der Quelle 1 mit einer zusätzlichen Quelle 2 ebenfalls mit normaler Lautstärke
zur Übersteuerung kommt. Mit zwei Tonquellen Übersteuerung kann einfach nicht stimmen. Dynamische Kompression wird da denke ich nicht eingesetzt.


Gruss
Red
RedGuy
Manuel Hofmann
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Re: sound channel mixing - Formel ?

Beitragvon Schrompf » 10.07.2017, 13:38

Tja, als Mitarbeiter einer Audio-Gruppe eines großen Fahrzeug-Entertainment- und Navigationssystems kann ich dazu beitragen: scheiße, ist das kompliziert. Unser Audiopfad besteht aktuell aus >600 einzelnen Filtern. Wir addieren Signale einfach, wenn wir müssen, aber da stecken davor und dahinter noch soviele Kompressoren, Limiter, Delays und Gains, dass ich keine Ahnung habe, was da noch alles passiert. Wir arbeiten aber mit 24bit-Samples und haben darin einen kundendefinierten Headroom von 12db freigehalten. Und um den zu halten, werden jetzt schon alle möglichen Faktoren (Lauter bei höherem Fahrtempo vs. Bassverstärkung vs. Echo Cancellation beim Telefonieren vs. wasweißichnochalles) gegeneinander balanciert, um die Limiter nicht allzu heftig zu strapazieren. Denn auch Limiter oder Kompressoren sind nur "weiche" Versionen eines Clippings, nur halt mit viel besserem Frequenzverhalten. Du willst eigentlich nicht in die Bereiche kommen.

Wie das ein Soundsystem in einem Computerspiel macht, würde mich aber trotzdem interessieren. Immerhin gibt's da sowohl einen großen Dynamikbereich als auch eine größere Zahl überlagernder Sound-Quellen, die Du am Ende auf Stereo/5.1/Wasweißich runtermixen musst.

[edit]@RedGuy:

Das ist weiterhin Bullshit. Es ist A + B, zumindest in der Natur. Und wenn Du das in nem Computer mit begrenztem Wertebereich machst, schlägst Du schnell oben oder unten an. Also brauchst Du zusätzliche Maßnahmen, um Clipping zu verhindern, weil das sonst Scheiße klingt. Ich weiß, ich wiederhole mich, aber man muss es deutlich sagen: was genau Du dann tust, um dem künstlich beschränkten Wertebereich eines Computers gerecht zu werden, ist Deine Wahl. (A + B)*f ist ein völlig valider Ansatz, ein Kompresser oder Limiter auch, wir machen beides und noch viel viel mehr.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3608
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: sound channel mixing - Formel ?

Beitragvon Spiele Programmierer » 10.07.2017, 13:43

Wie kommst du zu dem Schluss, dass "es nicht stimmen" kann?
Ich bin mir ziemlich ziemlich sicher, dass es schon stimmt.

Das ist doch eigentlich auch völlig natürlich und Alltagserfahrung. Wenn man zwei Soundquellen hat, ist es natürlich lauter als nur eine einzige. (Ok nicht zwingend, sie könnten sich z.B. auslöschen, aber das ist eher unwahrscheinlich.)
Wenn ein Samplewert für eine Lautstärke steht, gibt es natürlich auch einen maximalen Samplewert. Wenn man nun zwei solche Sounds abspielt, gilt das was ich oben gesagt habe. Es wird lauter! Und da bereits vorher maximale Samplewert erreicht war, gibt es jetzt auch Übersteuerung.

Vielleicht kannst du aber nochmal deine Gegentheorie darstellen, wie du vorschlägst zwei Sounds zu mischen.
Ich habe nämlich nicht ganz verstanden, was du mit deiner Rechnung aussagen möchtest.

EDIT:
Clipping mit theoretischen Signalen lässt sich recht leicht in der Praxis vermeiden in dem man Floating Points verwendet. Mein Eindruck ist, dass das auch zunehmend gemacht wird.
Nur wenn man es halt auf einen realen Lautsprecher abspielen will, gibt es immer eine Maximallautstärke (Sogar in der Natur, weil der Druck nach unten durch Vakuum begrenzt ist.) und dann muss man halt versuchen eine Lösung des geringesten Übels zu finden. Am Besten immer unter der Maximallautstärke bleiben. Sonst halt Verzerrungen hinnehmen, z.B. durch Übersteuerung oder dynamische Kompression.
Spiele Programmierer
 
Beiträge: 341
Registriert: 23.01.2013, 16:55

Re: sound channel mixing - Formel ?

Beitragvon Schrompf » 10.07.2017, 13:53

Grmpf. Ok, nochmal in Ultrakurzform, ein letzter Versuch.

a) Echt Welt. Da draußen, das Ding mit Wind und so. Geräusch A und gleichzeitig Geräusch B ergeben eine Amplitude von A + B.

Also so, wie Du schreibst. Bringt Dir nur nix, denn:

b) Computer. Das Ding vor Deiner Nase. Quer durch alle Sound-Komponenten des Rechners, vom Mikrofon über die vielen Bearbeitungsschritte in Software bis hintenraus zum Digital/Analog-Wandler und auf den Boxen hast Du Limitierungen. Du kannst nicht A + B machen und hoffen, dass das schon irgendwie gut geht, weil es ja in der echten Welt so funktioniert. Das wird Scheiße klingen.

War das jetzt deutlich?

Und jetzt, da Du und RedGuy hoffentlich verstanden haben, warum man nicht einfach A+B implementieren kann und dann fertig ist, kommen die ganzen Formeln und Maßnahmen, die DerAlbi und ich beschrieben haben. Die da wären:
a) ein festes Gain, also ne schlichte Multiplikation der Amplitude. (A+B)*f
b) Ein Kompressor, also eine Amplituden-Abbildungsformel, die hohe Amplituden sozusagen ausbremst. Die knallharte Lösung, die zuverlässig 0..unendlich auf 0..1 bremst, wäre der von DerAlbi anfangs genannte tanh()
c) Ein Limiter, also ein zustandsbehafteter Gain, der die Amplitude jedes Samples gegen einen Maximalwert prüft und bei Überschreiten den Gain runterschraubt und erst langsam über Zeit wieder hochkommen lässt. Also (A+B) * f(Zeit)
d) Alles beliebige, was Dir einfällt und was gut klingt.

[edit] Ich sehe gerade Dein Edit und glaube, Du bist doch schon weiter in Gedanken, als Du bisher geschrieben hast.
Zuletzt geändert von Schrompf am 10.07.2017, 14:03, insgesamt 1-mal geändert.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3608
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: sound channel mixing - Formel ?

Beitragvon RedGuy » 10.07.2017, 14:01

Hi zusammen !

@Spiele programmierer und Schrompf:

Also ich meine, aber jetzt nicht ausrasten (bitte das Folgende lesen) :) , dass A+B nicht stimmt aus folgendem physikalischem Grund:

Je weiter ein Luftmolekül nach außen gedrückt wird, desto mehr Gegenkraft erfährt dieses - auf Grund von Unterdruck und Gegendruck vom nächsten Molekül.
Dies bedeutet, dass wenn B sich versucht auf A aufzumodulieren, dann erfährt es eine immer stärker werdende Gegenkraft, sodass B sich niemals Ganz addiert.

Kapiert ?

Ich behaupte das Superpositionsprinzip gilt NUR für den Schalldruck!!

Gruss
Red
RedGuy
Manuel Hofmann
 
Beiträge: 111
Registriert: 17.09.2002, 17:27
Wohnort: Rottweil

Nächste

Zurück zu Algorithmen und Datenstrukturen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste