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

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

Hey Eisebaer ..
Keine Grundsatzdiskussionen!
Wenn der Mensch bestenfalls 30 Lichtbilder pro Sec unterscheiden kann, dann ist 100µs keine Basis, über die man nachdenken darf.
Also Bitte!

hi,

:slight_smile: na gut, combie.

ich hab' damit aber in erster linie gemeint, daß er über das ganze konzept nachdenken muß. wenn es eine verzögerung gibt.
woher kommt die?
wenn der ton durch die unterschiedliche geschwindigkeit in der luft um, sagen wir mal, 10 millisekunden länger zu helmuts kopf braucht als das licht der leds, sollte er doch später ankommen, selbst wenn das programm langsam ist.

und die zweite idee mit der verzögerung des tonsignals gefällt mir, weil man ja wirklich "in die zukunft schauen" könnte.

gruß stefan

Moin, ja, die Schallgeschwindigkeit schenkt mir ca. 3ms pro m Lautsprecherabstand.

Die Messung allein ist ja nicht alles. Momentan habe ich lahme WS2812 dran, alle in Serie. Im Leerlauf kann ich die mit ca. 130 fps beschreiben (definiert durch die Anzahl der LEDs).

Ich habe also 7,6 ms pro Frame, wenn ich nichts anderes mache. Alles, was ich mache (z.B. Simplex Noise Berechnung und die Animation überhaupt), gibt es nicht umsonst und schlägt sich sofort in einer geringeren Framerate nieder.

Wenn der Mensch bestenfalls 30 Lichtbilder pro Sec unterscheiden kann

Das hat combie geschickt forumliert. UNTERSCHEIDEN mag schon sein. Aber je mehr es sind, umso weicher und flüssiger wird der Eindruck. Auch, wenn man die Frames (schon lange) nicht mehr unterscheiden kann, sehen mehr davon dennoch deutlich besser aus. Was glaubt ihr, warum bessere Fernseher 100 fps oder gar 200 fps ausgeben und ziemlich aufwändig zig Zwischenbilder berechnen. Schaut Euch im Technikmarkt um die Ecke mal einen schnellen Kameraschwenk mit 50 und mit interpolierten 200 Bildern pro Sekunde an. Danach reden wir weiter über den Sinn von möglichst vielen fps.

Ich habe desweiteren nicht gesagt, dass es eine sichtbare Latenz gibt, ich sagte ich will sie unter allen Umständen vermeiden. Die Sache ist die: selbst im einstelligen ms Bereich FÜHLT man einen Unterschied. Bei diesen LEDs zum Sound Geschichten gibt es immer einen Punkt im Raum (bzw. Abstand zum Lautsprecher), wo es PERFEKT passt. Ich habe das mehrfach mit Freunden getestet - sie sollten sich im (großen) Zimmer dahin stellen, wo sie den Eindruck haben, "dass sie jetzt die Musik sehen". Sie standen alle im selben Abstand.

Wer das bezweifelt, gehe mal irgendwohin, wo 10 geübte Trommler im Kreis spielen. Klingt geil, oder? Jetzt sucht die Position, wo es perfekt klingt, wo der Rhythmus praktisch einrastet. Es ist die Mitte des Kreises, wo ihr den gleichen Abstand zu jeder einzelnen Schallquelle habt. 2m daneben klingt auch gut, aber eben nicht perfekt und das spürt man. Aus diesem Grunde lernen Djembe Spieler als erstes, sich gegenseitig auf die Hände zu schauen, um dieses Delay rauszukriegen.
(Ich habe neulich eine Studie gesehen, wo sie mit Highspeed Kameras eine Jamsession aufgenommen haben. Die Musiker wurden gebeten, (das Gleiche) miteinander zu spielen, bis sie "eins" werden, bis sie nicht mehr die Musik spielen, sondern die Musik sind. Jeder einzelne konnte ganz klar den Moment benennen, ab dem es WIRKLICH gegroovt hat. Die zeitliche Abweichung der einzelnen Spieler zueinander lag in diesem Moment bei UNTER 1 ms! Wie das physiologisch funktioniert, kann bisher nicht befriedigend erklärt werden (die menschlichen Sinnesorgane samplen jedenfalls nicht so schnell), aber jeder Musiker kann den Unterschied zwischen einem guten und einem perfekten Rhythmus fühlen. Die grinsen dann immer, wenn das passiert. Und das Publikum fängt i.d.R. spätestens an diesem Punkt an, zu tanzen)

Zusammenfassung: Je geringer die Latenz zwischen (verschiedenen) Sinneseindrücken umso geiler der Effekt.

Ein Audio Delay (wie z.B. bei Großveranstaltungen verwendet, um Laufzeitunterschiede des Schalls auszugleichen), wäre auch eine Lösung (bzw. ein Workarround), aber vorher möchte ich die vorhandene Hardware ausreizen.

Beste Grüße,

Helmuth

P.S. In diesem Video hier habe ich noch geschummelt und die aktiven Lautsprechen stehen ca. 6 m hinter mir. Man achte auf die Reflexion an der Wand, da sieht man, wie schnell die LEDs wirklich reagieren.

Mit dem damals verwendeten Arduino Mega ging es nicht anders, die Signalverarbeitung hat einfach zu lange gedauert.

Wenn ich das sehe, brauchst du
a) einen gefilterten Wert, für eine "beruhigte" Anzeige
b) einen schnellen Spitzenwertdetector um sofort reagieren zu können.

Mein Vorschlag: mach beides.

für Anzeige einen gleitenden Durchschnitt. Und ein zweites, nicht oder schwach gefiltertes Signal, für die schnelle reaktion.

Ansatz wäre z.B.: Aus dem gleitenden Durchschnitte ein Band definieren, wenn der Spitzenwert über das Band hinausschiesst, die Basis des gleitenden Durchschnitts neu setzen.

Helmuth:
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.

Helmuth:
Die Messung allein ist ja nicht alles. Momentan habe ich lahme WS2812 dran, alle in Serie. Im Leerlauf kann ich die mit ca. 130 fps beschreiben (definiert durch die Anzahl der LEDs).

Ich habe also 7,6 ms pro Frame, wenn ich nichts anderes mache. Alles, was ich mache (z.B. Simplex Noise Berechnung und die Animation überhaupt), gibt es nicht umsonst und schlägt sich sofort in einer geringeren Framerate nieder.

aber

Helmuth:
Z.B. würde ich das 63 Hz Band für x nehmen. Ein horizontaler Shift zur Baseline proportional zur deren Intensität.

Du müsstest zur Analyse ein höher frequentes Band nehmen. Der Analysator brauchst mindestens ein, besser mehrere Schwingungen um ein 63Hz-Signal festzustellen. Du bist vermutlich im Bereich über 100ms, was deine Frequenzanalyse anbegeht. Du hast da also eine ziemlich große Latenz.

Der Analysator brauchst mindestens ein, besser mehrere Schwingungen um ein 63Hz-Signal festzustellen.

Interessanter Punkt. 63 Hz entspricht 15,9 ms pro Schwingung. Eine verdammte Ewigkeit. Ich schaue mir das mal näher an, wieviel Zeit zwischen dem Anlegen eines niederfrequenten Sinussignals und der Detektion desselben vergeht.