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 Gleitkomma verwenden müssen, zeigt das Programm in Tabelle 15-2 an, wie man einen doppelten Präzisionsakkumulator benutzt, um diese Drift zu eliminieren. Ich habe im Wesentlichen ein Array von Werten wie folgt: Das obige Array ist vereinfacht, Im sammeln 1 Wert Pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus verarbeiten, den ich schrieb, um den nächstgelegenen Peak vor einem Zeitpunkt zu finden. Meine Logik scheitert, weil in meinem Beispiel oben, 0.36 ist die reale Spitze, aber mein Algorithmus würde nach hinten schauen und sehen die letzte Zahl 0,25 als die Spitze, als theres eine Abnahme auf 0,24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus an sie anzuwenden, der sie ein bisschen glättet, so dass ich mehr lineare Werte habe. (Dh: Id wie meine Ergebnisse zu curvy, nicht Jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich das tun? Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, ich mache viel besser mit Code. Wie verarbeite ich Werte in meinem Array, indem du eine exponentielle gleitende durchschnittliche Berechnung anwende, um sie herauszufordern, um den 8. Februar 12 um 20:27 zu bitten, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Du musst einen Zustand halten und du brauchst einen Tuning-Parameter. Dies fordert eine kleine Klasse (vorausgesetzt, du bist mit Java 5 oder höher): Instantiieren Sie mit dem Zerfallsparameter, den Sie wollen (kann die Abstimmung zwischen 0 und 1) und dann mit durchschnittlichen () zu filtern. Beim Lesen einer Seite auf einige mathematische Wiederholung, alles, was Sie wirklich wissen müssen, wenn es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Sie haben auch ein paar andere Notationen, was nicht hilft.) Allerdings ist die EMA ziemlich einfach, da man sich nur an einen alten Wert erinnern muss, keine komplizierten Zustand Arrays erforderlich. Antwortete Feb 8 12 um 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn es einfach sein kann (wenn man mit einer neuen Sequenz beginnt, bekomme du einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz ein bisschen wegen der Brenneffekte umgehen werden, aber man bekommt diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelalter einpacken und experimentieren kann, ohne den Rest deines Programms zu stark zu stören. Ndash Donal Fellows Feb 9 12 at 0:06 Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu antworten. 1) Wenn dein Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt (das geht immer nach oben oder immer nach unten). Es sei denn, du durchschnittst alle deine Daten, deine Datenpunkte - wie du sie präsentierst - sind nichtlinear. Wenn Sie wirklich wollen, um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie die max dieser Subarray. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: Stellen Sie sich vor, dass ich die folgende Liste habe: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glatt machen, indem ich den Durchschnitt von zwei Zahlen: 1.45, 1.45, 1.45, 1.5. Beachten Sie, dass die erste Zahl ist der Durchschnitt von 1,5 und 1,4 (zweite und erste Zahlen) die zweite (neue Liste) ist der Durchschnitt von 1,4 und 1,5 (dritte und zweite alte Liste) die dritte (neue Liste) der Durchschnitt von 1,5 und 1,4 (Vierte und dritte) und so weiter. Ich hätte es mal drei oder vier machen können, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen, ist, zu Google Finance zu gehen, eine Aktie auszuwählen (Tesla Motors ziemlich flüchtig (TSLA) auszuprobieren) und klicken Sie auf die Technik am unteren Rand des Diagramms. Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponential gleitenden Durchschnitt, um ihre Unterschiede zu vergleichen. Exponentieller gleitender Durchschnitt ist nur eine weitere Ausarbeitung von diesem, aber gewichtet die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten voranzutreiben. Bitte lesen Sie den Wikipedia-Eintrag. Also, das ist mehr ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzig. Viel Glück. Wenn du Schwierigkeiten mit der Mathematik hast, könntest du mit einem einfachen gleitenden Durchschnitt anstatt exponentiell gehen. Also die Ausgabe, die du bekommst, wäre die letzten x Begriffe geteilt durch x. Ungetesteter Pseudocode: Beachten Sie, dass Sie die Start - und Endteile der Daten behandeln müssen, da Sie deutlich die letzten 5 Begriffe haben, wenn Sie auf Ihrem 2. Datenpunkt sind. Auch gibt es effizientere Möglichkeiten, diesen gleitenden Durchschnitt zu berechnen (Summsumme - älteste neueste), aber das ist es, das Konzept zu bekommen, was passiert. Antwortete am 8. Februar 12 bei 20: 41In den Statistiken ein einfacher gleitender Durchschnitt ist 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. kürzliche Posts
BEWEGENDE FORTH Teil 1: Designentscheidungen im Forth Kernel von Brad Rodriguez Dieser Artikel erschien zuerst im Computer Journal 59 (JanuarFebruar 1993). EINFÜHRUNG Jeder in der Forth-Community spricht darüber, wie einfach es ist, Port zu einer neuen CPU zu portieren. Aber wie viele quoteasyquot und quotobviousquot Aufgaben, ist nicht viel geschrieben, wie es zu tun ist So, als Bill Kibler dieses Thema für einen Artikel vorschlug, beschloss ich, mit der großen mündlichen Tradition von Forthwrights zu brechen und den Prozess in Schwarz und Weiß zu dokumentieren. Im Laufe dieser Artikel werde ich Forths für die 6809, 8051 und Z80 entwickeln. Ich mache das 6809, um ein einfaches und konventionelles Forth-Modell zu veranschaulichen, und Ive veröffentlichte bereits einen 6809 Assembler ROD91, ROD92 und Ill, der einen 6809 Forth für zukünftige TCJ-Projekte benötigt. Ich mache das 8051 Forth für ein Universitätsprojekt, aber es illustriert auch einige ziemlich unterschiedliche Designentsche...
Comments
Post a Comment