Thursday, November 3, 2016

C durchschnittlicher algorithmus

Ich versuche, den gleitenden Durchschnitt eines Signals zu berechnen. Der Signalwert (ein Doppel) wird zu beliebigen Zeiten aktualisiert. Ich bin auf der Suche nach einem effizienten Weg, um seine Zeit gewichteten Durchschnitt über ein Zeitfenster, in Echtzeit zu berechnen. Ich könnte es selbst tun, aber es ist schwieriger als ich dachte. Die meisten der Ressourcen Ive gefunden über das Internet berechnen gleitenden Durchschnitt des periodischen Signals, aber Mine Updates zu beliebigen Zeit. Kennt jemand gute Ressourcen für die Der Trick ist die folgende: Sie erhalten Updates zu beliebigen Zeiten über void update (int Zeit, float-Wert). Allerdings müssen Sie auch nachverfolgen, wenn ein Update fällt aus dem Zeitfenster, so dass Sie einen Alarm, der bei der Zeit N, die die vorherige Aktualisierung entfernt wird immer wieder in der Berechnung berücksichtigt. Wenn dies in Echtzeit geschieht, können Sie das Betriebssystem anfordern, einen Aufruf einer Methode void dropoffoldestupdate (int time) aufzurufen, die zum Zeitpunkt N aufgerufen werden soll. Wenn es sich um eine Simulation handelt, können Sie keine Hilfe vom Betriebssystem bekommen und müssen dies tun Tun Sie es manuell. In einer Simulation würden Sie Methoden mit der angegebenen Zeit als Argument aufrufen (was nicht mit der Echtzeit korreliert). Eine vernünftige Annahme ist jedoch, dass die Anrufe so gewartet werden, dass die Zeitargumente zunehmen. In diesem Fall müssen Sie eine sortierte Liste der Alarmzeitwerte pflegen und bei jedem Aktualisierungs - und Leseaufruf überprüfen, ob das Zeitargument größer ist als der Kopf der Alarmliste. Während es größer ist, tun Sie die alarmbezogene Verarbeitung (Drop off der ältesten Aktualisierung), entfernen Sie den Kopf und überprüfen Sie erneut, bis alle Alarme vor der angegebenen Zeit verarbeitet werden. Anschließend den Update-Aufruf durchführen. Ich habe bis jetzt angenommen, dass es offensichtlich ist, was Sie für die tatsächliche Berechnung tun würden, aber ich erarbeiten gerade für den Fall. Ich nehme an, Sie haben eine Methode float read (int Zeit), die Sie verwenden, um die Werte zu lesen. Das Ziel ist, diesen Anruf so effizient wie möglich zu machen. So berechnen Sie den gleitenden Durchschnitt nicht jedes Mal, wenn die Lesemethode aufgerufen wird. Stattdessen müssen Sie den Wert der letzten Aktualisierung oder des letzten Alarms vorberechnen und diesen Wert durch ein paar Gleitkommaoperationen anpassen, um die Zeit seit der letzten Aktualisierung zu berücksichtigen. (D. h. eine konstante Anzahl von Operationen, außer dass möglicherweise eine Liste von aufgestauten Alarmen verarbeitet wird). Hoffentlich ist dies klar - das sollte ein ganz einfacher Algorithmus und sehr effizient sein. Weitere Optimierung. Einer der verbleibenden Probleme ist, wenn eine große Anzahl von Updates innerhalb des Zeitfensters auftreten, dann gibt es eine lange Zeit, für die es weder liest noch Updates, und dann ein Lesen oder Update kommt entlang. In diesem Fall ist der obige Algorithmus ineffizient, wenn der Wert für jedes der Aktualisierungen, die herunterfallen, inkremental aktualisiert wird. Dies ist nicht notwendig, weil wir nur kümmern uns um die letzte Aktualisierung über das Zeitfenster so, wenn es einen Weg, um effizient drop off alle älteren Updates, würde es helfen. Um dies zu tun, können wir den Algorithmus ändern, um eine binäre Suche nach Updates durchzuführen, um das neueste Update vor dem Zeitfenster zu finden. Wenn es relativ wenige Updates gibt, die gelöscht werden müssen, dann kann man den Wert für jedes heruntergelassene Update inkremental aktualisieren. Aber, wenn es viele Updates gibt, die gelöscht werden müssen, dann kann man den Wert vom Kratzer neu berechnen, nachdem er weg von den alten Updates. Anhang auf Inkrementelle Berechnung: Ich sollte klären, was ich meine durch inkrementelle Berechnung oben in den Satz zwicken diesen Wert durch ein paar Gleitkomma-Operationen, um für den Ablauf der Zeit seit dem letzten Update. Initiale nicht-inkrementale Berechnung: dann über die relevanten Daten in der Reihenfolge der zunehmenden Zeit iterieren: movingaverage (sum lastupdate timesincelastupdate) / windowlength. Nun, wenn genau ein Update fällt aus dem Fenster, aber keine neuen Aktualisierungen ankommen, stellen Sie die Summe als: (beachten Sie, es ist Priorupdate, deren Timestamp geändert, um den Beginn der letzten Fenster beginnt). Und wenn genau ein Update in das Fenster eintritt, aber keine neuen Updates abfallen, passen Sie die Summe als an: Wie offensichtlich sein sollte, ist dies eine grobe Skizze, aber hoffentlich zeigt es, wie Sie den Durchschnitt so halten können, dass es O (1) Operationen pro Update ist Auf amortisierte Basis. Aber beachten Sie weitere Optimierung im vorherigen Absatz. Beachten Sie auch Stabilitätsprobleme, auf die in einer älteren Antwort hingewiesen wird, was bedeutet, dass Gleitkomma-Fehler über eine große Anzahl derartiger Inkrementierungsoperationen akkumulieren können, so dass es eine Abweichung von dem Ergebnis der Vollberechnung gibt, die für die Anwendung signifikant ist. Wenn eine Annäherung OK und theres eine minimale Zeit zwischen Proben ist, könnten Sie versuchen, Super-Sampling. Sie haben ein Array, das gleichmäßig beabstandete Zeitintervalle repräsentiert, die kürzer als das Minimum sind, und zu jedem Zeitpunkt die letzte empfangene Probe speichern. Je kürzer das Intervall, desto näher ist der Mittelwert auf den wahren Wert. Der Zeitraum sollte nicht größer als die Hälfte des Minimums sein, oder es besteht die Möglichkeit, eine Stichprobe zu fehlen. Antwortete am 15. Dezember um 18:12 Vielen Dank für die Antwort. Eine Verbesserung, die erforderlich wäre, um tatsächlich Quotecachequot den Wert des Gesamtdurchschnitts, so dass wir don39t Schleife die ganze Zeit. Auch kann es ein kleiner Punkt sein, aber wäre es nicht effizienter, ein deque oder eine Liste zu verwenden, um den Wert zu speichern, da wir davon ausgehen, dass die Aktualisierung in der richtigen Reihenfolge kommen wird. Einfügen wäre schneller als in der Karte. Ndash Arthur Ja, Sie könnten den Wert der Summe zwischenspeichern. Subtrahieren Sie die Werte der Proben, die Sie löschen, fügen Sie die Werte der Proben, die Sie einfügen. Auch, ja, ein dequeltpairltSample, Dategtgt könnte effizienter sein. Ich wählte Karte für Lesbarkeit, und die Leichtigkeit der Aufruf der Karte :: upperbound. Wie immer, schreiben Sie den richtigen Code zuerst, dann Profil und messen inkrementelle Änderungen. Ndash Rob Dez 16 11 um 15:00 Hinweis: Anscheinend ist dies nicht der Weg, um dies zu nähern. Lassen Sie es hier als Referenz auf, was ist falsch mit diesem Ansatz. Überprüfen Sie die Kommentare. AKTUALISIERT - basierend auf Olis Kommentar. Nicht sicher über die Instabilität, dass er aber reden. Verwenden Sie eine sortierte Karte der Ankunftszeiten mit Werten. Bei der Ankunft eines Wertes addieren Sie die Ankunftszeit zur sortierten Karte zusammen mit ihrem Wert und aktualisieren Sie den gleitenden Durchschnitt. Warnung dies ist Pseudocode: Dort. Nicht vollständig ausgefuellt, aber Sie bekommen die Idee. Dinge zu beachten. Wie ich schon sagte ist Pseudocode. Youll Notwendigkeit, eine passende Karte zu wählen. Entfernen Sie nicht die Paare, während Sie iterieren durch, wie Sie den Iterator ungültig machen und müssen wieder neu starten. Siehe Olis Kommentar unten auch. Antwort # 2 am: Dezember 15, 2010, um 12:22 Uhr Dies doesn39t Arbeit: es doesn39t berücksichtigen, welcher Anteil der Fensterlänge jeder Wert für vorhanden ist. Auch dieser Ansatz der Addition und dann Subtraktion ist nur stabil für Ganzzahl-Typen, nicht Floaten. Ndash Oliver Charlesworth OliCharlesworth - sorry Ich habe einige wichtige Punkte in der Beschreibung (doppelt und zeitgewichtet) verpasst. Ich werde aktualisieren. Vielen Dank. Ndash Dennis Dec 15 11 at 12:33 Die Zeitgewichtung ist ein weiteres Problem. Aber das ist nicht das, worüber ich rede. Ich bezog sich auf die Tatsache, dass, wenn ein neuer Wert zuerst das Zeitfenster betritt, sein Beitrag zum Durchschnitt minimal ist. Ihr Beitrag steigt, bis ein neuer Wert eintritt. Ndash Ein einfacher gleitender Durchschnitt ist ein Algorithmus, der den ungewichteten Mittelwert der letzten n Proben berechnet. Der Parameter n wird oft als Fenstergröße bezeichnet, da der Algorithmus als Fenster betrachtet werden kann, das über die Datenpunkte gleitet. Unter Verwendung einer rekursiven Formulierung des Algorithmus wird die Anzahl der Operationen, die pro Probe erforderlich sind, 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. Die rekursive Formel des ungewichteten gleitenden Mittelwertes ist, wobei avg der rollende Mittelwert und x ein Datenpunkt ist. Wenn also das Fenster nach rechts gleitet, fällt ein Datenpunkt, der Schwanz, aus und ein Datenpunkt, der Kopf, bewegt sich hinein. Implementierung Eine Implementierung des einfachen gleitenden Mittels muss folgendes berücksichtigen Algorithmusinitialisierung Solange Das Fenster nicht vollständig mit Werten belegt wird, schlägt die rekursive Formel fehl. Lagerung Der Zugriff auf das Heizelement ist erforderlich, was je nach Implementierung eine Speicherung von n Elementen erfordert. Meine Implementierung verwendet die vorgestellte Formel, wenn das Fenster vollständig mit Werten gefüllt wird, und wechselt andererseits auf die Formel, die den Mittelwert aktualisiert, indem die Summe der vorherigen Elemente neu berechnet wird. Beachten Sie, dass dies aufgrund der Gleitpunktarithmetik zu numerischen Instabilitäten führen kann. Was den Speicherverbrauch angeht, verwendet die Implementierung Iteratoren zum Verfolgen von Kopf - und Schwanz-Elementen. Dies führt zu einer Implementierung mit konstantem Speicherbedarf unabhängig von der Fenstergröße. Hier ist die Aktualisierungsprozedur, die das Fenster nach rechts verschiebt. In den meisten Sammlungen werden ihre Enumeratoren ungültig, wenn die zugrundeliegende Sammlung geändert wird. Die Implementierung setzt jedoch auf gültige Enumeratoren. Insbesondere bei streamingbasierten Anwendungen muss die zugrundeliegende Sammlung geändert werden, wenn ein neues Element eintrifft. Eine Möglichkeit, dies zu bewältigen, besteht darin, eine einfache kreisförmige Sammlung von fester Größe der Größe n1 zu erstellen, die ihre Iteratoren niemals ungültig macht und alternativ ein Element hinzufügt und die Verschiebung aufruft. Ich wünschte, ich könnte herausfinden, wie man tatsächlich implementieren, da die Test-Funktion ist sehr verwirrend, me8230 Muss ich Daten in Array konvertieren, dann SMA SMA SMA (20, Array) für eine 20-Periode SMA laufen Wie behandle ich Shift () - Funktion Ist es notwendig, Konstruktoren zu implementieren. (Entschuldigen Sie das Durcheinander). Nein Sie don8217t müssen Ihre Daten in ein Array zu konvertieren, solange Ihre Daten implementiert IEnumerable1 und die Aufzählung Typ ist doppelt. Soweit Ihr privates Messaging betroffen ist, müssen Sie das DataRow zu etwas umwandeln, das von den doppelten Werten aufzählbar ist. Ihr Ansatz funktioniert. Shift, verschiebt das Fenster um eine Position nach links. Für einen Datensatz von etwa 40 Werten und eine 20-stündige SMA haben Sie 21 Positionen das Fenster passt in (40 8211 20 1). Jedes Mal, wenn Sie Shift () aufrufen, wird das Fenster um eine Position nach links verschoben, und Average () gibt die SMA für die aktuelle Fensterposition zurück. Das heißt, der ungewichtete Durchschnitt aller Werte innerhalb des Fensters. Darüber hinaus ermöglicht meine Implementierung, die SMA zu berechnen, auch wenn das Fenster nicht vollständig am Anfang gefüllt ist. Also im Wesentlichen Hope dies hilft. Alle weiteren Fragen COPYRIGHT NOTICE Christoph Heindl und cheind. wordpress, 2009-2012. Unerlaubte Verwendung und / oder Vervielfältigung dieses Materials ohne ausdrückliche und schriftliche Genehmigung von diesem Blog-Autor und / oder Inhaber ist streng verboten. Auszüge und Links können verwendet werden, sofern Christoph Heindl und cheind. wordpress mit entsprechender und konkreter Orientierung zum Originalinhalt volle und klare Gutschrift erteilt werden. Aktuelle Beiträge ArchiveA Closer Blick auf die erweiterte CODAS Moving Average Algorithmus Vielseitig gleitenden Durchschnitt in Advanced CODAS-Algorithmus filtert Wellenformrauschen, extrahiert Mittelwert und eliminiert Baseline Drift. Der gleitende Durchschnitt ist eine einfache mathematische Technik, die primär zur Beseitigung von Aberrationen verwendet wird und den tatsächlichen Trend in einer Sammlung von Datenpunkten offenbart. Sie könnten mit ihm aus der Mittelung lärmender Daten in einem Neuling Physik-Experiment oder aus der Verfolgung der Wert einer Investition vertraut sein. Sie wissen vielleicht nicht, dass der gleitende Durchschnitt auch ein Prototyp des endlichen Impulsantwortfilters ist, der häufigste Filtertyp, der in der computerbasierten Instrumentierung verwendet wird. In Fällen, in denen eine gegebene Wellenform mit Rauschen überlagert ist, wo ein Mittel aus einem periodischen Signal extrahiert werden muss oder wo eine langsam driftende Grundlinie aus einem Signal höherer Frequenz eliminiert werden muss, kann ein gleitender Durchschnittsfilter angewendet werden, um das gewünschte zu erzielen Ergebnis. Der gleitende Durchschnittsalgorithmus von Advanced CODAS bietet diese Art der Wellenformfilterleistung. Advanced CODAS ist ein Analyse-Softwarepaket, das auf vorhandenen Wellenformdateien arbeitet, die von WinDaq oder WinDaq-Datenerfassungspaketen der zweiten Generation erstellt wurden. Zusätzlich zu dem gleitenden durchschnittlichen Algorithmus enthält Advanced CODAS auch ein Berichtsgenerator-Dienstprogramm und Software-Routinen für Wellenformintegration, Differenzierung, Peak - und Tal-Erfassung, Rektifikation und arithmetische Operationen. Moving Average Filter Theorie DATAQ Instruments Moving Average Algorithmus ermöglicht eine große Flexibilität in Wellenform-Filter-Anwendungen. Es kann als Tiefpaßfilter verwendet werden, um das Rauschen, das bei vielen Arten von Wellenformen anliegt, oder als Hochpaßfilter zu dämpfen, um eine Drift-Grundlinie von einem Signal höherer Frequenz zu eliminieren. Das Verfahren, das von dem Algorithmus verwendet wird, um die Filtermenge zu bestimmen, beinhaltet die Verwendung eines Glättungsfaktors. Dieser Glättungsfaktor, der von Ihnen durch die Software gesteuert wird, kann erhöht oder verringert werden, um die Anzahl der tatsächlichen Wellenformdatenpunkte oder Abtastwerte anzugeben, die der gleitende Durchschnitt überspannt. Jede periodische Wellenform kann als eine lange Zeichenkette oder Sammlung von Datenpunkten gedacht werden. Der Algorithmus führt einen gleitenden Durchschnitt durch, indem er zwei oder mehr dieser Datenpunkte aus der erfassten Wellenform abgibt, addiert, ihre Summe durch die Gesamtanzahl der hinzugefügten Datenpunkte dividiert und den ersten Datenpunkt der Wellenform durch den gerade berechneten Durchschnitt ersetzt Wiederholen der Schritte mit den zweiten, dritten und so weiter Datenpunkten, bis das Ende der Daten erreicht ist. Das Ergebnis ist eine zweite oder erzeugte Wellenform, die aus den gemittelten Daten besteht und die gleiche Anzahl von Punkten wie die ursprüngliche Wellenform aufweist. Abbildung 1 8212 Jede periodische Wellenform kann als eine lange Zeichenkette oder Sammlung von Datenpunkten gedacht werden. In der obigen Darstellung werden konsekutive Wellenformdatenpunkte durch quotyquot dargestellt, um zu veranschaulichen, wie der gleitende Durchschnitt berechnet wird. In diesem Fall wurde ein Glättungsfaktor von drei angewandt, was bedeutet, dass drei aufeinander folgende Datenpunkte aus der ursprünglichen Wellenform hinzugefügt werden, wobei ihre Summe durch drei geteilt wird, und dann wird dieser Quotient als der erste Datenpunkt einer erzeugten Wellenform aufgetragen. Der Vorgang wiederholt sich mit den zweiten, dritten und anderen Datenpunkten der ursprünglichen Wellenform, bis das Ende der Daten erreicht ist. Eine spezielle Quotientierquot-Technik misst die Anfangs - und Enddatenpunkte der ursprünglichen Wellenform, um sicherzustellen, dass die erzeugte Wellenform die gleiche Anzahl von Datenpunkten wie die Vorlage enthält. Fig. 1 zeigt, wie der gleitende Mittelalgorithmus auf Wellenformdatenpunkte (die durch y dargestellt werden) angewendet wird. Die Abbildung zeigt einen Glättungsfaktor von 3, was bedeutet, dass der Durchschnittswert (dargestellt durch a) über 3 aufeinanderfolgende Wellenformdatenwerte berechnet wird. Beachten Sie die Überlappung, die in den gleitenden Durchschnittsberechnungen vorhanden ist. Es ist diese überlappende Technik, zusammen mit einer speziellen Anfangs - und Endpunktbehandlung, die die gleiche Anzahl von Datenpunkten in der gemittelten Wellenform erzeugt, wie sie im Original existiert. Die Art und Weise, wie der Algorithmus einen gleitenden Durchschnitt berechnet, verdient einen genaueren Blick und kann an einem Beispiel veranschaulicht werden. Sagen wir haben auf einer Diät für zwei Wochen und wir wollen unser durchschnittliches Gewicht in den letzten 7 Tagen zu berechnen. Wir würden unser Gewicht an Tag 7 mit unserem Gewicht an den Tagen 8, 9, 10, 11, 12 und 13 summieren und dann mit 1/7 multiplizieren. Zur Formalisierung des Prozesses läßt sich dies folgendermaßen ausdrücken: a (7) 1/7 (y (7) y (8) y (9) y (13) Diese Gleichung kann weiter verallgemeinert werden. Der gleitende Mittelwert einer Wellenform kann folgendermaßen berechnet werden: wobei: ein gemittelter Wert n Datenpunktposition s Glättungsfaktor y aktueller Datenpunktwert Bild 2 8212 Die Ausgangswellenform der Kraftmesszelle, die im oberen Kanal als Original und ungefiltert dargestellt ist, und als ein 11-Punkt Gemittelte Wellenform im unteren Kanal. Das Rauschen, das auf der ursprünglichen Wellenform auftritt, war auf die intensiven Vibrationen zurückzuführen, die durch die Presse während des Verpackungsvorgangs erzeugt wurden. Der Schlüssel zu dieser Algorithmenflexibilität ist sein breites Spektrum an auswählbaren Glättungsfaktoren (von 2 - 1.000). Der Glättungsfaktor bestimmt, wie viele tatsächliche Datenpunkte oder Proben gemittelt werden sollen. Das Angeben eines positiven Glättungsfaktors simuliert einen Tiefpaßfilter, während ein negativer Glättungsfaktor ein Hochpassfilter simuliert. Bei dem Absolutwert des Glättungsfaktors gelten bei höheren Werten grßere Glättungsbeschränkungen für die resultierende Wellenform und umgekehrt niedrigere Werte weniger Glättung. Mit der Anwendung des geeigneten Glättungsfaktors kann der Algorithmus auch verwendet werden, um den Mittelwert einer gegebenen periodischen Wellenform zu extrahieren. Ein höherer positiver Glättungsfaktor wird typischerweise angewendet, um mittlere Wellenformwerte zu erzeugen. Anwenden des Moving Average Algorithmus Ein herausragendes Merkmal des gleitenden Durchschnittsalgorithmus ist, dass es viele Male auf die gleiche Wellenform angewendet werden kann, um das gewünschte Filterergebnis zu erhalten. Waveform-Filterung ist eine sehr subjektive Übung. Was möglicherweise eine richtig gefilterte Wellenform zu einem Benutzer sein kann, kann unannehmbar laut zu einem anderen sein. Nur Sie können beurteilen, ob die Anzahl der gemittelten Punkte zu hoch, zu niedrig oder genau richtig gewählt wurde. Die Flexibilität des Algorithmus ermöglicht es Ihnen, den Glättungsfaktor anzupassen und einen weiteren Durchlauf durch den Algorithmus durchzuführen, wenn mit dem anfänglichen Versuch keine zufriedenstellenden Ergebnisse erzielt werden. Die Anwendung und die Fähigkeiten des gleitenden Durchschnittsalgorithmus können am besten durch die folgenden Beispiele veranschaulicht werden. Abbildung 3 8212 Die EKG-Wellenform, die ursprünglich und ungefiltert im oberen Kanal und als 97-Punkt-gemittelte Wellenform im unteren Kanal angezeigt wurde. Beachten Sie die Abwesenheit von Baseline Drift im unteren Kanal. Beide Wellenformen werden in einem komprimierten Zustand für Präsentationszwecke gezeigt. Eine Rauschunterdrückungsanwendung In Fällen, in denen eine gegebene Wellenform mit Rauschen überladen ist, kann das gleitende Durchschnittsfilter angewendet werden, um das Rauschen zu unterdrücken und ein klareres Bild der Wellenform zu liefern. Zum Beispiel benutzte ein fortgeschrittener CODAS-Kunde eine Presse und eine Wägezelle in einem Verpackungsbetrieb. Ihr Produkt sollte auf ein vorbestimmtes Niveau (überwacht durch die Kraftmesszelle) komprimiert werden, um die Größe der Verpackung zu reduzieren, die erforderlich ist, um das Produkt aufzunehmen. Aus Qualitätskontrollgründen beschlossen sie, den Pressenbetrieb mit Instrumentierung zu überwachen. Ein unerwartetes Problem erschien, als sie begannen, die Echtzeit-Wägezellenausgabe anzuzeigen. Da die Pressenmaschine während des Betriebs beträchtlich vibrierte, war die Ausgangswellenform der Lastzellen schwierig zu unterscheiden, da sie eine große Menge an Rauschen aufgrund der Schwingung aufwies, wie dies in dem oberen Kanal von Fig. 2 gezeigt ist. Dieses Rauschen wurde eliminiert, indem ein 11-Punkt-gemittelter Kanal erzeugt wurde, wie in dem unteren Kanal von Fig. 2 gezeigt. Das Ergebnis war ein deutlich deutlicheres Bild der Wägezellenausgabe. Eine Anwendung bei der Beseitigung von Baseline Drift In Fällen, in denen eine langsam driftende Grundlinie aus einem Signal mit höherer Frequenz entfernt werden muss, kann das gleitende Durchschnittsfilter angewendet werden, um die Drift-Baseline zu eliminieren. Beispielsweise weist eine EKG-Wellenform typischerweise einen gewissen Grad an Grundlinienwanderung auf, wie in dem oberen Kanal von 3 zu sehen ist. Diese Grundliniendrift kann eliminiert werden, ohne die Eigenschaften der Wellenform zu verändern oder zu stören, wie in dem unteren Kanal von Fig. 3 gezeigt. Dies wird durch Anwenden eines geeigneten negativen Glättungsfaktors während der gleitenden Durchschnittsberechnung erreicht. Der geeignete Glättungsfaktor wird durch Dividieren einer Wellenformperiode (in Sekunden) durch das Abtastintervall der Kanäle bestimmt. Das Abtastintervall der Kanäle ist einfach der Reziprokwert der Abtastrate der Kanäle und wird bequem auf dem gleitenden Durchschnitts-Utility-Menü angezeigt. Die Wellenformperiode kann leicht aus dem Anzeigebildschirm bestimmt werden, indem der Cursor an einem geeigneten Punkt auf der Wellenform positioniert, eine Zeitmarke eingestellt und dann der Cursor einen vollständigen Zyklus von der angezeigten Zeitmarke weg bewegt wird. Die Zeitdifferenz zwischen Cursor und Zeitmarke ist eine Wellenformperiode und wird am unteren Rand des Bildschirms in Sekunden angezeigt. In unserem EKG-Beispiel besaß die Wellenform ein Kanalabtastintervall von 0,004 Sekunden (erhalten aus dem gleitenden mittleren Utility-Menü) und eine Wellenformperiode wurde gemessen, um 0,388 Sekunden zu überspannen. Das Dividieren der Wellenformperiode durch das Abtastintervall der Kanäle lieferte einen Glättungsfaktor von 97. Da es sich um die Grundliniendrift handelt, die wir an der Eliminierung interessieren, haben wir einen negativen Glättungsfaktor (-97) auf den gleitenden Durchschnittsalgorithmus angewendet. Dies subtrahierte das gleitende Durchschnittsergebnis des ursprünglichen Wellenformsignals, das die Grundliniendrift ohne störende Wellenforminformation eliminierte. Other Waveform Moving Average Issues Unabhängig von der Anwendung ist der universelle Grund für die Anwendung eines gleitenden mittleren Filters auf Quotsmooth outquot die hohen und niedrigen Aberrationen und zeigen einen repräsentativeren Zwischen-Wellenformwert. Dabei sollte die Software bei der Erzeugung einer gleitenden gemittelten Wellenform nicht andere Merkmale der ursprünglichen Wellenform beeinträchtigen. Beispielsweise sollte die Software automatisch die mit der ursprünglichen Datendatei verknüpften Kalibrierungsinformationen einstellen, so daß sich die gleitende gemittelte Wellenform in den geeigneten Entwicklungseinheiten befindet, wenn sie erzeugt wird. Alle Messwerte in den Figuren wurden mit WinDaq Data Acquisition Software genommen Es könnte sein, wenn Sie ein Gewicht anwenden, das umgekehrt proportional zur Fenstergröße ist: public class AverageCounter int RunningAvg int RunningCount // Dies ersetzt die kreisförmige Liste int WindowSize public AverageCounter (int windowSize) WindowSize windowSize public void AddValue (float NewValue) // wachsen die Fenstergröße, wenn mehrere Samples aufgezeichnet werden, wenn (RunningCount lt WindowSize) RunningCount // rekursiver gleitender Durchschnitt: // gt avg (n) (W - 1) / W avg (n -1) (1 / W) Beispiel // wobei W Fenstergröße ist RunningAvg ((RunningCount - 1) / RunningCount) RunningAvg) (1 / RunningCount) NewValue public float Durchschnitt () return RunningAvg - geändert um 13:53 Freitag 9. November 2007 pwasser 8-Jan-08 15:25 Diese Formel funktioniert gut, um den gleitenden Durchschnitt zu schätzen, solange ein paar Einschränkungen im Auge behalten werden. Es berechnet eine Schätzung des gleitenden Mittelwerts (nicht des realen gleitenden Durchschnitts), basierend auf der wichtigen Annahme, dass die Musterwerte normalerweise um den Mittelwert verteilt sind. Ich wies dies in einem früheren Post. Toadth 9-Oct-11 14:46 Nun, das war dumm war es nicht. 4 Jahre auf und ich könnte einen besseren Vorschlag haben. Verwenden Sie statt einer kreisförmigen Liste eine verknüpfte Liste und manuell pflegen Sie die maximale Listengröße. Auf diese Weise können Sie eine laufende Summe des Aggregats beibehalten - beim Hinzufügen zur Verknüpfungsliste dem Aggregat hinzufügen, wenn Sie einen Knoten trimmen, diesen Wert vom Aggregat subtrahieren. Für einen durchschnittlichen Zähler mit 5 Knoten, vielleicht werden Sie nicht eine Leistungsverbesserung bemerken, aber für viele Fälle mit sagen, Tausende von Knoten wäre es wichtig. 1. Fügen Sie in der AddValue-Methode einen neuen Linklistenknoten hinzu, und fügen Sie zu AVERAGE 2 hinzu. Nach dem Hinzufügen überprüfen Sie die Größe 3. Wenn die Größenschwelle: Subtrahieren Sie von AVERAGE und ziehen Sie den Knoten ab. Für noch mehr Effizienz, anstelle der Verwendung von verketteten Liste, können Sie Ihre eigene zirkuläre Liste basierend auf einem Array der Werte - Subtraktion von AVERAGE, wenn Sie einen Array-Wert zu ersetzen. Marc Clifton 10-Oct-11 0:37 4 Jahre und ich hätte einen besseren Vorschlag. In der Tat, das würde besser funktionieren. Im nicht suren der korrekten Lösung zwar, da das Summieren des Durchschnittes jeder Probe einen angemessenen Betrag des Rundungsfehlers einführen würde. Hmm Ich frage mich, wenn die Trennung der gebrochenen Teil aus dem ganzen Teil helfen würde. Teilen Sie den ganzen Teil jeder Zahl durch den Zähler. Halten Sie drei laufende Summen: 1) der Durchschnitt der ganzen Teile, 2) der Rest von jeder Division und 3) der Bruchteil einer jeden Zahl. Jedes Mal, wenn der ganze Teil einer Zahl geteilt wird, wird das gesamte Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der verbleibenden laufenden Summe addiert. Wenn die verbleibende laufende Summe einen Wert größer oder gleich dem Zählwert erhält, wird sein dividiert durch die Zählung mit dem gesamten Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der restlichen laufenden Summe addiert. Auch wird bei jeder Berechnung der Bruchteil zur Bruchlaufsumme addiert. Wenn die Mittelung beendet ist, wird die verbleibende laufende Summe durch die Zählung geteilt, und das Ergebnis wird der durchschnittlichen laufenden Summe als eine fließende Zahl hinzugefügt. Zum Beispiel: Nun, was mit der fraktionalen laufenden Summe zu tun. Die Gefahr des Überlaufs ist hier viel weniger wahrscheinlich, obwohl es immer noch möglich ist, so dass man damit umgehen würde, wäre es, die gebrochene laufende Summe durch den Zähler am Ende zu teilen und es zu unserem Ergebnis hinzuzufügen: Eine Alternative wäre, den fraktionalen Betrieb zu überprüfen Summe bei jeder Berechnung, um zu sehen, ob sie größer oder gleich count ist. Wenn das passiert, tun Sie einfach das Gleiche, was wir mit dem Rest laufen Summe. Durchschnittswerte / Einfache gleitende Durchschnitt Durchschnittliche / Einfache gleitende Durchschnitt Sie sind aufgefordert, diese Aufgabe entsprechend der Aufgabe Beschreibung, mit Hilfe einer Sprache, die Sie vielleicht kennen zu lösen. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktion / Klasse / Instanz, die einen Punkt dauert und gibt eine Routine zurück, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zurückgibt. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160-Nummern aus dem Strom 160, wobei 160 P 160 als Periode bekannt ist. Sie kann implementiert werden, indem eine Initialisierungsroutine mit 160 P 160 als Argument 160 I (P) 160 aufgerufen wird, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen aufeinanderfolgenden Elementen eines Stroms von Zahlen aufgerufen wird, den Mittelwert von (up To), die letzten 160 P 160 von ihnen, rufen Sie diese 160 SMA (). Das Wort 160 stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit für 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Der Zeitraum 160 P 160 Ein geordneter Container von mindestens den letzten 160 P 160 Nummern von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe von 160 I (), 160 der Initialisierer, 160 separate Routinen zurückgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die letzten p-Werte zu halten. Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Zustand in einem Atom mit einem Queue-Wert. Diese Implementierung verwendet eine zirkuläre Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der sich gerade aus dem Fenster bewegt und durch den gerade addierten Wert ersetzt wird. Verwenden eines Closure-Edit derzeit Diese sma kann nicht nogc, weil es eine Schließung auf dem Heap zugeordnet. Einige Escape-Analyse konnte die Heap-Zuweisung entfernen. Verwenden einer Strukturbearbeitung Diese Version vermeidet die Heapzuweisung des Verschlusses, der die Daten im Stapelrahmen der Hauptfunktion hält. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Näherungen aufeinandertreiben und wachsen, kann der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Zustand teilen. Es ist idiomatisch in E, die Eingabe von der Ausgabe (Lesen von Schreiben) zu trennen, anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixierprogramm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die run-Funktion liest die numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Verschlüsse, aber unveränderliche Variablen. Eine Lösung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte für eine gegebene Reihenfolge von Elementen zu berechnen. Es ist weniger effizient Schleife wie in den folgenden Befehlen. Fordert kontinuierlich einen Eingang I auf. Die dem Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS gefunden werden. Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisieren der gleitenden Durchschnittsberechnung und Definieren des Zeitraums von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3), und das Ergebnis wird auf der Variablen x gespeichert und movinav2 (4, : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) / 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Indexvariable und zeigt auf das Ende der Unterliste die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste bei der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen p Elemente berücksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewöhnlich negativ sein, so daß die folgende Gleichung negative Indexe vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen ist ebenfalls kleiner, der korrekte Wert (Endindex - Anfangsindex 1) oder die Anordnung der Gleichung (i - (max (ip, 0) 1) 1) , (I-max (ip, 0)). Die Variable z enthält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) .) Summiert sie sum (.) / (Iz) ri wird sie mitteln und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern Verwenden eines Schließens und Erstellen einer Funktion


No comments:

Post a Comment