Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Lautstärkeanpassung an Rohdaten

Lautstärkeanpassung an Rohdaten

andreas_g
andreas_g21.10.2109:11
Liebe Community,

ich habe eine Frage an alle Audio-Experten unter euch: Ich habe Audio-Daten, an denen ich eine frei wählbare Lautstärkeanpassung vornehmen will. Die Daten liegen als 16-bit Stereo in PCM vor. Wie müsste ich nun vorgehen, um die Audiodaten beispielsweise auf -20 dB anzupassen? Ich nehme an, sie müssten mit einem Faktor < 1 multipliziert werden? Wie würde ich diesen Faktor berechnen?

Ich bin für alle Hinweise dankbar! Falls meine Erläuterung unklar ist, bitte ich um kurze Info.
0

Kommentare

andreas_g
andreas_g21.10.2120:36
Hat niemand eine Idee, wie das zu berechnen wäre?
0
andreas_g
andreas_g23.10.2113:00
Das scheint die Lösung zu sein:

X ... gain in dB

sample *= pow( 2.0, X/6.014 )
0
seahood
seahood23.10.2113:50
durch 10, Eigenlob stinkt zwar, aber das steht in meinem frei erhältlichen Buch Kapitel auf Seite 70.

https://github.com/Christoph-Lauer/Book-Contenporary-Signal-Processing-Algorithms/blob/main/book.pdf
„Think different! “
-2
andreas_g
andreas_g23.10.2114:33
seahood
durch 10, Eigenlob stinkt zwar, aber das steht in meinem frei erhältlichen Buch Kapitel auf Seite 70.

https://github.com/Christoph-Lauer/Book-Contenporary-Signal-Processing-Algorithms/blob/main/book.pdf

Verstehe ich das richtig:
sample *= pow( 2.0, X/10.0 )

Die Basis ist 2!
0
seahood
seahood23.10.2114:38
man man HOCH 2 , die Formel ist aber auch noch falsch. Du musst einfach durch 10 teilen, also MAL FAKTOR 0.1. Steht alles in meinem Buch. Lies mal genau durch.
„Think different! “
0
andreas_g
andreas_g23.10.2114:39
Könnte es sein, dass in deinem Buch die Werte im linken Teil der Tabelle im Tabellenkopf vertauscht sind? Folgendes ergibt das annähernd gleiche Ergebnis wie meine Formel nur mit Basis 10:

sample *= pow( 10.0, X/20.0)
0
seahood
seahood23.10.2114:41
ne
„Think different! “
-5
andreas_g
andreas_g23.10.2114:47
Kannst du mich bitte erhellen? Wie würde die Formel richtig lauten?

Setze ich die Werte auf der -dB-Seite deiner Tabelle auf Seite 70 in deine Formel oben auf Seite 69 (log2lin) ein, erhalte ich die Werte der jeweils anderen Spalte (Amplitude, Power).

Beispiel: -6 dB, Amplitude
pow(10, -6/10) = 0,250

Sollte aber laut Tabelle 0,501 sein.

Oder verstehe ich die Tabelle nicht?
0
seahood
seahood23.10.2114:55
„Think different! “
-9
andreas_g
andreas_g23.10.2114:56
seahood

Sehr hilfreich, danke!

Ist hier vielleicht sonst jemand anwesend, der die Sache auflösen kann/will?
+1
seahood
seahood23.10.2115:07
Lustig, du hast sogar den fertigen code in dem Buch stehen.
„Think different! “
-6
seahood
seahood23.10.2115:08
Hast Du den verstanden was die 10 und die 20 sind?
„Think different! “
-7
seahood
seahood23.10.2117:14
Der Bell war wieder da (wau wau) und hat wieder zu geschnappt.
„Think different! “
-6
seahood
seahood23.10.2117:33
Zettel mit der Herleitung liegt bei mir auf dem Schreibtisch und ist abfotografiert.... Hinweise?
„Think different! “
-6
milk
milk23.10.2117:51
Apropos wau wau: Wow bist du unangenehm, werter seahood, wow...
+4
seahood
seahood23.10.2117:53
Dann schreib Du die Antwort doch hin Mir ist schon klar des JEDER der keine Ahnung davon hat jetzt Anfängt hier mal richtig loszulegen
„Think different! “
-9
kay123.10.2117:58
seahood
Dann schreib Du die Antwort doch hin Mir ist schon klar des JEDER der keine Ahnung davon hat jetzt Anfängt hier mal richtig loszulegen

