Saturday 22 July 2017

Moving Average Filter C Code

Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren kann, indem Sie eine Fenstergröße, die eine Macht von zwei für Bit-Verschiebung statt zu teilen, aber nicht brauchen zu ermöglichen Ein Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die a in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Ich habe einen gleitenden Durchschnitt ohne einzelnen Element-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich beginne mit 1 Probe und dividiere durch 1, um die aktuelle Durchschn. Ich füge dann anothe Probe und dividiere durch 2 zu den aktuellen Durchschn. Das geht so lange weiter, bis ich auf die Länge des Durchschnitts komme. Jedes Mal danach, füge ich in der neuen Probe, erhalten Sie den Durchschnitt und entfernen Sie diesen Durchschnitt aus der Gesamtmenge. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathematik-Kerl, 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, desto langsamer folgt es, was Sie folgen wollen. Das kann nicht die meiste Zeit, aber wenn folgende Satelliten, wenn Sie langsam sind, könnte die Spur weit von der tatsächlichen Position und es wird schlecht aussehen. Sie könnten eine Lücke zwischen dem Sat und den nachfolgenden Punkten haben. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um eine ausreichende Glättung und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Spur Punkte erhalten. Antwort # 2 am: November 16, 2010, um 23:03 Uhr Initialisierung insgesamt 0, count0 (jedes Mal, wenn ein neuer Wert dann eine Eingabe (scanf), ein add totalnewValue, ein Inkrement (count), ein dividieren Durchschnitt (totalcount) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, benötigen Sie 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einem älteren inputvariable und berechnen dann den neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (Rechtsverschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung zu beantworten Februar 3 15 bei 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und nicht den gleitenden Durchschnitt. Wie Zähler wird größer wird der Einfluss eines neuen Eingangsbeispiel verschwindend kleiner ndash Hilmar Feb Um eine Antwort zu finden, die Sie interessiert. Die Artikel ist ein praktischer Leitfaden für durchschnittliche Filter oder durchschnittliche Filter Verständnis und Implementierung. Artikel enthält Theorie, C-Quellcode, Programmieranleitung und Beispielanwendung. 1. Einführung in Mittelfilter, oder Mittelfilter Mittelwertfilter. Oder Durchschnittsfilter ist ein Fensterfilter der linearen Klasse, der das Signal glättet (Bild). Der Filter arbeitet als Tiefpaß. Die Grundidee hinter dem Filter ist für jedes Element des Signals (Bild) nehmen einen Durchschnitt über seine Nachbarschaft. Um zu verstehen, wie das in der Praxis gemacht wird, beginnen wir mit der Fensteridee. 2. Filter Fenster oder Maske Lassen Sie uns vorstellen, sollten Sie einen Brief lesen und was Sie sehen im Text durch Loch in spezielle Schablone wie diese eingeschränkt. Also, das Ergebnis des Lesens ist Sound t. Ok, lassen Sie uns den Brief wieder lesen, aber mit Hilfe einer anderen Schablone: ​​Jetzt ist das Ergebnis des Lesens t ist Sound 240. Lassen Sie uns den dritten Versuch machen: Jetzt lesen Sie Buchstaben t als Ton 952. Was passiert hier Zu sagen, dass In der mathematischen Sprache, machen Sie eine Operation (Lesen) über Element (Buchstabe t). Und das Ergebnis (Ton) hängt von der Elementnachbarschaft (Buchstaben neben t) ab. Und diese Schablone, die hilft, Elementnachbarschaft aufzuheben, ist Fenster Ja ist Fenster nur eine Schablone oder ein Muster, durch das Sie das Elementnachbarschaft 0151 einen Satz von Elementen um das gegebene 0151 vorwählen, um Ihnen zu helfen, Entscheidung zu treffen. Ein anderer Name für Filter-Fenster ist Maske 0151 Maske ist eine Schablone, die Elemente, die wir nicht darauf achten, versteckt. In unserem Beispiel ist das Element, das wir auf der linken Seite des Fensters betätigen, in der Praxis jedoch seine übliche Position die Mitte des Fensters. Lassen Sie uns einige Fenster Beispiele sehen. In einer Dimension. Feige. 4. Fenster oder Maske der Größe 5 in 1D. In zwei Dimensionen. Feige. 5. Fenster oder Maske der Größe 3times3 in 2D. In drei Dimensionen. Denken Sie über Gebäude. Und jetzt mdash über Raum in diesem Gebäude. Der Raum ist wie 3D-Fenster, das ausschneidet einige Unterraum aus dem gesamten Raum des Gebäudes. Sie finden 3D-Fenster in Volumen (Voxel) Bildverarbeitung. 3. Verständnis der mittleren Filter Nun wollen wir sehen, wie man einen Durchschnitt über Elemente neighborhoodrdquo. Die Formel ist einfach 0151 Summe Elemente und dividieren die Summe durch die Anzahl der Elemente. Wir wollen z. B. einen Durchschnitt für den Fall berechnen, der in Abb. Fig. 7 Feige. 7. Durchschnittlich. Und das ist alles. Ja, wir haben nur 1D-Signal durch Mittelfilter gefiltert Lassen Sie uns fortsetzen und schreiben Sie Schritt für Schritt Anleitungen für die Verarbeitung durch Mittelfilter. Mittleren Filter oder durchschnittlichen Filter-Algorithmus: Platzieren Sie ein Fenster über Element Nehmen Sie eine durchschnittliche 0151 Summe Elemente und dividieren Sie die Summe durch die Anzahl der Elemente. Nun, wenn wir den Algorithmus haben, ist es an der Zeit, einige Code mdash schreiben lassen uns auf die Programmierung kommen. 4. 1D-Mittelfilter-Programmierung In diesem Abschnitt entwickeln wir 1D-Mittelfilter mit Fenster der Größe 5. Wir haben 1D-Signal der Länge N als Eingang. Der erste Schritt ist die Platzierung der Fenster 0151 wir tun, dass durch Änderung der Index der führenden Element: Achten Sie darauf, dass wir mit dem dritten Element beginnen und Finishing mit den letzten zwei. Das Problem ist, dass wir nicht mit dem ersten Element beginnen können, da in diesem Fall der linke Teil des Filterfensters leer ist. Wir werden unten diskutieren, wie dieses Problem zu lösen. Der zweite Schritt ist die durchschnittliche, ok: Nun, schreiben Sie uns den Algorithmus als Funktion: Typ-Element könnte definiert werden als: 5. Behandlung von Kanten Für alle Fenster-Filter gibt es ein Problem. Das ist Kante behandeln. Wenn Sie Fenster über das erste (letzte) Element platzieren, ist der linke (rechte) Teil des Fensters leer. Um die Lücke zu schließen, sollte das Signal verlängert werden. Für Mittelfilter ist es sinnvoll, Signal - oder Bildsymmetrie so zu verlängern: So, bevor das Signal an unsere mittlere Filterfunktion weitergegeben wird, sollte das Signal verlängert werden. Lassen Sie uns aufschreiben die Hülle, die alle Vorbereitungen macht. Wie Sie sehen können, berücksichtigt unser Code einige praktische Fragen. Zuerst prüfen wir unsere Eingangsparameter 0151 Signal sollte nicht NULL sein und Signallänge sollte positiv sein: Zweiter Schritt 0151 prüfen wir Fall N1. Dieser Fall ist ein spezieller Fall, denn um eine Erweiterung zu bauen, brauchen wir mindestens zwei Elemente. Für das Signal von 1 Elementlänge ergibt sich das Signal selbst. Wie auch darauf achten, unsere mittlere Filter arbeitet an Ort und Stelle, wenn Ausgangsparameter Ergebnis NULL ist. Lassen Sie uns jetzt Speicher für Signalverlängerung zuteilen. Überprüfen Sie die Speicherzuweisung.


No comments:

Post a Comment