Monday 25 September 2017

Moving Average Filter Cpp


Mittlerer Filter oder mittlerer Filter. Kategorie Digitale Signal - und Bildverarbeitung DSP - und DIP-Software-Entwicklung. Abstrakt Der Artikel ist ein praktischer Leitfaden für Mittelfilter oder durchschnittliches Filterverständnis und - implementierung Artikel enthält Theorie, C-Quellcode, Programmieranleitung und Beispielanwendung. 1 Einleitung zum Mittelfilter oder Mittelwertfilter. Meanfilter oder mittlerer Filter ist Fensterfilter der Linearklasse, der das Signalbild glättet. Der Filter arbeitet als Tiefpass. Die Grundidee hinter dem Filter ist für jedes Element des Signalbildes im Durchschnitt Über seine Nachbarschaft Um zu verstehen, wie das in der Praxis gemacht wird, lasst uns mit der Fensteridee beginnen.2 Filterfenster oder Maske. Lass uns vorstellen, du solltest einen Brief lesen und was du im Text sehe, der durch Loch in einer speziellen Schablone wie dieses eingeschränkt ist 1 Erstes Schablone. So, das Ergebnis des Lesens ist Ton t Ok, lasst uns den Brief wieder lesen, aber mit der Hilfe einer anderen Schablone. Fig 2 Zweite Schablone. Jetzt das Ergebnis des Lesens t ist Sound Lassen Sie uns den dritten Versuch machen. Abb. 3 Dritter Schablone. Jetzt liest du den Buchstaben t als Klang. Was passiert hier, um in der mathematischen Sprache zu sagen, machst du eine Operation, die über das Elementbuchstabe t liest. Und das Ergebnisgeräusch hängt von den Elementnachbarschaftsbriefen neben t ab Schablone, die hilft, Element Nachbarschaft zu holen, ist Fenster Ja, Fenster ist nur eine Schablone oder ein Muster, mit dem du die Elementumgebung auswählst, ein Satz von Elementen um die gegebene, um dir zu helfen, eine Entscheidung zu treffen Ein anderer Name für Filterfenster Ist Maske 3 in 2D. In drei Dimensionen Denken über Gebäude Und jetzt über Raum in diesem Gebäude Das Zimmer ist wie 3D-Fenster, das schneidet einige Unterraum aus dem gesamten Raum des Gebäudes finden Sie 3D-Fenster in Volumen Voxel Bildverarbeitung. Fig 6 Fenster oder Maske der Größe 3 3 3 in 3D.3 Verständnis der mittleren Filter. Jetzt lassen Sie uns sehen, wie man einen Durchschnitt über Element s Nachbarschaft Die Formel ist einfach Summe Elemente und teilen die Summe durch die Anzahl der Elemente Zum Beispiel, Lassen Sie uns einen Durchschnitt für den Fall berechnen, der in Abb. 7 dargestellt ist. 7. Rennen Sie einen Durchschnitt. Und das ist alles Ja, wir haben nur 1D-Signal durch Mittelfilter gefiltert. Lassen Sie uns den Lebenslauf machen und schrittweise Anweisungen für die Verarbeitung aufschreiben Durch Mittelfilter. Mean-Filter oder durchschnittliche Filter-Algorithmus. Stellen Sie ein Fenster über Element. Take eine durchschnittliche Summe Elemente und teilen Sie die Summe durch die Anzahl der Elemente. Jetzt, wenn wir den Algorithmus haben, ist es Zeit, einige Code zu schreiben Wir kommen auf Programmierung.4 1D bedeuten Filterprogrammierung. In diesem Abschnitt entwickeln wir 1D Mittelfilter mit Fenster der Größe 5 Lassen Sie uns 1D Signal der Länge N als Eingang haben Der erste Schritt ist Fenster Platzierung wir tun, dass durch Änderung der Index der führenden Element. Pay Aufmerksamkeit, dass wir mit dem dritten Element beginnen und mit den letzten, aber zwei Das Problem ist, können wir nicht mit dem ersten Element beginnen, denn in diesem Fall ist der linke Teil des Filterfensters leer. Wir werden unten diskutieren, wie Um dieses Problem zu lösen. Der zweite Schritt ist, den Durchschnitt zu nehmen, ok. Jetzt, lassen Sie uns notieren Sie den Algorithmus als Funktion. Type Element könnte definiert werden als.5 Behandeln von Kanten. Für alle Fenster-Filter gibt es ein Problem Das ist Kantenbearbeitung Wenn Sie platzieren Fenster über das erste letzte Element, der linke rechte Teil des Fensters ist leer Um die Lücke zu füllen, sollte das Signal verlängert werden Für den mittleren Filter gibt es gute Idee, Signal oder Bild symmetrisch zu erweitern, wie dies. So, bevor das Signal an Unsere mittlere Filterfunktion das Signal sollte verlängert werden Lassen Sie uns notieren Sie den Wrapper, der alle Vorbereitungen macht. Wie Sie sehen können, berücksichtigt unser Code einige praktische Fragen Zuerst prüfen wir unsere Eingangsparameter Signal sollte nicht NULL sein und signalisieren Länge sollte positiv sein. Zweiter Schritt wir überprüfen Fall N 1 Dieser Fall ist ein besonderer, weil zum Aufbau Erweiterung benötigen wir mindestens zwei Elemente Für das Signal von 1 Element Länge das Ergebnis ist das Signal selbst Wie auch Aufmerksamkeit, unsere mittlere Filter funktioniert In-place, wenn Ausgabeparameter Ergebnis NULL ist. Jetzt lassen Sie uns Speicher für Signalverlängerung zuzuordnen und überprüfen Speicherzuweisung. I m codieren etwas in dem Moment, wo ich bin eine Reihe von Werten im Laufe der Zeit von einem Hardware-Kompass Dieser Kompass ist sehr Genaue und Updates sehr oft, mit dem Ergebnis, dass, wenn es leicht wackelt, ich am Ende mit dem seltsamen Wert, dass s wild unvereinbar mit seinen Nachbarn Ich möchte diese Werte zu glätten. Haben einige Lesung herum, würde es scheint, dass was ich will Ist ein Hochpass-Filter, ein Tiefpass-Filter oder ein gleitender Durchschnitt Moving-Durchschnitt kann ich mit unten, nur halten Sie eine Geschichte der letzten 5 Werte oder was auch immer, und verwenden Sie den Durchschnitt dieser Werte stromabwärts in meinem Code, wo ich war Einmal nur mit dem jüngsten Wert. That sollte ich denke, glätten diese Jiggles schön, aber es schlägt mich, dass es wahrscheinlich ziemlich ineffizient ist, und das ist wahrscheinlich eines dieser Bekannten Probleme zu ordnungsgemäßen Programmierern, zu denen es sa wirklich ordentlich clever ist Mathe-Lösung. Ich bin jedoch einer jener schrecklichen Selbst-gelehrten Programmierer ohne einen Fetzen der formalen Ausbildung in irgendetwas sogar vage verwandt mit CompSci oder Mathe Reading um ein bisschen schlägt vor, dass dies ein Hoch - oder Tiefpassfilter sein kann, aber ich kann Ich finde alles, was erklärt, was für einen Hack wie mich verständlich ist, was die Wirkung dieser Algorithmen auf eine Reihe von Werten sein würde, geschweige denn, wie die Mathematik arbeitet. Die hier gegebene Antwort z. B. technisch beantwortet meine Frage, aber nur in Worten Verständlich für diejenigen, die wahrscheinlich schon wissen, wie man das Problem lösen kann. Es wäre eine sehr schöne und kluge Person in der Tat, die die Art von Problem erklären könnte dies ist, und wie die Lösungen funktionieren, im Sinne verständlich für ein Arts graduate. asked Sep 21 10 bei 13 01.Wenn Ihr gleitender Durchschnitt lang sein muss, um die erforderliche Glättung zu erreichen, und Sie don t wirklich brauchen eine bestimmte Form des Kernels, dann sind Sie besser dran, wenn Sie einen exponentiell verfallenden gleitenden Durchschnitt verwenden Wähle winzig, um eine passende Konstante zu sein, z. B. wenn du winzige 1- 1 N wählst, wird es die gleiche Menge an Mittelwert wie ein Fenster der Größe N haben, aber anders verteilt über ältere Punkte. Da der nächste Wert des gleitenden Durchschnitts hängt davon ab Nur auf dem vorherigen und deinen daten, du musst keine warteschlange oder irgendetwas halten Und du kannst davon nachdenken, um so etwas zu tun. Nun, ich habe einen neuen Punkt, aber ich glaube es wirklich nicht, also bin ich m Geh zu 80 meiner alten Schätzung der Messung zu halten, und vertraue nur diesem neuen Datenpunkt 20 Das ist so ziemlich das gleiche wie zu sagen, Nun, ich vertraue nur diesem neuen Punkt 20, und ich benutze 4 weitere Punkte, denen ich vertraue Gleiche Menge, außer dass anstatt explizit die 4 anderen Punkte zu nehmen, nehmen Sie an, dass die Mittelung, die Sie das letzte Mal war vernünftig war, so dass Sie Ihre vorherige Arbeit verwenden können. answered Sep 21 10 bei 14 27.Hey, ich weiß, das ist 5 Jahre Spät, aber danke für eine tolle Antwort, ich arbeite an einem Spiel, bei dem sich der Klang auf der Grundlage deiner Geschwindigkeit ändert, aber wegen des Spiels auf einem langsam-ass-Computer würde die Geschwindigkeit wild schwanken, was für das Lenken gut war, aber super Ärgerlich in Bezug auf Ton Dies war eine wirklich einfache und billige Lösung für etwas, was ich dachte, wäre ein wirklich komplexes Problem Adam Mar 16 15 bei 20 20.Wenn Sie versuchen, den gelegentlichen ungeraden Wert zu entfernen, ist ein Tiefpassfilter der beste Der drei Optionen, die Sie identifiziert haben Tiefpass-Filter erlauben Low-Speed-Änderungen wie die, die durch das Drehen eines Kompasses von Hand verursacht werden, während Ablehnung von High-Speed-Änderungen wie die, die durch Stöße auf der Straße verursacht werden, zum Beispiel. A Gleitender Durchschnitt wird wahrscheinlich nicht ausreichen, da die Effekte eines einzelnen Blips in Ihren Daten mehrere nachfolgende Werte beeinflussen werden, abhängig von der Größe Ihres gleitenden durchschnittlichen Fensters. Wenn die ungeraden Werte leicht erkannt werden, können Sie sogar besser mit einem Glitch-Entferner-Algorithmus, der sie völlig ignoriert. Hier ist ein Guick-Diagramm zu illustrieren. Der erste Graph ist das Eingangssignal, mit einem unangenehmen Glitch Die zweite Grafik zeigt die Wirkung eines 10-Probe gleitenden Durchschnitt Die endgültige Grafik ist eine Kombination aus der 10-Sample-Durchschnitt und der oben gezeigte einfache Glitch-Detection-Algorithmus Wenn der Glitch erkannt wird, wird der 10-Sample-Durchschnitt anstelle des tatsächlichen Wertes verwendet. Angesichts des Sep 21 10 bei 13 38. Nicely erklärt und Bonuspunkte für die Grafik Henry Cooke Sep 22 10 at 0 50.Wow Selten sah so eine nette Antwort Muis Jun 4 13 bei 9 14. Der gleitende Durchschnitt ist ein Tiefpassfilter nomen Oct 21 13 bei 19 36.Try ein laufendes Streaming Median statt Kert Apr 25 14 bei 22 09.Moving Durchschnitt kann ich mit, aber es schlägt mich, dass es wahrscheinlich ziemlich ineffizient. There s wirklich kein Grund ein gleitender Durchschnitt sollte ineffizient Sie halten die Anzahl der Datenpunkte, die Sie wollen in einigen Puffer wie eine kreisförmige Warteschlange Auf jedem neuen Datenpunkt, du kommst den ältesten Wert und subtrahier ihn von einer Summe und schiebe den neuesten und führe ihn der Summe hinzu. Jeder neue Datenpunkt bringt also nur einen Pop-Push, eine Addition und eine Subtraktion mit. Ihr gleitender Durchschnitt ist immer diese Verschiebungssumme Geteilt durch die Anzahl der Werte in deinem Puffer. Es wird ein wenig schwieriger, wenn du gleichzeitig Daten von mehreren Threads empfängst, aber da deine Daten von einem Hardwaregerät kommen, das mir höchst zweifelhaft erscheint. Oh und auch schreckliche Selbstlernprogramme Vereinen. Der gleitende Durchschnitt schien mir ineffizient zu sein, weil man einen Puffer von Werten speichern muss - besser, nur einige Clever Maths mit deinem Eingabewert und dem aktuellen Arbeitswert zu machen. Ich denke, das s wie exponentiell gleitender Durchschnitt funktioniert Eine Optimierung, die ich hier gesehen habe Art von gleitenden Durchschnitt beinhaltet die Verwendung einer festen Länge Warteschlange ein Zeiger auf, wo Sie sind in dieser Warteschlange, und nur wickeln Sie den Zeiger herum mit oder ein wenn Voila Keine teuren Push-Pop Power an die Amateure, Bruder Henry Cooke Sep 22 10 bei 0 54 Henry Für einen geradlinigen gleitenden Durchschnitt brauchst du den Puffer einfach so, dass du weißt, welcher Wert geknallt wird, wenn der nächste Wert gedrückt wird. Das heißt, die feste Länge in der Warteschlange ein Zeiger, den du beschreibst, ist genau das, was ich mit einer kreisförmigen Warteschlange bedeutete Das ist der Grund, warum ich sagte, es ist nicht ineffizient Was haben Sie gedacht, ich meinte Und wenn Ihre Antwort ist ein Array, das verschiebt seine Werte zurück auf jede indizierte Entfernung wie Std-Vektor in C gut, dann bin ich so verletzt ich nicht einmal wollen Um mit dir zu reden Dan Tao Sep 22 10 bei 1 58. Henry Ich weiß nicht über AS3, aber ein Java-Programmierer s hat Sammlungen wie CircularQueue zu seiner Verfügung Ich bin kein Java-Entwickler, also bin ich sicher, dass es bessere Beispiele gibt Da ist genau das, was ich von einer schnellen Google-Suche gefunden habe, die genau die Funktionalität implementiert, von der wir reden, ich bin ziemlich zuversichtlich, dass die Mehrheit der Mittel - und Tiefsprachen mit Standardbibliotheken etwas Ähnliches hat, zB in der Warteschlange T Anyway, Ich war Philosophie selbst, so ist alles vergeben Dan Tao Sep 22 10 bei 12 44. Ein exponentiell verfallender gleitender Durchschnitt kann von Hand mit nur dem Trend berechnet werden, wenn man die richtigen Werte verwendet. Sehen Sie sich eine Idee, wie Sie das schnell mit einem machen können Stift und Papier, wenn Sie auf der Suche nach exponentiell geglätteten gleitenden Durchschnitt mit 10 Glättung Aber da Sie einen Computer haben, möchten Sie wahrscheinlich wollen binäre Verschiebung im Gegensatz zu dezimalen Verschiebung. Dieser Weg, alles, was Sie brauchen, ist eine Variable für Ihren aktuellen Wert und Einer für den Durchschnitt Der nächste Durchschnitt kann dann berechnet werden, indem er am 21. September 10 an 14 39.dieser Technik genannt wird, der ein Range-Tor genannt wird, das gut mit schwach auftretenden Störproben arbeitet, wobei die Verwendung einer der oben beschriebenen Filtertechniken angenommen wird Durchschnittlich, exponentiell, sobald man genügend Geschichte hat eine Zeit Konstante können Sie die neue, eingehende Daten Probe für Angemessenheit testen, bevor es der Berechnung hinzugefügt wird. Some Kenntnis der maximal vernünftigen Rate-of-Change des Signals ist erforderlich, die roh Probe wird mit dem letzten geglätteten Wert verglichen, und wenn der Absolutwert dieser Differenz größer als der zulässige Bereich ist, wird dieser Stichprobe ausgelöst oder durch irgendeine Heuristik ersetzt, z. B. eine Vorhersage auf der Grundlage der Steigungsdifferenz oder der Trendvorhersagewert von Doppel Exponentielle Glättung. answered Apr 30 16 at 6 56.Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Samples zu implementieren. Ich habe festgestellt, dass ich ein bisschen optimieren kann, indem Sie eine Fenstergröße, die eine Macht von zwei Um Bit-Shifting statt zu teilen, aber nicht brauchen einen Puffer wäre schön Gibt es eine Möglichkeit, ein neues gleitendes durchschnittliches Ergebnis nur als eine Funktion des alten Ergebnisses und der neuen Probe auszudrücken. Erstellen Sie ein Beispiel gleitenden Durchschnitt, über ein Fenster von 4 Samples zu. Add neue Probe eA gleitenden Durchschnitt kann rekursiv implementiert werden, aber für eine genaue Berechnung der gleitenden Durchschnitt müssen Sie sich erinnern, die älteste Eingabe Probe in der Summe dh die a in Ihrem Beispiel Für eine Länge N gleitenden Durchschnitt Sie rechnen. wo yn ist das Ausgangssignal und xn ist das Eingangssignal Eq 1 kann rekursiv geschrieben werden. So müssen Sie sich immer an die Probe x nN erinnern, um zu berechnen 2.As von Conrad Turner, können Sie eine Unendlich lange exponentielle Fenster stattdessen, die Ihnen erlaubt, die Ausgabe nur aus dem vergangenen Ausgang und die aktuelle input. But dies ist nicht ein Standard ungewichtet gleitenden Durchschnitt, sondern ein exponentiell gewichteter gleitender Durchschnitt, wo Proben weiter in der Vergangenheit ein kleineres Gewicht, Aber zumindest in der Theorie vergisst man nichts, was die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit. Ich habe einen gleitenden Durchschnitt ohne Einzelposten-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich beginne mit 1 Probe und teilen durch 1 zu Bekomme die aktuelle avg. I dann füge anothe Probe und teilen durch 2 auf die aktuelle avg. Dies geht weiter, bis ich auf die Länge des average. Each Zeit danach, füge ich in die neue Probe, den Durchschnitt und entfernen Sie diesen Durchschnitt Von der total. Ich bin kein Mathematiker, aber das schien wie ein guter Weg, es zu tun Ich dachte, es würde den Magen eines echten Mathe-Kerl drehen, aber es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun Und es funktioniert gut Denken Sie daran, dass je höher Ihre Länge Je langsamer es folgt, was Sie folgen wollen Das mag nicht die meiste Zeit sein, aber wenn Sie Satelliten folgen, wenn Sie langsam sind, könnte die Strecke weit von der tatsächlichen Position sein und es wird schlecht schauen Sie Könnte eine Lücke zwischen dem Sat und den hinteren Punkten haben Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um ausreichende Glättung zu bekommen und nicht zu weit von der tatsächlichen Sat-Position mit dem geglätteten Pfad dots. answered 16. November 16 um 23 03 zu bekommen. Initialisieren Gesamt 0, Zählung 0 jedes Mal, wenn ein neuer Wert zu sehen. Es wird eine Eingabe scanf, eine addieren total newValue, eine Inkrementzählung, eine dividierende durchschnittliche Gesamtzählung. Dies wäre ein gleitender Durchschnitt über alle inputs. To berechnen den Durchschnitt über nur die Die letzten 4 Eingaben würden 4 Eingangsvariablen erfordern, vielleicht jede Eingabe in eine ältere Eingabevariable kopieren und dann den neuen gleitenden Durchschnitt als Summe der 4 Eingangsvariablen berechnen, geteilt durch 4 rechte Verschiebung 2 wäre gut, wenn alle Eingänge positiv waren, um den Durchschnitt zu machen Calc. answered Feb 3 15 at 4 06.That wird tatsächlich berechnen den Gesamtdurchschnitt und NICHT der gleitende Durchschnitt Als Zählimpuls wird größer die Auswirkungen einer neuen Eingabe Probe wird verschwindend klein Hilmar 3. Februar 15 um 13 53. Ihre Antwort.2017 Stack Exchange Inc.

No comments:

Post a Comment