Forum: Mikrocontroller und Digitale Elektronik Echtzeit normalisieren


von Sam .. (sam1994)


Lesenswert?

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 ;) ).

von Hans M. (hansilein)


Lesenswert?


von Sam .. (sam1994)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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.

von Hans M. (hansilein)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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?

von U.R. Schmitt (Gast)


Lesenswert?

So ganz verstehe ich es nicht.
Im ersten Beitrag sprichst Du von 'normalisieren'
Und jetzt von einem Dynamik-Kompressor.
Was denn nu?

von Sam .. (sam1994)


Lesenswert?

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?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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).

von U.R. Schmitt (Gast)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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.

von P. M. (o-o)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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
Noch kein Account? Hier anmelden.