Sunday 5 November 2017

Rekursiv Algorithmus Gleit Durchschnitt Filter


Die Wissenschaftler und Ingenieure Leitfaden zur digitalen Signalverarbeitung Von Steven W. Smith, Ph. D. Ein enormer Vorteil des gleitenden Durchschnittsfilters ist, dass er mit einem sehr schnell umgesetzten Algorithmus implementiert werden kann. Um diesen Algorithmus zu verstehen, stellen Sie sich vor, ein Eingangssignal x durch einen siebenpunkt gleitenden Durchschnittsfilter zu führen, um ein Ausgangssignal y zu bilden. Schauen wir nun an, wie zwei benachbarte Ausgangspunkte y 50 und y 51 berechnet werden: Diese sind für y 50 und für y 51 genau die gleichen Berechnungspunkte x 48 bis x 53 addiert. Ist y 50 bereits berechnet worden Ist der effizienteste Weg zur Berechnung von y 51: Sobald y 51 mit y 50 gefunden worden ist, dann kann y 52 aus der Probe y 51 berechnet werden, und so weiter. Nachdem der erste Punkt in y berechnet wurde, können alle anderen Punkte mit nur einer Addition und Subtraktion pro Punkt gefunden werden. Dies kann in der Gleichung ausgedrückt werden: Beachten Sie, dass diese Gleichung zwei Datenquellen verwendet, um jeden Punkt in der Ausgabe zu berechnen: Punkte von den eingegebenen und vorher berechneten Punkten aus dem Ausgang. Dies wird als rekursive Gleichung bezeichnet, was bedeutet, dass das Ergebnis einer Berechnung in zukünftigen Berechnungen verwendet wird. (Der Begriff rekursiv hat auch andere Bedeutungen, vor allem in der Informatik). Kapitel 19 diskutiert eine Vielzahl von rekursiven Filtern im Detail. Seien Sie sich bewusst, dass der gleitende durchschnittliche rekursive Filter sehr unterschiedlich ist von typischen rekursiven Filtern. Insbesondere haben die meisten rekursiven Filter eine unendlich lange Impulsantwort (IIR), die aus Sinusoiden und Exponentialen besteht. Die Impulsantwort des gleitenden Durchschnitts ist ein Rechteckimpuls (endliche Impulsantwort oder FIR). Dieser Algorithmus ist aus mehreren Gründen schneller als andere digitale Filter. Zuerst gibt es nur zwei Berechnungen pro Punkt, unabhängig von der Länge des Filterkerns. Zweitens sind Addition und Subtraktion die einzigen mathematischen Operationen erforderlich, während die meisten digitalen Filter eine zeitaufwändige Multiplikation benötigen. Drittens ist das Indexierungsschema sehr einfach. Jeder Index in Gl. 15-3 wird durch Addition oder Subtraktion von ganzzahligen Konstanten gefunden, die berechnet werden können, bevor die Filterung beginnt (d. h. p und q). Weiterhin kann der gesamte Algorithmus mit ganzzahliger Darstellung durchgeführt werden. Abhängig von der verwendeten Hardware können ganze Zahlen mehr als eine Größenordnung schneller als Gleitkomma sein. Überraschenderweise arbeitet die Integer-Darstellung besser als der Gleitpunkt mit diesem Algorithmus, zusätzlich zu schneller. Der Rundungsfehler von Gleitkomma-Arithmetik kann zu unerwarteten Ergebnissen führen, wenn man nicht vorsichtig ist. Stellen Sie sich zum Beispiel ein 10.000-Sample-Signal vor, das mit dieser Methode gefiltert wird. Die letzte Probe im gefilterten Signal enthält den akkumulierten Fehler von 10.000 Additionen und 10.000 Subtraktionen. Dies erscheint im Ausgangssignal als Driftversatz. Integers haben dieses Problem nicht, weil es keinen Rundungsfehler in der Arithmetik gibt. Wenn Sie mit diesem Algorithmus Gleitpunkt verwenden müssen, zeigt das Programm in Tabelle 15-2, wie man einen doppelten Präzisionsakkumulator benutzt, um diesen Drift zu eliminieren. In den Statistiken ist ein einfacher gleitender Durchschnitt ein Algorithmus, der den ungewichteten Mittelwert der letzten n Samples berechnet. Der Parameter n wird oft als Fenstergröße bezeichnet, da der Algorithmus als ein Fenster betrachtet werden kann, das über die Datenpunkte gleitet. Durch die Verwendung einer rekursiven Formulierung des Algorithmus wird die Anzahl der pro Probe benötigten Operationen auf eine Addition, eine Subtraktion und eine Division reduziert. Da die Formulierung unabhängig von der Fenstergröße n ist. Die Laufzeitkomplexität ist O (1). D. h. konstant. Die rekursive Formel des ungewichteten gleitenden Durchschnitts ist, wo avg der rollende Durchschnitt ist und x einen Datenpunkt darstellt. Also, wenn das Fenster nach rechts schiebt, fällt ein Datenpunkt, der Schwanz, und ein Datenpunkt, der Kopf, bewegt sich ein. Implementierung Eine Implementierung des einfachen gleitenden Durchschnitts muss die folgenden berücksichtigen: Algorithmeninitialisierung Solange Das Fenster ist nicht vollständig mit Werten belegt, die rekursive Formel scheitert. Speicher Der Zugriff auf das Schwanz-Element ist erforderlich, was je nach Ausführung eine Speicherung von n Elementen erfordert. Meine Implementierung verwendet die vorgestellte Formel, wenn das Fenster vollständig mit Werten belegt ist und wechselt ansonsten auf die Formel, die den Mittelwert durch Neuberechnung der Summe der vorherigen Elemente aktualisiert. Beachten Sie, dass dies aufgrund der Gleitkomma-Arithmetik zu numerischen Instabilitäten führen kann. Soweit Speicherverbrauch betroffen ist, verwendet die Implementierung Iteratoren, um Kopf - und Schwanzelemente zu verfolgen. Dies führt zu einer Implementierung mit konstantem Speicherbedarf unabhängig von der Fenstergröße. Hier ist das Update-Verfahren, das das Fenster nach rechts schiebt. In den meisten Sammlungen werden ihre Enumeratoren ungültig, wenn die zugrunde liegende Sammlung geändert wird. Die Implementierung beruht jedoch auf gültigen Enumeratoren. Vor allem in Streaming-basierten Anwendungen muss die zugrunde liegende Sammlung modifiziert werden, wenn ein neues Element eintrifft. Ein Weg, um damit umzugehen ist eine einfache kreisförmige feste Größe Sammlung der Größe n1, die nie ungültig macht seine Iteratoren und abwechselnd fügen Sie ein Element und rufen Shift. Ich wünschte, ich könnte herausfinden, wie man das tatsächlich umsetzen kann, da die Test-Funktion sehr verwirrend für mich ist8230 Muss ich Daten in Array umwandeln, dann laufe SMA sma neue SMA (20, Array) für eine 20-Periode SMA Wie gehe ich damit um Shift () - Funktion Ist es notwendig, Konstruktoren zu implementieren. (Entschuldigen Sie das Durcheinander). Nein, du musst deine Daten nicht in ein Array konvertieren, solange deine Daten IEnumerable1 implementieren und der aufgelistete Typ doppelt ist. Soweit Ihr privates Messaging betroffen ist, müssen Sie das DataRow auf etwas umwandeln, das auf doppelte Werte zählt. Ihr Ansatz funktioniert. Shift, schiebt das Fenster eine Position nach links. Für einen Datensatz von etwa 40 Werten und einer 20 Periode SMA haben Sie 21 Positionen das Fenster passt in (40 8211 20 1). Bei jedem Aufruf von Shift () wird das Fenster um eine Position nach links verschoben und Average () gibt die SMA für die aktuelle Fensterposition zurück. Das ist der ungewichtete Durchschnitt aller Werte im Fenster. Zusätzlich erlaubt meine Implementierung, die SMA zu berechnen, auch wenn das Fenster am Anfang nicht vollständig gefüllt ist. Also im Grunde hoffe das hilft. Weitere Fragen COPYRIGHT NOTICE Christoph Heindl und cheind. wordpress, 2009-2012. Unerlaubte Verwendung und Vervielfältigung dieses Materials ohne ausdrückliche und schriftliche Erlaubnis von diesem Blogs Autor und Besitzer ist streng verboten. Auszüge und Links können verwendet werden, vorausgesetzt, dass ein vollständiger und klarer Kredit an Christoph Heindl und cheind. wordpress mit entsprechender und spezifischer Richtung zum ursprünglichen Inhalt gegeben wird. Aktuelle BeiträgeEin gleitender Durchschnittsfilter im Durchschnitt eine Anzahl von Eingabeproben und erzeugt ein einziges Ausgangsmuster. Diese Mittelungsaktion entfernt die im Signal vorhandenen Hochfrequenzkomponenten. Bewegliche durchschnittliche Filter werden normalerweise als Tiefpassfilter verwendet. Im rekursiven Filteralgorithmus werden auch frühere Ausgangsmuster zur Mittelung genommen. Ein gleitender Durchschnittsfilter mittelt eine Anzahl von Eingangsabtastwerten und erzeugt eine einzelne Ausgangsabtastung. Diese Mittelungsaktion entfernt die im Signal vorhandenen Hochfrequenzkomponenten. Bewegliche durchschnittliche Filter werden normalerweise als Tiefpassfilter verwendet. Im rekursiven Filteralgorithmus werden auch frühere Ausgangsmuster zur Mittelung genommen. Dies ist der Grund, warum seine Impulsantwort bis zur Unendlichkeit reicht. So verwenden Sie das Beispielprogramm Die ZIP-Datei enthält sowohl Quellcode als auch ausführbare Datei. Um den Quellcode zu kompilieren und auszuführen, müssen Sie Visual Basic 6.0 in Ihrem Computer installieren. Um die ausführbare Datei auszuführen, müssen Sie Visual Basic 6.0-Laufzeitdateien herunterladen und installieren. Führen Sie movavgfilt. exe aus und Sie sehen das Hauptfenster. Im Hauptfenster. Der obere Teil ist der Funktionsgenerator. Die verschiedene Wellenformen erzeugt, um den Filter zu testen. Wir können interaktiv die Amplitude, die Frequenz und die Form des erzeugten Signals ändern. Um das Programm zu testen, müssen wir zunächst eine entsprechende Wellenform erzeugen. Hier erzeugen wir eine komplexe Wellenform, die aus zwei verschiedenen Frequenzen besteht. Lassen Sie alles in den Standardeinstellungen und klicken Sie auf quotgeneratequot. Jetzt sehen Sie ein 10-Hz-Signal in der Grafik neben dem Signalgenerator. Abbildung unten zeigt die Wellenform. Ändern Sie nun die Frequenz auf 100 Hz und klicken Sie erneut auf quotgeneratequot. Die neu erzeugte Wellenform wird der vorhandenen Wellenform hinzugefügt und die resultierende Wellenform sieht aus wie eine 10-Hz-Sinuswelle mit 100 Hz Rauschen. Siehe die Wellenform unten. Diese Wellenform eignet sich am besten für den Test des Filters, da er zwei verschiedene Frequenzen enthält. Sie können den Filter ausführen, indem Sie auf die Schaltfläche "Filterquot" klicken. Von den verfügbaren Optionen bis zur quotFilterquot-Taste. Sie können rekursive, nicht rekursive Filterung oder gar keine Filterung wählen. Die folgende Abbildung zeigt den Ausgang des Filters. Download Moving Average Filter Quellcode

No comments:

Post a Comment