Erkläre es doch einfach fix. Der gute Mann hat jetzt oft genug darum gebeten …
+5
seahood
seahood23.10.2118:03
Nö, mit Physiker Kindergarten und Legasthenie bin ich nicht zu Erkenntnissen gekommen. Ich weiß nicht wie man hier ein Foto hinzufügen kann, außerdem benutze ich Linux.
„Think different! “
-9
feel_x23.10.2121:34
seahood
Nö, mit Physiker Kindergarten und Legasthenie bin ich nicht zu Erkenntnissen gekommen. Ich weiß nicht wie man hier ein Foto hinzufügen kann, außerdem benutze ich Linux.

Hm. Besonders letzteres ist sehr bedauerlich. Spendenkonto?

Aber sei’s drum: Wenn Du meinst, nicht allzu nett zu uns sein zu müssen, sollte man Dir vielleicht auch nicht den Tipp geben, dass die in Deinem (Ehre, wem Ehre gebührt: Beeindruckenden) PDF verlinkte Domain „http://www.christoph-lauer.de“ zum Verkauf steht.

Ach: Und Legasthenie.. Deppenleerzeichen.. Glashaus, Steine und so.
+3
seahood
seahood23.10.2123:32
Das hat bestimmt mit der CDU zu tun.
„Think different! “
-10
marm23.10.2123:37
andreas_g
Beispiel: -6 dB, Amplitude
pow(10, -6/10) = 0,250

Sollte aber laut Tabelle 0,501 sein.
Amplitude ist Quadratwurzel von Power, schreibt das Orakel auf Seite 67. 0,501 = 0,250^(½)
+1
Krypton24.10.2100:49
Vielleicht kannst du noch erklären, was genau du vorhast.
Wenn du etwa nur ein Audio-Signal um 20 dB verringern möchtest, könntest du das ja beispielsweise mit einem Audio-Editor machen, etwa dem kostenlosen Audacity . Hier den Track laden, alles auswählen ( + A) und dann im Menü: Effekte Verstärken… - 20 dB

Wenn deine Ausgangsdatei eine Spitzenamplitude von - 20 dB haben soll, müsstest du für die Reduzierung erst die aktuelle Spitzenamplitude herausfinden. Hier gibt (benötigt) es für Audacity diverse Plug-Ins, andere Tools (wie etwa Amadeus) haben das in der «Wellenformstatistik» eingebaut. In beiden Tools könntest du den beliebig vohandenen Pegel aber mit der Effekt Normalisieren… auf -20 dB anpassen.

Willst du das ganze (wie es hier scheint) via eigenem Programm/Code machen wäre ggf. die Angabe der verwendeten Programmiersprache hilfreich, da vielleicht nicht jeder mit der verwendeten Schreibweise was anfangen kann.

Ansonsten hat seahood was das Ergebnis angeht, recht. Hier gibt es ein je nach Vorkenntnissen vielleicht verstehbares Tutorial in Form eines PDFs, in welchem die Umrechnung von Spannungswerten (wie im PCM-File verwendet) zu Bell bzw. deciBel (ein Zehntel-Bell) und (hier nicht so wichtig) die Umrechnung in Verstärkerleistung (Watt)
Was du benötigst, wenn du in dB rechnen willst, ist dB zu Spannung, da die Lautstärkewerte, die Amplitude in einem PCM-File eben als lineare Spannungs-Zahlenwerte hinterlegt sind. Im Script ist hier sowohl eine Formel als auch eine Tabelle (S. 27) für gängige Werte (ähnlich zu der in seahoods Dokument). Hier sind links die +Werte angegeben (also +6 dB = 4,0 Power-Ratio/Verstärkerleistung[10 log] oder +2,0 Voltage/Current Ratio also Spannungwert [20log]).
In den rechten drei Spalten sind die Minus -Werte hinterlegt, also -20dB = 10⁻² in Verstärker/Power oder 0,1 in Voltage/Spannung.
+5
seahood
seahood24.10.2101:39
Es ist wirklich schön anzusehen das hier nichtmal die Spur von einer Intelligenz vermutet werden kann, im Gegensatz zu dem Stück deutscher Geschichte wo dieser Code hergekommen ist. Vielleicht findest Du es ja noch heraus, ich verabschiede mich aber ohne die Antwort hier gepostet zu haben aus diesem Thread.
feel_x
seahood
Nö, mit Physiker Kindergarten und Legasthenie bin ich nicht zu Erkenntnissen gekommen. Ich weiß nicht wie man hier ein Foto hinzufügen kann, außerdem benutze ich Linux.

