Go Down

Topic: An Statistiker/Mathematiker/Programmierer: Daten selektiv "weichzeichnen" (Read 1 time) previous topic - next topic

Helmuth

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


combie

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Helmuth

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

combie

Du brauchst keinen Statistiker/Mathematiker/Programmierer, sondern einen Wahrsager/Magier/Telepaten!
;-)
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

jurs

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"?

michael_x

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.

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.

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

jurs

@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?

Helmuth

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.

DrDiettrich

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.

uwefed

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

Helmuth

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.

michael_x

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

Helmuth

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?








Eisebaer

hi,

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

gruß stefan

Go Up