Hi Ich habe mal eine theoretische Frage: Wie realisiert man einen Echtzeit Normalisierer? Ich möchte so eine Echtzeit Lautstärkeregelung in meinen nächsten Verstärker einbauen, indem ein Attiny die das verstärkte Audiosignal misst und dann die Verstärker über einen PGA2311 regelt. Außerdem soll man die Lautstärke in Stufen einstellen können, welche dann nach der Stufe geregelt wird. Ich werde für die Verstärker den Tba820 nehmen, der reicht für meine protablen Lautsprecher gut. Nun das Problem: Der Normalisierer darf ja nicht einfach jeden Ton sofort regeln. Er muss eigentlich bei zu leiser Musik hochregeln und umgekehrt bei zu lauter. Dabei soll man das aber auch nicht merken. Und Musik die am Anfang leise ist soll nicht am Anfang genauso laut wie in der Mitte sein (das Problem kann man warscheinlich nicht lösen). Ich denke man muss einen uint32_t nutzen um immer die Durchschnittslautstärke zu haben. Also wird immer der ADC Wert gemessen und dazu addiert. Dazu steigt die eine Variable die zählt wie oft gemessen worden ist. Dann wird jedesmal leicht korrigiert. Je näher man an die gewünschte Lautstärke kommt desto schwächer korrigiert man. Funktioniert so ein Normalisierer? Kann man das einfacher machen (oder besser ;) ).
Wikipedia ist ja schön und gut aber ich wollte keinen Seitenlangen Bericht indem irgendwo meine Antwort steht. Außerdem (nichts gegen dich) ich kann auch zu jeder Frage hier einen Wiki Artikel suchen. Ich habe heute schon lange nach einem ähnlichen Projekt gesucht aber nichts gefunden. Ich wollte wissen ob das gut funkitoniert oder ob es einfachere / bessere Sachen gibt:
1 | uint32_t X = 0; |
2 | uint32_t count = 0; |
3 | uint32_t ls = 0; |
4 | |
5 | Do
|
6 | {
|
7 | X += getAdc(0); //Spannung messen |
8 | count++; |
9 | ds = X / count; //Durchschnitt ermitteln |
10 | if((ls >> 10) > ds) //Korrigieren |
11 | ls -= ds; |
12 | if((ls >> 10) < ds) |
13 | ls += ds; |
14 | }
|
15 | While(1) |
So stell ich mir das vor. Das ganze sollte man aber eher als Pseudocode nehmen. Man muss noch regeln dass das irgendwann zurückgesetzt wird.
Samuel K. schrieb: > Ich habe heute schon lange nach einem ähnlichen Projekt gesucht aber > nichts gefunden. Ich wollte wissen ob das gut funkitoniert Probiers aus. > Do > { > X += getAdc(0); //Spannung messen wie sieht deine Aussenbeschaltung aus? > count++; > ds = X / count; //Durchschnitt ermitteln Wenn du einfach nur das Signal anlegst und angenommen dein Inputsignal wäre ein Sinus, dann wäre nach deiner Methode der Durchschnitt auf lange Sicht gesehen 0. Was du willst: Du willst die Hüllkurve der Amplitude messen. Dazu brauchst du aber Aussenbeschaltung oder du versuchst diese Hüllkurve mit dem ADC festzustellen.
Was für ein Schrott ich geschrieben habe!!!
1 | uint32_t X = 0; |
2 | uint32_t count = 0; |
3 | uint32_t ls = 0; |
4 | |
5 | Do
|
6 | {
|
7 | X += getAdc(0); //Spannung messen |
8 | count++; |
9 | ds = X / count; //Durchschnitt ermitteln |
10 | if(DEF_LS > ds) //Korrigieren |
11 | ls -= ds; |
12 | if(DEF_LS < ds) |
13 | ls += ds; |
14 | Set(ls >> 10); |
15 | }
|
16 | While(1) |
So müsste es aussehen. DEF_LS ist die einstellbar Lautstärke. Meine Außenbeschaltung gibt es noch nicht. Deswegen frag ich ja nach der Theorie. Ich möchte nicht am Ende neue Platinen anfertigen nur weil meine Idee nicht funktioniert.
Samuel K. schrieb: > Wikipedia ist ja schön und gut aber ich wollte keinen Seitenlangen > Bericht indem irgendwo meine Antwort steht. Außerdem (nichts gegen dich) > ich kann auch zu jeder Frage hier einen Wiki Artikel suchen. Lies ihn trotzdem. > > Ich habe heute schon lange nach einem ähnlichen Projekt gesucht aber > nichts gefunden. Ich wollte wissen ob das gut funkitoniert oder ob es > einfachere / bessere Sachen gibt: Du musst das quadrat des eingangssignals geben und das über eine sehr lange Zeit(sekunden wahrscheinlich) mitteln. Mit einem Ringpuffer z.B. Da das letztlich nur ein Tiefpass ist könntest Du das Signal auch extern gleichrichten und tiefpassfiltern (großer Kondensator) Das ganze wird aber nicht viel taugen, entweder es macht Dir die Musik kaputt oder es reagiert zu langsam. Wie man es besser macht steht im oben verlinkten Artikel.
Also da steht nur: Der Threshold bestimmt, von welchem Signalpegel an der Kompressor das Signal bearbeitet. Mit Ratio wird das Kompressionsverhältnis und somit die Dynamikreduktion von Eingangs- zu Ausgangssignal eingestellt (zum Beispiel bedeutet 2:1 eine Reduzierung des Signals über dem Threshold um den Faktor 2). Attack ist die Einschaltzeit des Kompressors und die Zeit, die nach Überschreiten des eingestellten Schwellwerts (Threshold) vergeht, bevor das Ausgangssignal auf das eingestellte Kompressionsverhältnis (Ratio) heruntergeregelt wird. "Release" ist die Ausschaltzeit des Kompressors und die Zeit, die nach Unterschreiten des eingestellten Schwellwerts (Threshold) vergeht, bevor das Signal auf das ursprüngliche Verhältnis von 1:1 zurückgeregelt wird. Hier werden 4 Parameter beschrieben. Bin ich hier der einzigste, der noch nie einen Kompressor gebaut hat und das nicht versteht oder hast du den Artikel selbst nicht gelesen?
So ganz verstehe ich es nicht. Im ersten Beitrag sprichst Du von 'normalisieren' Und jetzt von einem Dynamik-Kompressor. Was denn nu?
U.R. Schmitt schrieb: > Und jetzt von einem Dynamik-Kompressor. Hans Mayer hat mich auf den Artikel verwiesen. Also nochmal Deutsch: Ich möchte eine automatische Lautstärkeregelung bauen, die meinen Stereoverstärker regelt nachdem man die Lautstärke einmal eingestellt hat. Ich dachte das nennt man Normaliesierung, oder nicht?
Ich habe sowas schon gebaut, mit einem Mega168 und PGA2311. Es funktioniert ganz anständig, allerdings ist es in der Tat nicht egal, ob man Sprachsendungen oder Musik hört. Gegebenenfalls muß man den Algorithmus etwas anpassen. Ein dynamischer Tiefpaß sammelt die ADC-Signale über ein einstellbares Zeitintervall und regelt den PGA nach. Schneller als 20ms sollte man nicht reagieren, da der PGA sonst Klickgeräusche macht, weil man die automatische Nullspannungsschaltung aushebelt. Ansprech- und Abfallzeit des Detektors sind einstellbar, ebenso die Tiefe des Eingriffes in das Originalsignal. Für Sprache ist eine schnelle Reaktion sinnvoll, für Musik eine langsamere bzw. eine längere Abfallverzögerung. Hier muß man experimentieren, so daß der Kompressor nicht pumpt. Weniger ist da oft mehr.
Keine Ahnung. Aber die Idee von der Wiki-Seite klingt ja nicht so, als ob sie schlecht wäre. > die meinen Stereoverstärker regelt nachdem man die Lautstärke > einmal eingestellt hat Das wird nicht funktionieren. Gerade in der Musik ist es nun mal ein Stilmittel, dass es laute und leise Passagen gibt. Wenn du daher die leisen Passagen auf denselben Pegel bringst wie die lauten, zerstörst du die Musik. Phil Collins würde sich umdrehen, wenn du das auf 'In the air tonight' loslässt. Man müsste im Vorfeld das komplette Stück analysieren, wahlweise den durchschnittlichen bzw. den maximalen Pegel feststellen und dann einen Verstärkungsfaktor festlegen, der dieses Stück auf 'Normpegel' bringt. Aber abgesehen davon: Den Wiki Artikel find ich eigentlich nicht schlecht geschrieben. Das einzige was das dort beschriebene von deiner Aufgabenstellung unterscheidet: Dort macht der Benutzer eine Vorgabe, zb 'Verstärkung um einen Faktor 2' und die Schaltung entscheidet dann, wann sie auf diese Vorgabe zurückgreift (nämlich wenn der Pegel lange genug unter einem Schwellwert war) bzw. wann sie bei eingeschalteter Verstärkung wieder zum Original zurückkehrt (nämlich wenn das Eingangssignal lange genug über dem Schwellwert war).
Samuel K. schrieb: > lso nochmal Deutsch: Ich möchte eine automatische Lautstärkeregelung > bauen, die meinen Stereoverstärker regelt nachdem man die Lautstärke > einmal eingestellt hat. Das ist dann definitiv KEINE Dynamikkompression. Wenn Du das willst ohne die Dynamik eines Stücks (längere leise und laute Passagen) verfälschen zu wollen, dann musst Du im Prinzip vor dem Abspielen das Stück komplett durchsuchen und auf eine Maximalaussteuerung normalisieren. Das setzt aber voraus, daß Du das komplette Stück digital vorliegen hast. Wenn Du das Ganze in Echtzeit mit einem Stream machen willst kannst Du nur eine Art gleitender Mittelwert bilden und wirst damit immer längere leise Passagen anheben und lautere dämpfen.
Das durchsuchen ist leider nicht möglich - wie gesagt in echtzeit. Dass das der Windoof Mediaplayer macht ist mir klar. Man müsste wirklich erst anfangen die Lautstärke zu ändern wenn z.b. 10 es zu leise / laut ist. Theoretisch könnte man doch auch erkennen wann ein neues Lied anfängt und dann einen Hashcode auf SD speichern der den anfang beschreibt und die Durchschnittslautstärke enthält. Sollte das Lied erneut erklingen erkennt der AVR das vergleicht die jetzige Lautstärke mit der damaligen und regelt am Anfang für das ganze lied. Ein HashCode müsste dann folgendes enthalten: - liedinfo - anfangslautstärke - durschnittslautstärke wenn man das auf einen KB bekommt enthält 1GB 1mio lieder.
Hash...viel Spass wenn da auch nur etwas ein klein wenig rauscht oder sonstwie nicht hunderprozentig reproduzierbare Eingangssignale generiert. Um den Anfang eines Stücks zu erkennen, ist ein Hash definitiv nicht geeignet.
1. War ja nur eine Idee. Aber durch dein viel Spaß wirst du mich nicht davon abbringen es auszuprobieren. 2. Es rauscht nicht! Die Signale kommen von meinem Hnady, mp3 Player... Außerdem kann man noch eine Zahl hinzuspeichern die sagt wie oft das schon erkannt worden ist. Wenn der speicher voll ist werden die nie erkannten gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.