Hm. Besonders letzteres ist sehr bedauerlich. Spendenkonto?

Aber sei’s drum: Wenn Du meinst, nicht allzu nett zu uns sein zu müssen, sollte man Dir vielleicht auch nicht den Tipp geben, dass die in Deinem (Ehre, wem Ehre gebührt: Beeindruckenden) PDF verlinkte Domain „http://www.christoph-lauer.de“ zum Verkauf steht.

Ach: Und Legasthenie.. Deppenleerzeichen.. Glashaus, Steine und so.
„Think different! “
-11
Krypton24.10.2109:59
seahood
Nö, mit Physiker Kindergarten und Legasthenie bin ich nicht zu Erkenntnissen gekommen.
In genau dieser Schreibweise ist der Satz vermutlich ein Widerspruch in sich. Durch den fehlenden Bindestrich zwischen Physiker und Kindergarten sind es nur die zwei Worte: Physiker und Kindergarten. Vermutlich warst du aber in einem Kindergarten und ein Großteil der Informationen in deinem PDF basiert auf der Arbeit von Physikern und Mathematikern vor dir. Also scheinst du doch genau durch Kindergarten und Physiker zu Erkenntnissen gekommen zu sein. Ebenso ist die Legasthenie (Rechtschreibschwäche) in nahezu jedem deiner Posts und auch im PDF sehr offensichtlich. Scheinbar scheint auch sie ein Bestandteil deiner Erkenntnisreise zu sein. Die fehlerhafte Schreibweise von «Kindergarten Physiker» spricht hier für sich selbst.
Die einzige Unsicherheit ist also der Kindergartenbesuch.
seahood
Ich weiß nicht wie man hier ein Foto hinzufügen kann, außerdem benutze ich Linux.
So viel gelernt, aber nicht in der Lage, ein Bild hier hochzuladen?
Ich helfe dir gern:


Als erstes klickst du in der Symbolleiste oberhalb des Kommentarfeldes auf das «Bild einfügen» Symbol, das einen grünen Berg vor blauem Himmel mit gelber Sonne symbolisiert.


Es erscheint ein kleiner Upload-Dialog. Hier klickst du auf den Button «Durchsuchen». Es öffnet sich der Datei-Auswahldialog deines Betriebssystems, mit welchem du eine typische Bilddatei (im JPEG, PNG oder GIF-Format) auswählen kannst. Diese darf nicht größer als 4 MB sein, sonst funktioniert der Upload nicht. Gegebenenfalls also vorher mit einem Bildbetrachter oder einer Bildbearbeitung verkleinern).


Ist die Dateiauswahl erfolgreich, erscheint rechts neben dem «Durchsuchen» Button jetzt der gewünschte Bildname (2b). Durch einen Klick auf «Bild hochladen» startet der Upload und ein kleiner Bildverweis (im Stil: ) erscheint im Text.
Sobald du deinen Kommentar veröffentlichst, sieht man das Bild auf der Seite.
+4
Vermeer
Vermeer24.10.2112:17
Hier gibt es einige unnötig unfreundliche Kommentare. Und ein unfreundlicher Beitrag berechtigt auch nicht, ebenfalls grob zu antworten
+6
andreas_g
andreas_g24.10.2113:23
Danke für alle konstruktiven Beiträge! Ich beziehe mich auf den Kommentar von Krypton von 00:49:

Der Hintergrund meiner Fragestellung ist (wieder einmal) meine Arbeit am NeXT Computer-Simulator „Previous“. Die Audio-Ausgabe erfolgt bei diesen Systemen über den Monitor oder die sogenannte Soundbox. Zur Lautstärkeregelung enthalten beide einen Attenuator. Das Gastsystem steuert den Attenuator, in dem es einen Wert in ein Register schreibt. Die Bedeutung dieser Werte ist bekannt: Der Wert 1 bedeutet beispielsweise eine Verstärkung von -2 dB, der Wert 3 bedeutet -6 dB und so weiter.

Dieses Bauteil möchte ich nun simulieren, in dem ich den vom Gastsystem gelieferten Audio-Datenstrom (16 bit linear PCM) entsprechend anpasse.

Nach etwas mühsamer Recherche bin ich zum Schluss gekommen, dass ich die Daten (Samples) mit dem Faktor 2^(X/6,014) multiplizieren muss, wobei X die (im gegebenen Fall immer negative) Verstärkung in dB ist. Die Formel 10^(X/20) liefert das gleiche Ergebnis.

