An Statistiker/Mathematiker/Programmierer: Daten selektiv "weichzeichnen"

Moin,

stellt Euch vor, ihr habt Messwerte, welche ziemlich stark rauschen. Diese "Zitterkurve" im Diagramm soll rundgelutscht werden.

Wäre soweit kein Problem, berechnet man halt den Durchschnitt aus x Samples.

ABER: Ich muss auf ansteigende Werte sehr schnell reagieren, d.h. ich kann nicht erst x Messungen später merken, dass der Durchschnitt hochgegangen ist.

Hat jemand eine Idee, wie man das Problem angehen könnte?

Es geht konkret um einen Audio Spectrum Analyzer, der möglichst latenzarm auf Spitzen reagieren soll, ohne dabei nervös und flackrig auszusehen. Die Quadratur des Keises also.

Und das Ganze ohne "dirty tricks", wie z.B. langsames LED ausfaden. Ich brauche saubere Daten.

Beste Grüße,

Helmuth

Das was du suchst könnte der "gleitende Mittelwert" sein.

Leider nein, das ist ja genau das, was ich mit "Durchschnitt von x Samples" meinte.

Problem dabei: Weichzeichnung super, aber es verschluckt die Spitzen nach oben und erzeugt Latenz, also ein verzögertes reagieren auf Ereignisse diesseits oder jenseits des Durchschnitts.

P.S. Dies ist mein letzter Post als "God Member". :wink:

Du brauchst keinen Statistiker/Mathematiker/Programmierer, sondern einen Wahrsager/Magier/Telepaten!
:wink:

Helmuth:
Problem dabei: Weichzeichnung super, aber es verschluckt die Spitzen nach oben und erzeugt Latenz, also ein verzögertes reagieren auf Ereignisse diesseits oder jenseits des Durchschnitts.

Soll das sowas wie eine Aussteuerungsanzeige (Peakmeter) werden: Bei einem plötzlichen starkem Lautsärkeanstieg zuckt die Anzeige sofort nach oben, um sich danach erst allmählich wieder der allgemeinen Durchschnittslautstärke anzupassen?

Also "Spitzenpegelerkennung"?

Swinging Door Compression unterdrückt Rauschen, verliert aber keine Extremwerte. Dient eigentlich zur Komprimierung von Echtzeit-Prozessdaten.

Wird hier per Video erklärt.

Vielleicht hilft das.

@jurs: Es geht darum, auf einer LED Matrix eine Graphik/Animation in Echtzeit zum Sound in X und Y Richtung zu verschieben. Es soll also möglichst schnell gehen, damit die Verschiebung der Musik nicht hinterherhinkt.

Andererseits sollen kleinere Ausrutscher der Messungen (im Besonderen nach unten) kein unruhiges Geflacker (schnelle Verschiebungen) auslösen.

Die Abfallzeit ist relativ egal, aber die Anstiegszeit muss passen (=minimal sein).

Vielleicht sollte ich eine ADSR Hüllkurve auf Delta x und Delta y legen?!

@michael_x: Klingt interessant und habe ich noch nie gehört. Das sehe ich mir mal im Detail an.

TAUSEND Postings. Prost!

Helmuth

Helmuth:
@jurs: Es geht darum, auf einer LED Matrix eine Graphik/Animation in Echtzeit zum Sound in X und Y Richtung zu verschieben. Es soll also möglichst schnell gehen, damit die Verschiebung der Musik nicht hinterherhinkt.

Ich kann mir immer noch nicht vorstellen, wie das erfolgen soll.

Ist die x-Achse eine Zeitachse, auf der die Animation zeitgesteuert seitlich läuft?

Und die y-Achse ist musikgesteuert, und bei einem plötzlichen Lautstärkepeak soll die Animation auf einen Schlag nach oben versetzt werden, und dann langsam wieder absinken, bis zur Wiederholung beim nächsten Lautstärkepeak?

