![]() |
---|
Von einem Startwert in Schritten zum Zielwert logarithmisch nähern. Der Startwert soll beliebig sein und der Zielwert soll beliebig sein. Ich habe mal ein Foto von meiner Excel Tabelle angefügt. Ich brauche dies für 4 verschiedene Start und Zielwerte. Für den Startwert von und dem Zielwert von habe ich eine logarithmische Kurve hinbekommen. Habe denn die gleiche Formel auch für die 3 anderen Start und Zielwerte genommen, aber die Kurve sieht sehr linear aus. Und ich möchte das die genau so aussieht wie die erste Kurve, also stark logarithmisch. Nur halt in der Y-Achse angehoben. Die Formel muss ich später für einem Microcontroller in schreiben. Die Formel findet später Anwendung in einer LED Ansteuerung. Auf der X-Achse sind die Anzahl der LED. Auf der Y-Achse sind die Energiewerte, womit die zu Anzahl der zu leuchtenden LED bestimmt wird. Für einen Logarithmus habe ich mich entschieden, da diese Kennlinie gut die menschlichen Sinne ähnelt. Und die Energiewerte haben einen Bezug zu der Lautstärke der Musik. Es gibt auch Diskussionen dass der de.wikipedia.org/wiki/Stevenssche_Potenzfunktion besser geeignet sein soll dafür. Dies habe ich in meiner Internet Recherche: www.mikrocontroller.net/articles/LED-Fading gefunden. Bin also offen für alles, was die geeignete Funktion angeht für diese doch spezielle Anwendung. Bitte berücksichtig, dass mein Mathe eher nicht so gut ist. Also ist mein Wissen für die Logarithmische und für eine Potenzfunktion etwas eingeschränkt. Anbei die Formel die ich bis jetzt benutze: Schritte Startwert Endwert Energiewert Anzahl der LED´s Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert): "Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen." |
Hierzu passend bei OnlineMathe: Logarithmusfunktion (Mathematischer Grundbegriff) Rechnen mit Logarithmen Online-Übungen (Übungsaufgaben) bei unterricht.de: |
![]() |
![]() |
Ich glaube nicht, dass die Funktion, die du im Text mit angibst jene ist, die du im Excel sheet realisiert hast. Die Funktion im Excel screenshot scheint mir aber durchaus richtig zu sein. In einem lin-log plot würden die Kurven wie gefordert (so verstand ich dich jedenfalls) als Geraden erscheinen. Dass deine Level1 bis Level3 Kurven auch im "normalen" Koordinatensystem sehr linear aussehen liegt daran, dass dort die relative Steigerung von Anfangs- bis zum Endwert relativ klein ist. Bei Level0 liegt diese Steigerung bei stolzen bei Level1 nur mehr bei rund (Endwert ist nur etwa doppelt so groß wie der Anfangswert) und bei Level 3 gar nur rund (Endwert ist gerade mal um ein Drittel größer als der Anfangswert). Da darf man sich auch bei einer Exponentialfunktion keine allzu große Krümmung erwarten. Du kannst ja selbst leicht in Excel nachprüfen, dass der Quotient zweier aufeinander folgender Werte immer gleich ist, was gleichbedeutend damit ist, dass die Differenz der beiden logarithmierten Werte immer konstant ist. Die Funktion selbst hast du in Excel ziemlich aufwändig und umständlich realisiert. Sie könnte auch einfach als geschrieben werden. In Zelle sollte also =E$7*POT(E$8/E$7;$A15/E$12) genügen und die Zeilen und obsolet machen. Oder, wenn es die bei der Exponentialfunktion unbedingt die Basis sein soll/muss, dann lautet die Funktion eben . Dabei ist die Bezeichnung für den dekadischen Logarithmus, der in Excel mit LOG10 angegeben wird. |
![]() |
Ich muss wirklich zugeben, dass ich wenig Ahnung davon habe, was ich da tue. Aber ich eine Vorstellung dessen, was mein Ziel ist. Mein Ziel ist es alle 4 Wertebereiche mit einer einer Logarithmischen oder Potenzfunktion von einen Startwert zu einem Endwert steigen zu lassen. Diese sollte so aussehen wie die Kurve von Level 0. Ich möchte einen großen Bereich verteilen auf nur Schritte. In meinen Fall wären dies LEDs. Bei einer kleinen Änderung der Werte möchte ich das die Werte von durch schnell steigen. Und am ende der Werte von möchte ich bei einer großen Änderung der Werte von die Werte von langsamer sich ändern. Ist die überhaupt möglich mit einer Logarithmischen oder mit einer Potenzfunktion? Oder mit irgendeiner anderen Funktion? |
![]() |
Ich muss wirklich zugeben, dass ich wenig Ahnung davon habe, was ich da tue. Dann würde ich vorschlagen, dass du dich wieder meldest, wenn du es weißt bzw. du genauer weißt, was exakt du erreichen möchtest. Wenn du tatsächlich möchtest, dass alle deine Kurven unabhänging von Start und Endwert im linearen Koordinatensystem wie dein Level0 aussehen, dann versuche es ruhig mit . Der Sinn davon mag sich mir allerdings nicht erschließen. |
![]() |
Als du mir geschrieben hast, hab ich mich mit deiner Formel gleich ans Werk gemacht! Vielen Dank dafür!!! Ich kann sogar mit der die Steigung ändern. Das ist sehr praktisch, denn die Steigung von war etwas hoch. Ich bekomme aber so langsam ein Speicher Problem auf meinem Mikrocontroller. Den Sinn erkläre ich dir gerne. Ich nimm mit einem Mikrofon Musik auf. Die Kurzaufnahme wird in dem Mikrocontroller zwischen gespeichert. Anschließend durch eine FFT Funktion geschoben. Danach bekomme ich Anzahl an Daten. Genau gesagt Werte als eine sortierte Werteliste. Die Position der Daten in der Werteliste geben mir Auskunft darüber, welche Frequenz es ist. Und die Zahl gibt mir die Info wie laut diese Frequenz ist. Eine Leise Frequenz hat ca. den Wert und kann maximal ca. sein. Jetzt habe ich eine LED Matrix mit Pixel in der Höhe und Pixel in der Breite. Die Frequenzspanne ist von ca. 40Hz bis 20kHz. In ca. Hz Schritten. Die Energiewerte der Frequenzen verteile ich auf die LED Balken. Danach muss ich entscheiden bei welchem Energiewert ich die LED Balken einen Pegel ausschlagen lasse. Das Gerät nennt sich LED Musik Spectrum Analyser. Ich habe heute herausgefunden, dass sich die Frequenzen in Energiewerten zum Empfinden der Lautstärke stark unterscheiden. Als Beispiel die Energiewerte von den Frequenzen ab 10kHz sind deutlich geringer als die von den Tiefen und mittleren Frequenzen. Mit deiner Formel Mappe ich die Energiewerte eine Anzahl an zu leuchtenen LEDs pro Balken zu. Das ganze muss ich aber vorher alles fertig berechnen lassen durch den Mikrocontroller. Damit ich nur noch Vergleichen muss, um Rechenzeit zu sparen. Das Problem ist halt, dass ich einen Pegelausschlag haben möchte passend zur Musik Lautstärke. Und passend zum Gehörempfinden des Menschlichen Ohres. Das schon leise Werte einen kleinen Pegel liefern. Aber trotzdem einen großen Bereich abgedeckt wird. Das ist das knifflige daran. |
![]() |
Nun, die stammen von deinen Start- und Stoppwerten bei Level0 Ich hatte ja nur die Form der Kurve von Level0 auf beliebige Anfangs- und Endwerte übertragen. Allerdings stimmt dabei idR nicht mehr, dass die logarithmierten Funktionswerte äquidistant sind. Das ist eine Eigenschaft, die die ursprünglich angegebene Funktion hat und die du ja auch in deinem Excel Blatt implementiert hattest. Ich dachte, es würde sich vielleicht um Gradationskurven handeln und die logarithmierten Funktionswerte sollten linear sein, wegen der subjektiven Helligkeitswahrnehmung. Aber bei der subjektiven Lautstärkeempfindung ist es ja ähnlich, glaube ich. Darum hätte ich es auch nicht für unpassend gehalten, dass bei einer relativen Änderung von nur etwa wie in deinem Level3 der Verlauf nahezu linear ist. Aber wenn der Funktionstyp grundsätzlich egal ist, könntest du es auch mit der Potenzfunktion versuchen. Der Parameter a (Grad der Potenzfunktion) steuert dabei quasi die "Steilheit", also die Abweichung von einer simplen Geraden. Für hast du linearen Verlauf, Werte über 1 liefern Verläufe ähnlich dem von dir Gewünschten. |
![]() |
Vielen dank für deine Lösung und für deine Arbeit. Die Art Funktion ist mir Tatsächlich egal. Ich schaue mir deine 2te Formel gerne mal an. |