Moin Moin, ich lese nun schon seit einiger Zeit fleissig hier mit, habe ab und zu auch schon gepostet, und nun habe ich auch mal eine (wahrscheinlich ziemlich dumme)Frage. Ich steh grad nämlich total auf dem Schlauch und habe schon leichte Kopfschmerzen. Ich habe zwei digital einstellbare "Potis" mit jeweils 8bit 0x00 entspricht in meiner Anwendung 0% Dämfung, 0xFF entspricht 100% Dämpfung. Je eines dieser "Potis" ist für einen der beiden Stereokanäle eines Verstärkers zuständig. Nun Habe ich mehrere Größen, die ich miteinander "verwursten" möchte, ich komme nur einfach nicht auf eine einfache Lösung, die ich auf einem µC in C simpel umsetzen kann: Eingabe - Dämpfung Gesamt als 8bit Wert - Balance als 8bit Wert Ausgabe - Dämpfung links - Dämpfung rechts Wenn 'Balance' sich genau in der Mittelstellung befindet, soll der 'Dämpfung links' und 'Dämpfung rechts' exakt gleich gross sein. Weicht 'Balance' nach links oder rechts ab sollen die Werte von 'Dämpfung links' und 'Dämpfung rechts' entsprechend größer/kleiner werden. Die angehängte Skizze macht es sicher einfach meinem wirren geschreibe zu folgen. Hat irgendjemand einen kurzen Denkanstoss für mich? Ich möchte ungern mit Prozenten und dementsprechenden Fließkommazahlen rechnen - Das muss doch irgendwie möglich sein... Mein Problem wurde doch bestimmt schon 10'0000e mal gelöst. Danke für die Hilfe und Grüße P.
(wäre ein freundlicher Admin so nett, den doppelten Dateianhang zu korrigieren? Danke!)
Hi, ich würde den Ansatz etwas anders gehen. Momentan hast du bei Balance = mitte nicht die volle Aussteuerung und verlierst dadurch auch an Dynamikumfang deiner Potis. Ich würde Mitte als 100 % Lautstärke definieren, wenn die Balance nach rechts verschoben wird, muss der linke Lautsprecher leiser werden, wenn nach links verschoben wird, der rechte Lautsprecher leiser... Balance würde ich als signed verwenden, das macht die Rechnerei etwas einfacher. Das ganze einfach mal aus dem Kopf runtergeschrieben:
1 | uint8_t volume = 42; |
2 | int8_t balance = -64; //~ 50 % nach links |
3 | |
4 | uint16_t volR = volume; |
5 | uint16_t volL = volume; |
6 | |
7 | if(balance < 0) |
8 | {
|
9 | //balance nach links verschoben, rechts muss verringert werden
|
10 | balance *= -1; //wert invertieren, damit er positiv wird |
11 | |
12 | volR -= (volR * balance) / 127 |
13 | }
|
14 | else if(balance > 0) |
15 | {
|
16 | volL -= (volL * balance) / 127 |
17 | }
|
Der Wert +128 darf für die Balance allerdings nicht verwendet werden. Bei der Multiplikation entsteht höchstens 255*127 = 32385, passt also in den uint16, trotzdem sollte volL und volR im Range des uint8 bleiben. HTH
Ich würde es mal mit Multiplizieren versuchen. Balance auf rechts: Rechts ( 0-255 ) * 127 Links ( 0-255 ) * 0 Balance auf halb rechts: Rechts ( 0-255 ) * 127 Links ( 0-255 ) * 63 Also neutral: Rechts ( 0-255 ) * 127 Links ( 0-255 ) * 127 Balance auf halb links: Rechts ( 0-255 ) * 63 Links ( 0-255 ) * 127 Balance auf links: Rechts ( 0-255 ) * 0 Links ( 0-255 ) * 127 Ich würde allerdings bei der Balanceverstellung nur Dämpfen und nichts anheben. Damit würde die Gesamtlautstärke die gleiche bleiben.
noch ein kleiner Anhang zur Erklärung wie ich es gemeint hab. Der Code funktioniert (bis auf die zwei vergessenen Semikolon) übrigens.
Ich verneige mich! Funktioniert. Und natürlich ist es auch viel schlauer den jeweils gegenüberliegenden Lautsprecher einfach abzusenken. Habe Deinen Code mal in mein Projekt verpflanzt und siehe da, es tut was es soll. Der Abend ist gerettet. Danke!
Das kommt natürlich auf die Charakteristik der elektronischen Potis an. Denn für gewöhnlich will man, daß beim Ändern der Balance die Gesamt- lautstärke erhalten bleibt. Nur den Pegel eines Kanals absenken ist Mist, weil da die Lautstärke absinkt sobald man die Balance aus der neutralen Mittelposition dreht. Am einfachsten ist es, wenn die Potis eine dB-lineare Kennlinie haben. Wenn also jeder Schritt den Pegel um einen konstanten Betrag von x.y dB anhebt bzw. absenkt. In diesem Fall muß man Lautstärke- und Balancewert einfach nur addieren. Die einzige kleine Schwierigkeit ergibt sich hierbei daraus, daß der Wert für die Lautstärke i.d.R. vorzeichenlos ist, während der Wert für die Balance natürlich ein Vorzeichen braucht. XL
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.