Ich bekomme Daten von einem MSGEQ7 Spectrum Analyzer IC. In dem Paket stehen 10 Bit Werte von 7 Frequenzbändern drin.

2 dieser Bänder möchte ich nutzen, um ein Bild im Groove zu verschieben.

Z.B. würde ich das 63 Hz Band für x nehmen. Ein horizontaler Shift zur Baseline proportional zur deren Intensität.
Und das 2,5 kHz Band für y. Ein vertikaler Shift synchron zur Hihat.

Die Werte sollen musikgesteuert steigen und fallen. Aber die Präzision ist v.a. beim Anstieg wichtig.

Anstieg und Abfall kann man aus der 1. Ableitung (Steigung) entnehmen. Dazu könntest Du ein "Savitzky-Golay" Filter verwenden, siehe Wikipedia. Im englischen Artikel findest Du fertige Tabellen für die Koeffizienten.

Das Rauschen wir eine bestimmte Größe haben. Wenn ein einzelner Wert der significant größer als das Rauschen bezüglich des Mittelwerts ist dann ist es ein peak.
Grüße Uwe

Danke für die vielen inspirierenden Antworten! Momentaner Zwischenbericht, bzw. was ich bisher verstanden habe oder zumindest glaube, verstanden zu haben:

Savitzky-Golay-Filter: Entweder ich muss in die Zukunft schauen (wie@combie schon zutreffend anmerkte), oder ich handle mir Latenz ein, da zum Glätten eines Messwertes auch zeitlich spätere Messwerte benötigt werden.
Erscheint mir sehr geeignet, um aufgenommene Messwerte nachträglich zu glätten. Für Echtzeitanwendungen kann es nur funktionieren, wenn man mit Latenz leben kann.

Swinging Door Compression: Kommt mir bekannt vor aus der technischen Chartanalyse. Dort heisst das Trendkanal. Im Prinzip das, was auch Uwe vorschlägt. Vorteil: funktioniert allein mit vergangenen Daten, man muss nicht in die Zukunft schauen. Man kann bei einem Sample sofort sagen, ob es im existierenden Trendkanal liegt, oder verworfen werden sollte.

Momentan habe ich mir verrauschte Messwerte in einem Diagramm ausgedruckt, decke einen Teil davon ab und versuche von Hand Punkt für Punkt zu entscheiden, ob er plausibel ist, oder nicht. Ich denke, wenn ich da eine zuverlässige Methode gefunden habe (konkret die sinnvolle Breite des Trendkanals, die rückwirkende Länge und die unterschiedliche Behandlung von Ausbrüchen nach oben und nach unten), bin ich der Problemlösung einen Schritt näher.

Anmerkungen oder Kritik sind ausdrücklich erbeten.

Man kann bei einem Sample sofort sagen, ob es im existierenden Trendkanal liegt, oder verworfen werden sollte.

Ich verstehe das so, dass es nicht verworfen werden sollte, wenn es ausserhalb des Trendkanals liegt, weil es dann ein signifikanter Peak ist.

Ob bei dir der Ansatz mit "der letzte Wert innerhalb des Kanals bildet den neuen Startpunkt" auch relevant ist, verstehe ich nicht genau.

Mir ist auch unklar, wie dieser Algorithmus auf mehr als 1 Dimension ( + Zeit ) zu erweitern ist. Und ob das für dich relevant ist.

Auf mein konkretes Problem bezogen mein theoretischer Ansatz: Das Rauschen ist hochfrequent, also die Ausrutscher sind kurz (und heftig).

Sagen wir, ich schaue mir an, innerhalb welches Trendkanals (Schwankungsbreite) die letzten 10 Samples liegen. Ist die nächste Messung außerhalb, verwerfe ich diesen Punkt und inkrementiere einen "Trash-Sample" Counter.

Ist der nächste Punkt wieder innerhalb, wird der Counter auf 0 gesetzt.