Ich habe nun hier die Rückmeldung bekommen, dass die Formel falsch ist. Mir ist allerdings noch nicht klar, wo der Fehler liegt.
+2
andreas_g
andreas_g24.10.2119:42
Ich habe mir das von Krypton verlinkte PDF jetzt noch einmal angesehen und auch mit seahood's Buch verglichen.

Ich stehe offenbar auf der Leitung:

Formeln:
Aus seahood's Buch entnehme ich auf Seite 68 die Formel:
Xlin = Cpwr * 10^(Xlog/Cref)

Die Formel widerspricht dem Code-Beispiel auf Seite 69 (log2lin), das lautet (der return dürfte wohl Xlin sein und log wohl Xlog):
return Cref * pow(10.0, log/Cpwr)

Cref und Cpwr sind im Vergleich zur obigen Formel vertauscht.

Letztere Formel entspricht der von mir recherchierten, sofern ich für Cpwr den Wert 20 (siehe unten zu den Tabellen) einsetze:
2^(X/6,014) beziehungsweise 10^(X/20)
Damit bekomme ich auch die korrekten Tabellen-Werte für Amplituden/Spannungen.

Dem Skript von Roland Pfeiffer entnehme ich auf Seite 19 die Formel:
mV = 10^(dBm(V)/20)

Auch diese Formel entspricht, sofern ich nicht etwas Fundamentales nicht verstehe, der von mir recherchierten.


Tabellen:
In den Umrechnungstabellen (seahood's Buch Seite 70, im Tutorial von Roland Pfeiffer Seite 27) sind die Werte für Amplitude bzw. Voltage/Current Ratio jeweils identisch (wenn ich die Tabelle 6 in seahood's Buch richtig lese, ist für Spannungen der Amplituden-Wert zu verwenden). Die im Tabellenkopf in Klammer geschriebenen Zahlenwerte unterscheiden sich allerdings (seahood's Buch Cpow=10, Tutorial von Roland Pfeiffer 20 log; für Power jeweils umgekehrt). Die Werte werden aber, zumindest wenn ich das Code-Beispiel log2lin aus seahood's Buch hernehmen, gleich verwendet. Nur mit dem Wert 20 bekomme ich die Tabellen-Werte für Amplituden/Spannungen.


Ich gebe zu, von den physikalischen Grundlagen nichts zu verstehen. Aber hier gibt es doch Widersprüche, oder? Wo ist mein Denkfehler und welche Formel ist nun richtig?
0
andreas_g
andreas_g27.10.2107:55
Gibt es hierzu noch Rückmeldungen?
0
andreas_g
andreas_g27.10.2115:23
Nach weiterer eingehender Recherche bin ich zum Schluss gekommen, dass die am 23.10.2021 um 13:00 Uhr als Lösung gepostete Formel zur Berechnung eines Faktors zur Lautstärkeanpassung von Audiodaten (linear PCM) entgegen der Behauptungen von seahood und den widersprüchlichen Angaben in seinem Buch korrekt ist.

Die Samples lassen sich also anpassen mit:
neu = alt * 2^(X/6,014)
wobei "neu" das lautstärkeangepasste Sample, "alt" das Sample vor Anpassung und "X" die Verstärkung in dB repräsentiert.

Nach dem die Basis 2 hier keinen effizienztechnischen Vorteil bringt (kein ganzzahliger Exponent) und die Multiplikation effizienter ist als die Division, habe ich die äquivalente Formel
neu = alt * 10^(X*0,05)
in meinem Programm eingesetzt.

Der Code geschrieben in C:
sample *= pow(10.0, X*0.05);
In meinem Anwendungsfall liegt der Wert X zwischen 0 dB und -infinity dB, der Umrechnungsfaktor also zwischen 1.0 und 0.0. Bei positiven Werte müsste man zusätzlich noch den möglichen Overflow des Datentyps für "sample" berücksichtigen.

Ich erhalte mit diesem Code plausible Daten. Mein Ergebnis stützt sich unter anderem auf folgende Posts in DSP- und Audio-Foren: und

Danke für alle nicht destruktiven Beiträge. Offensichtlich wird man hier von manchen Personen sogar für korrekte Beiträge beleidigt und (gezielt oder nicht) in die Irre geführt. Ein wenig mehr Moderation wäre wünschenswert.

Eine abschließende Botschaft an seahood: Die Formeln im Buch auf Seite 68 und die Zahlenwerte im Tabellenkopf auf Seite 70 sind fehlerhaft (siehe oben). Jeweils wurden Konstanten vertauscht. Das Gegenteil kann gerne bewiesen werden.
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.