Dann definiere ich einen Schwellwert für diesen Counter - so, dass z.B. nach 2 Messungen nacheinander oberhalb des Kanals die letzte Messung als gültig definiert wird und der Trendkanal angepasst.

Charttechnisch gesprochen: man versucht zu unterscheiden, ob der Trend nur getestet oder gebrochen wurde.

Bei Ausbrüchen nach unten kann man etwas konservativer vorgehen, z.B. den Schwellwert auf 5 Unterschreitungen in Folge setzen.

Man limitiert damit den maximalen Anstieg/Abfall der Datenreihe.

Somit regiert man auf jeden Fall schonmal schneller, als mit einem gleitenden Durchschnitt.

Übersehe ich etwas?

hi,

was sendest Du an die LEDs? den letzten wert (so er nicht verworfen wird) oder die momentane mitte des trendkanals?

gruß stefan

Die Mitte wäre ja wieder nur ein gleitender Durchschnitt.

Ich will den letzten Wert nehmen, den ich (bzw. der zu entwerfende Algorithmus) für gültig befindet.

Gruß,

Helmuth

Die Latenz hängt davon ab, wie schnell die Daten reinkommen. Selbst bei einem Filter 5. Ordnung (aus 5 aufeinanderfolgenden Meßwerten) wärst Du dann nur zwei Messungen hinterher. Ein Blick in die Zukunft wäre nur möglich, wenn Du den Zustand eines Systems aus den zurückliegenden Messungen genügend genau vorhersagen kannst - was bei unsystematischem Rauschen nicht möglich ist. Bei Musik auch höchstens dann, wenn man die Partitur schon kennt.

Mir raucht der Kopf. Den ganzen Tag mit Excel Konzepte probiert und wieder verworfen. Frustriert einen doppelten Whisky getrunken.

Dann den Messaufbau überarbeitet. Wenn mit 5V betrieben, sind die Werte vom Analyzer IC besser, als mit 3.3V. Fein. Aufbau komplett umgebaut. Alles näher zusammen, Kürzestmögliche Kabel, die "Datenleitung" abgeschirmt, den AudioDAC dabeben gestellt, auch da ein ganz kurzes Audiokabel zum Steckbrett. Ergebnisse noch besser.

Schön. Nächster Punkt: mir die Datenübertragung vom MSGEQ7 angesehen und das Timing innerhalb der Messung gestrafft - und die Messung selbst auch verkürzt - ich brauche nur die ersten 2 Bänder. Das geht jetzt in 94µs, danach kann ich abbrechen, weil ich habe, was ich brauche. Ist ca. um den Faktor 3 schneller als vorher. Ohne den ADC vom Teensy anzufassen. Jetzt kann ich mir ein paar mehr Messungen leisten und damit auch die 2 Messungen Zeitversatz für den vorgeschlagenen Filter. Basta für heute.

hi,

verstehe ich das richtig?

Du machst alle 94µS eine messung?

na dann würde ich erst nach 10 messungen eine änderung der led-werte vornehmen. solange braucht der ton von den lautsprechern nämlich in etwa, um Deine ohren zu erreichen, nachdem das licht der LEDs bei Deinen augen angekommen ist.

falls Du da wirklich eine synchronität erreichen willst (die Dein hirn niemals wahrnehmen kann), mußt Du in die andere richtung denken,.

gruß stefan

was mir grade noch dazu einfällt:

falls es (entgegen dem, was ich oben geschrieben habe) wirklich so ist, daß Dein licht hinter dem ton herhinkt: gibt es keine schaltung, die (verlustfrei) die signale der tonleitung - sagen wir mal - eine zehntelsekunde verzögert? dann könntest Du mit dem arduino/teensy bequem nach vorne oder hinten justieren, bis es genau paßt.

...und natürlich "in der zukunft" messen.

noch ein gruß, noch ein stefan