Friday 24 March 2017

Einheitlich Gewichtet Gleitender Durchschnitt Algorithmus

Weighted Moving Averages: Die Grundlagen Im Laufe der Jahre haben Techniker zwei Probleme mit dem einfachen gleitenden Durchschnitt gefunden. Das erste Problem liegt im Zeitrahmen des gleitenden Mittelwertes (MA). Die meisten technischen Analysten glauben, dass Preisaktion. Der Eröffnungs - oder Schlussbestandspreis, ist nicht genug, auf die für die ordnungsgemäße Vorhersage des Kaufs oder der Verkaufssignale der MAs Crossover-Aktion abzusehen ist. Um dieses Problem zu lösen, weisen die Analysten nunmehr die aktuellsten Preisdaten mit dem exponentiell geglätteten gleitenden Durchschnitt (EMA) zu. (Erfahren Sie mehr bei der Erforschung der exponentiell gewogenen bewegten Durchschnitt.) Ein Beispiel Zum Beispiel, mit einem 10-Tage-MA, würde ein Analytiker den Schlusskurs des 10. Tages und multiplizieren diese Zahl um 10, der neunte Tag um neun, der achte Tag für acht und so weiter zum ersten der MA. Sobald die Summe bestimmt worden ist, würde der Analytiker dann die Zahl durch die Addition der Multiplikatoren teilen. Wenn Sie die Multiplikatoren des 10-Tage-MA-Beispiels hinzufügen, ist die Zahl 55. Dieser Indikator wird als linear gewichteter gleitender Durchschnitt bezeichnet. (Für verwandte Lesung, check out Simple Moving Averages machen Trends Stand out.) Viele Techniker sind festgläubig in der exponentiell geglätteten gleitenden Durchschnitt (EMA). Dieser Indikator wurde in so vielen verschiedenen Weisen erklärt, dass er Studenten und Investoren gleichermaßen verwechselt. Vielleicht kommt die beste Erklärung von John J. Murphys Technische Analyse der Finanzmärkte, (veröffentlicht vom New York Institute of Finance, 1999): Der exponentiell geglättete gleitende Durchschnitt adressiert beide Probleme, die mit dem einfachen gleitenden Durchschnitt verbunden sind. Zuerst weist der exponentiell geglättete Durchschnitt den neueren Daten ein größeres Gewicht zu. Daher ist es ein gewichteter gleitender Durchschnitt. Aber während es den vergangenen Preisdaten eine geringere Bedeutung zuweist, enthält es in der Berechnung alle Daten im Leben des Instruments. Darüber hinaus ist der Benutzer in der Lage, die Gewichtung anpassen, um mehr oder weniger Gewicht auf die jüngsten Tage Preis, die zu einem Prozentsatz der vorherigen Tage Wert hinzugefügt wird. Die Summe der beiden Prozentwerte addiert sich zu 100. Beispielsweise könnte dem letzten Tagepreis ein Gewicht von 10 (.10) zugewiesen werden, der zu den vorherigen Tagen Gewicht von 90 (.90) hinzugefügt wird. Dies gibt den letzten Tag 10 der Gesamtgewichtung. Dies wäre das Äquivalent zu einem 20-Tage-Durchschnitt, indem man den letzten Tage Preis einen kleineren Wert von 5 (.05). Abbildung 1: Exponentiell geglättete Moving Average Die obige Grafik zeigt den Nasdaq Composite Index von der ersten Woche im August 2000 bis zum 1. Juni 2001. Wie Sie deutlich sehen können, ist die EMA, die in diesem Fall die Schlusskursdaten über einen Neun-Tage-Periode, hat definitive Verkaufssignale am 8. September (gekennzeichnet durch einen schwarzen Pfeil nach unten). Dies war der Tag, an dem der Index unter dem Niveau von 4.000 unterging. Der zweite schwarze Pfeil zeigt ein weiteres heruntergekommenes Bein, das die Techniker eigentlich erwarten. Die Nasdaq konnte nicht genug Volumen und Interesse von den Einzelhandelsanlegern erzeugen, um die 3.000 Mark zu brechen. Dann tauchte es wieder auf den Boden bei 1619.58 am 4. April. Der Aufwärtstrend vom 12. April ist durch einen Pfeil markiert. Hier schloss der Index um 1.961.46, und Techniker begannen, institutionelle Fondsmanager zu sehen, die anfangen, einige Schnäppchen wie Cisco, Microsoft und einige der energiebezogenen Fragen aufzuheben. (Lesen Sie unsere verwandten Artikel: Moving Average Envelopes: Verfeinern eines beliebten Trading-Tool und Moving Average Bounce.) Wie andere bereits erwähnt haben, sollten Sie einen IIR (unendliche Impulsantwort) Filter anstatt die FIR (Finite Impulse Antwort) Filter Sie verwenden jetzt. Es gibt mehr dazu, aber auf den ersten Blick sind FIR-Filter als explizite Windungen und IIR-Filter mit Gleichungen implementiert. Der spezielle IIR-Filter, den ich viel in den Mikrocontrollern verwende, ist ein einpoliger Tiefpassfilter. Dies ist das digitale Äquivalent eines einfachen R-C-Analogfilters. Für die meisten Anwendungen, diese haben bessere Eigenschaften als die Box-Filter, die Sie verwenden. Die meisten Verwendungen eines Kastenfilters, dem ich begegnet haben, sind ein Ergebnis von jemand, der nicht in der digitalen Signalverarbeitung Klasse auffällt, nicht als Ergebnis der Notwendigkeit ihrer besonderen Eigenschaften. Wenn du nur hohe Frequenzen abschwächen willst, die du kennst, ist Rauschen, ein einpoliger Tiefpassfilter ist besser. Der beste Weg, um ein digital in einem Mikrocontroller zu implementieren, ist in der Regel: FILT lt-- FILT FF (NEU - FILT) FILT ist ein Stück persistenten Zustand. Dies ist die einzige persistente Variable, die Sie benötigen, um diesen Filter zu berechnen. NEU ist der neue Wert, den der Filter mit dieser Iteration aktualisiert. FF ist die Filterfraktion. Was die Schwere des Filters anpasst. Schauen Sie sich diesen Algorithmus an und sehen Sie, dass für FF 0 der Filter unendlich schwer ist, da sich die Ausgabe niemals ändert. Für FF 1 ist das eigentlich kein Filter, da der Ausgang gerade dem Eingang folgt. Nützliche Werte sind dazwischen. Bei kleinen Systemen wählst du FF auf 12 N, so dass die Multiplikation mit FF als rechte Verschiebung durch N Bits erreicht werden kann. Zum Beispiel könnte FF 116 sein und die Multiplikation mit FF daher eine rechte Verschiebung von 4 Bits. Andernfalls braucht dieser Filter nur einen Subtrakt und man fügt hinzu, obwohl die Zahlen in der Regel breiter als der Eingabewert sein müssen (mehr auf numerische Genauigkeit in einem separaten Abschnitt unten). Ich nehme normalerweise AD-Lesungen deutlich schneller als sie benötigt werden und wenden Sie zwei dieser Filter kaskadiert. Dies ist das digitale Äquivalent von zwei R-C-Filtern in Serie und dämpft um 12 dBoctave über der Rolloff-Frequenz. Allerdings ist für AD-Lesungen in der Regel mehr relevant, um den Filter im Zeitbereich zu betrachten, indem man seine Schrittantwort berücksichtigt. Dies sagt Ihnen, wie schnell Ihr System eine Veränderung sehen wird, wenn das, was Sie Änderungen messen. Um das Entwerfen dieser Filter zu erleichtern (was nur bedeutet, FF zu wählen und zu entscheiden, wie viele von ihnen zu kaskaden), verwende ich mein Programm FILTBITS. Sie legen die Anzahl der Schaltbits für jede FF in der kaskadierten Filterreihe fest und berechnet die Sprungantwort und andere Werte. Eigentlich laufe ich in der Regel über mein Wrapper-Skript PLOTFILT. Dies führt FILTBITS, die eine CSV-Datei macht, dann die CSV-Datei. Zum Beispiel ist hier das Ergebnis von PLOTFILT 4 4: Die beiden Parameter zu PLOTFILT bedeuten, dass es zwei Filter gibt, die von der oben beschriebenen Art kaskadiert sind. Die Werte von 4 geben die Anzahl der Verschiebungsbits an, um die Multiplikation mit FF zu realisieren. Die beiden FF-Werte sind also in diesem Fall 116. Die rote Spur ist die Einheit Schritt Antwort, und ist die Hauptsache zu betrachten. Zum Beispiel sagt Ihnen dies, dass, wenn sich die Eingabe sofort ändert, die Ausgabe des kombinierten Filters auf 90 des neuen Wertes in 60 Iterationen absetzen wird. Wenn Sie sich um 95 Zeit entscheiden, dann müssen Sie auf 73 Iterationen warten, und für 50 Einschwingzeit nur 26 Iterationen. Die grüne Spur zeigt Ihnen die Ausgabe von einer einzigen Amplitude. Dies gibt Ihnen eine Vorstellung von der zufälligen Geräuschunterdrückung. Es sieht so aus, als würde kein einzelnes Beispiel mehr als eine 2,5-Änderung in der Ausgabe verursachen. Die blaue Spur ist, ein subjektives Gefühl zu geben, was dieser Filter mit weißem Rauschen macht. Dies ist kein rigoroser Test, da es keine Garantie gibt, was genau der Inhalt von den zufälligen Zahlen war, die als der weiße Rauschen Eingang für diesen Lauf von PLOTFILT ausgewählt wurden. Sein nur, um Ihnen ein grobes Gefühl zu geben, wie viel es zerquetscht wird und wie glatt es ist. PLOTFILT, vielleicht FILTBITS, und viele andere nützliche Sachen, vor allem für PIC Firmware-Entwicklung ist in der PIC Development Tools Software-Version auf meiner Software-Downloads-Seite verfügbar. Hinzugefügt über numerische Präzision sehe ich aus den Kommentaren und nun eine neue Antwort, dass es Interesse an der Diskussion über die Anzahl der Bits, die benötigt werden, um diesen Filter zu implementieren. Beachten Sie, dass die Multiplikation mit FF log 2 (FF) neue Bits unterhalb des Binärpunktes erzeugt. Bei kleinen Systemen wird FF gewöhnlich als 12 N gewählt, so daß diese Multiplikation tatsächlich durch eine rechte Verschiebung von N Bits realisiert wird. FILT ist also meist ein Fixpunkt ganzzahlig. Beachten Sie, dass dies nicht ändern, eine der Mathematik aus der Prozessoren Sicht. Wenn Sie z. B. 10-Bit-AD-Messwerte und N 4 (FF 116) filtern, benötigen Sie 4 Bruchbits unterhalb der 10-Bit-Integer-AD-Messwerte. Eine der meisten Prozessoren, youd machen 16-Bit-Integer-Operationen aufgrund der 10-Bit-AD-Messwerte. In diesem Fall können Sie immer noch genau die gleichen 16-Bit-Integer-Opertionen, aber beginnen mit der AD-Lesungen links um 4 Bits verschoben. Der Prozessor kennt den Unterschied nicht und muss nicht. Die Mathematik auf ganzen 16-Bit-Ganzzahlen zu machen, funktioniert man, wenn man sie als 12,4 Fixpunkt oder wahre 16-Bit-Ganzzahlen betrachtet (16,0 Fixpunkt). Im Allgemeinen müssen Sie N Bits jeden Filterpol hinzufügen, wenn Sie nicht möchten, dass Rauschen aufgrund der numerischen Darstellung hinzufügen. Im obigen Beispiel müsste der zweite Filter von zwei 1044 18 Bits haben, um keine Informationen zu verlieren. In der Praxis auf einer 8-Bit-Maschine, die bedeutet, dass Sie 24-Bit-Werte verwenden. Technisch würde nur der zweite Pol von zwei den größeren Wert benötigen, aber für die Firmware-Einfachheit verwende ich gewöhnlich dieselbe Darstellung und damit denselben Code für alle Pole eines Filters. Normalerweise schreibe ich eine Unterroutine oder ein Makro, um einen Filterpolbetrieb durchzuführen, dann das auf jeden Pol anwenden. Ob eine Subroutine oder ein Makro davon abhängt, ob Zyklen oder Programmspeicher in diesem Projekt wichtiger sind. So oder so, ich benutze einen Scratch-Zustand, um NEU in den Subroutinemacro zu übergeben, der FILT aktualisiert, aber auch Lasten, die in den gleichen Kratzer Zustand NEU war in. Dies macht es einfach, mehrere Pole anzuwenden, da die aktualisierte FILT von einem Pole die NEU ist Der nächsten. Wenn eine Subroutine, ist es nützlich, einen Zeiger auf FILT auf dem Weg in, die aktualisiert wird, um nur nach FILT auf dem Ausweg. Auf diese Weise arbeitet die Subroutine automatisch auf aufeinanderfolgenden Filtern im Speicher, wenn sie mehrmals aufgerufen wird. Mit einem Makro brauchst du keinen Zeiger, da du die Adresse passierst, um bei jeder Iteration zu operieren. Code Beispiele Hier ist ein Beispiel für ein Makro wie oben für ein PIC 18 beschrieben: Und hier ist ein ähnliches Makro für ein PIC 24 oder dsPIC 30 oder 33: Beide Beispiele werden als Makros mit meinem PIC Assembler Preprocessor implementiert. Die mehr fähig ist als die eingebauten Makroanlagen. Clabacchio: Ein anderes Problem, das ich erwähnt habe, ist die Firmware-Implementierung. Sie können einmal ein einzelnes Pole-Tiefpassfilter-Subroutine schreiben, dann mehrmals anwenden. In der Tat schreibe ich normalerweise eine solche Unterroutine, um einen Zeiger in den Speicher auf den Filterzustand zu bringen, dann schalte ihn der Zeiger vor, damit er nacheinander einfach aufgerufen werden kann, um mehrpolige Filter zu realisieren. Ndash Olin Lathrop 20. April um 15:03 1. Vielen Dank für eure Antworten - alle von ihnen. Ich habe mich entschlossen, diesen IIR Filter zu verwenden, aber dieser Filter wird nicht als Standard LowPass Filter verwendet, da ich die Zählerwerte durchschnittlich vergleichen und sie vergleichen muss, um Änderungen in einem bestimmten Bereich zu erkennen. Da diese Werte von sehr unterschiedlichen Dimensionen je nach Hardware abhängen, wollte ich einen Durchschnitt nehmen, um auf diese Hardware-spezifischen Änderungen automatisch reagieren zu können. Ndash sensslen Wenn Sie mit der Beschränkung einer Macht von zwei Anzahl von Gegenständen zu durchschnittlich (dh 2,4,8,16,32 usw.) leben können, dann kann die Kluft einfach und effizient auf einem getan werden Low-Performance-Mikro mit keine dedizierten Divide, weil es als Bit-Shift durchgeführt werden kann. Jede Schicht rechts ist eine Potenz von zwei zB: Das OP dachte, er habe zwei Probleme, die sich in einem PIC16 und Speicher für seinen Ringpuffer teilen. Diese Antwort zeigt, dass die Teilung nicht schwierig ist. Zugegeben, es adressiert nicht das Speicherproblem, aber das SE-System erlaubt teilweise Antworten, und Benutzer können etwas von jeder Antwort für sich selbst nehmen oder sogar bearbeiten und kombinieren other39s Antworten. Da einige der anderen Antworten eine Aufteilungsoperation erfordern, sind sie ähnlich unvollständig, da sie nicht zeigen, wie man dies effizient auf einem PIC16 erreichen kann. Ndash Martin Apr 20 12 at 13:01 Es gibt eine Antwort für eine echte gleitende durchschnittliche Filter (aka boxcar Filter) mit weniger Speicherbedarf, wenn Sie es nicht dagegen tun, Downsampling. Es heißt ein kaskadierter Integrator-Kamm-Filter (CIC). Die Idee ist, dass Sie einen Integrator haben, den Sie Unterschiede über einen Zeitraum nehmen, und das Schlüssel speichersparendes Gerät ist, dass durch Downsampling, müssen Sie nicht jeden Wert des Integrators zu speichern. Es kann mit dem folgenden Pseudocode implementiert werden: Ihre effektive gleitende durchschnittliche Länge ist decimationFactorstatesize, aber Sie müssen nur umzustandsmuster zu halten. Offensichtlich können Sie eine bessere Leistung erzielen, wenn Ihr stateize und decimationFactor Potenzen von 2 sind, so dass die Division und Restbetreiber durch Verschiebungen und Masken ersetzt werden. Postscript: Ich bin einverstanden mit Olin, dass Sie immer einfache IIR-Filter vor einem gleitenden durchschnittlichen Filter beachten sollten. Wenn Sie nicht die Frequenznulls eines Boxcar Filters benötigen, wird ein 1-poliger oder 2-poliger Tiefpassfilter wahrscheinlich gut funktionieren. Auf der anderen Seite, wenn Sie für die Zwecke der Dezimierung filtern (wobei ein High-Sample-Rate-Input und Mittelwertbildung für die Verwendung durch einen Low-Rate-Prozess) dann ein CIC-Filter kann genau das, was Sie suchen. (Vor allem, wenn Sie stateize1 verwenden und den Ringpuffer insgesamt mit nur einem vorherigen Integrator-Wert vermeiden können). Hierbei handelt es sich um eine eingehende Analyse der Mathematik hinter dem ersten Auftrags-IIR-Filter, den Olin Lathrop bereits auf der Digital Signal Processing Stack Exchange beschrieben hat (Enthält viele schöne Bilder.) Die Gleichung für diesen IIR-Filter ist: Dies kann mit nur Integern und keine Teilung mit dem folgenden Code implementiert werden (könnte einige Debugging, wie ich aus dem Speicher war.) Dieser Filter nähert sich einem gleitenden Durchschnitt von Die letzten K-Samples durch Setzen des Wertes von alpha auf 1K. Führen Sie dies im vorherigen Code durch, indem Sie BITS auf LOG2 (K) definieren, dh für K 16 gesetzt BITS bis 4, für K 4 gesetzt BITS bis 2, etc. (Ill überprüfen Sie den hier aufgeführten Code, sobald ich eine Änderung bekomme und Beantworten Sie diese Antwort, wenn nötig.) Beantwortet Jun 23 12 um 4:04 Heres ein einpoliger Tiefpassfilter (gleitender Durchschnitt mit Cutoff-Frequenz CutoffFrequenz). Sehr einfach, sehr schnell, funktioniert super und fast kein Speicher oben. Hinweis: Alle Variablen haben Umfang über die Filterfunktion hinaus, mit Ausnahme der übergebenen newInput Hinweis: Dies ist ein einstufiger Filter. Mehrere Stufen können zusammenkaskadiert werden, um die Schärfe des Filters zu erhöhen. Wenn Sie mehr als eine Stufe verwenden, müssen Sie den DecayFactor (bezogen auf die Cutoff-Frequency) anpassen, um zu kompensieren. Und offensichtlich alles, was Sie brauchen, ist die beiden Linien irgendwo platziert, sie brauchen nicht ihre eigene Funktion. Dieser Filter hat eine Rampenzeit, bevor der gleitende Mittelwert des Eingangssignals entspricht. Wenn Sie diese Rampenzeit umgehen müssen, können Sie MovingAverage einfach auf den ersten Wert von newInput anstelle von 0 initialisieren und hoffen, dass der erste newInput kein Ausreißer ist. (CutoffFrequencySampleRate) hat einen Bereich zwischen 0 und 0,5. DecayFactor ist ein Wert zwischen 0 und 1, in der Regel in der Nähe von 1. Single-Präzision Schwimmer sind gut genug für die meisten Dinge, ich bevorzuge einfach Doppelzimmer. Wenn du mit Ganzzahlen haften musst, kannst du DecayFactor und Amplitude Factor in gebrochene Ganzzahlen umwandeln, in denen der Zähler als Integer gespeichert ist und der Nenner eine ganzzahlige Potenz von 2 ist (also kannst du dich nach rechts verschieben Nenner anstatt sich während der Filterschleife zu teilen). Zum Beispiel, wenn DecayFactor 0,99, und du willst ganze Zahlen verwenden, kannst du DecayFactor 0,99 65536 64881 einstellen. Und dann, wenn du dich von DecayFactor in deiner Filterschleife vermehrst, verschiebst du einfach das Ergebnis 16. Für weitere Informationen dazu ein exzellentes Buch thats Online, Kapitel 19 auf rekursive Filter: dspguidech19.htm PS Für das Moving Average-Paradigma, ein anderer Ansatz zur Einstellung DecayFactor und AmplitudeFactor, die möglicherweise mehr relevant für Ihre Bedürfnisse, sagen wir, dass Sie wollen die vorherigen, etwa 6 Punkte gemittelt zusammen, tun es diskret, youd fügen Sie 6 Elemente und teilen durch 6, so Sie können den AmplitudeFactor auf 16 und DecayFactor auf (1.0 - AmplitudeFactor) einstellen. Antwortete am 14. Mai 12 um 22:55 Alle anderen haben sich gründlich über den Nutzen von IIR vs. FIR und auf Power-of-Two Division kommentiert. Id nur gerne einige Implementierungsdetails zu geben. Die unten funktioniert gut auf kleinen Mikrocontrollern ohne FPU. Theres keine Multiplikation, und wenn Sie N eine Macht von zwei halten, ist die ganze Teilung Single-Cycle-Bit-Shifting. Grundlegende FIR-Ringpuffer: Halten Sie einen laufenden Puffer der letzten N-Werte und eine laufende SUM aller Werte im Puffer. Jedes Mal, wenn ein neues Sample hereinkommt, subtrahieren Sie den ältesten Wert im Puffer von SUM, ersetzen ihn mit dem neuen Sample, fügen Sie das neue Sample zu SUM hinzu und geben Sie SUMN aus. Modifizierter IIR-Ringpuffer: Halten Sie einen laufenden SUM der letzten N-Werte. Jedes Mal, wenn ein neues Sample kommt, SUM - SUMN, fügen Sie das neue Sample hinzu und geben Sie SUMN aus. Antwortete am 28. August 13 um 13:45 Wenn ich dich gerade richtig lese, beschreibst du einen ersten IIR-Filter, der den Wert, den du subtrahierst, nicht auf den ältesten Wert, der herausfällt, sondern stattdessen der Durchschnitt der vorherigen Werte ist. Erstklassige IIR-Filter können sicherlich nützlich sein, aber ich bin mir nicht sicher, was du meinst, wenn du vorschreibst, dass die Ausgabe für alle periodischen Signale gleich ist. Bei einer Abtastrate von 10 kHz liefert die Zuführung einer 100-Hz-Rechteckwelle in einen 20-stufigen Kastenfilter ein Signal, das für 20 Proben gleichmäßig ansteigt, für 30 sitzt, für 20 Proben gleichmäßig sinkt und für 30 niedrig sitzt. Eine erste Ordnung IIR-Filter Ndash supercat 28. August 13 um 15:31 wird eine Welle, die scharf beginnt zu steigen und allmählich aus der Nähe (aber nicht auf) die Eingabe Maximum, dann scharf beginnt zu fallen und allmählich aus der Nähe (aber nicht auf) der Eingabe Minimum. Sehr unterschiedliches Verhalten Ndash supercat Eine Frage ist, dass ein einfacher gleitender Durchschnitt kann oder nicht nützlich sein. Mit einem IIR-Filter kannst du einen schönen Filter mit relativ wenigen Berechnungen bekommen. Die FIR, die Sie beschreiben, kann Ihnen nur ein Rechteck in der Zeit geben - ein sinc in freq - und Sie können die Seitenkeulen verwalten. Es lohnt sich, ein paar ganzzahlige Multiplikatoren zu werfen, um es zu einem schönen symmetrischen, abstimmbaren FIR zu machen, wenn man die Uhrzeiger ersparen kann. Ndash Scott Seidman Aug 29 13 bei 13:50 ScottSeidman: Keine Notwendigkeit für Multiplikationen, wenn man einfach jede Stufe der FIR entweder den Mittelwert der Eingabe auf diese Stufe und ihren vorherigen gespeicherten Wert ausgibt und dann die Eingabe speichern (falls man hat Der numerische Bereich, man könnte die Summe eher als Durchschnitt verwenden). Ob das besser als ein Kastenfilter ist, hängt von der Anwendung ab (die Sprungantwort eines Kastenfilters mit einer Gesamtverzögerung von 1ms, zum Beispiel, wird eine böse d2dt Spitze haben, wenn die Eingangsänderung und wieder 1ms später, aber das Minimum haben wird Möglich ddt für einen Filter mit insgesamt 1ms Verzögerung). Ndash supercat Als mikeselectricstuff sagte, wenn Sie wirklich brauchen, um Ihren Speicherbedarf zu reduzieren, und Sie dont mind Ihre Impulsantwort ist ein exponentielles (anstelle eines rechteckigen Pulses), würde ich für einen exponentiellen gleitenden durchschnittlichen Filter gehen . Ich benutze sie ausgiebig. Bei dieser Art von Filter brauchst du keinen Puffer. Sie müssen nicht n hintere Proben speichern. Nur einer. Also, Ihre Speicheranforderungen werden durch einen Faktor von N reduziert. Auch brauchst du keine Teilung dafür. Nur Multiplikationen Wenn Sie Zugriff auf Gleitkomma-Arithmetik haben, verwenden Sie Gleitkomma-Multiplikationen. Andernfalls machen ganzzahlige Multiplikationen und verschieben nach rechts. Allerdings sind wir im Jahr 2012, und ich würde Ihnen empfehlen, Compiler (und MCUs) zu verwenden, mit denen Sie mit Gleitkommazahlen arbeiten können. Abgesehen davon, dass mehr Speicher effizienter und schneller (Sie müssen nicht Elemente in jedem kreisförmigen Puffer zu aktualisieren), würde ich sagen, es ist auch natürlicher. Denn eine exponentielle Impulsantwort passt besser der Art, wie sich die Natur verhält, in den meisten Fällen. Beantwortet Apr 20 12 at 9:59 Ein Problem mit dem IIR-Filter, der fast von Olin und Supercat berührt wird, aber anscheinend von anderen nicht beachtet wird, ist, dass die Abrundung einige Ungenauigkeiten (und potenziell Biastruncation) einführt. Unter der Annahme, dass N eine Potenz von zwei ist und nur ganzzahlige Arithmetik verwendet wird, beseitigt das Verschiebungsrecht systematisch die LSBs der neuen Probe. Das heißt, wie lange die Serie jemals sein könnte, der Durchschnitt wird diese niemals berücksichtigen. Nehmen wir z. B. eine langsam abnehmende Reihe an (8,8,8, 8,7,7,7,7,7,6,6) und nehmen an, daß der Durchschnitt in der Tat 8 am Anfang ist. Die erste 7 Probe wird den Durchschnitt auf 7 bringen, was auch immer die Filterstärke. Nur für eine Probe. Gleiche Geschichte für 6, etc. Jetzt an das Gegenteil denken. Die serie geht nach oben Der Durchschnitt wird auf 7 für immer bleiben, bis die Probe groß genug ist, um es zu ändern. Natürlich können Sie für die Vorspannung korrigieren, indem Sie 12N2 hinzufügen, aber das wird nicht wirklich das Präzisionsproblem lösen. In diesem Fall bleibt die abnehmende Reihe für immer bei 8, bis die Probe 8-12 (N2) ist. Für N4 zum Beispiel wird jede Probe über Null den Durchschnitt unverändert halten. Ich glaube, eine Lösung dafür würde bedeuten, einen Akkumulator der verlorenen LSBs zu halten. Aber ich habe es nicht weit genug gemacht, um Code bereit zu haben, und ich bin nicht sicher, dass es nicht schaden würde die IIR Macht in einigen anderen Fällen von Serien (zum Beispiel, ob 7,9,7,9 würde durchschnittlich 8 dann). Olin, deine zweistufige Kaskade braucht auch eine Erklärung. Meinst du mit zwei durchschnittlichen Werten, mit dem Ergebnis der ersten in die Sekunde in jeder Iteration eingegeben. Was ist der Vorteil von diesem Ich habe einen Datensatz für Preis des Tickers an der Börse: Zeit - Preis. Aber Intervalle zwischen Datenpunkten sind nicht gleich - von 1 bis 2 Minuten. Was ist die beste Praxis, um den gleitenden Durchschnitt für einen solchen Fall zu berechnen Wie man es in Matlab macht, neige ich zu denken, dass die Gewichte der Punkte von dem Zeitintervall abhängen sollten, das zuletzt seit dem vorherigen Punkt war. Haben wir Funktion in Matlab zu berechnen gleitenden Durchschnitt mit benutzerdefinierten Gewichte der Punkte gefragt Jul 30 14 um 19:01 Meine Antwort ist ganz ähnlich wie Lakeshs eins. Aber ich werde dein Problem in Bezug auf die Interpolation denken. Zuerst ist ein gleitender Durchschnitt oder ein Zeitmittel einer Funktion das Integral davon über einen Zeitraum, geteilt durch die Zeitlänge. In Ihrem Fall kann das Integral als Summe gesehen werden, da die meisten in jeder Minute der Funktionswert gleich ist. Ihre Daten haben jedoch ungleiche Zeitintervalle. Dies kann als fehlende Punkte der Funktion gesehen werden. Lassen Sie mich erklären: für jede Minute x. Sie sollten einen Preis f (x) haben. Aber für einige Male sagen x5. F (x) ist undefiniert. Eine der Weisen, die Sie von den Diskontinuitäten einer Funktion loswerden können, ist die Interpolation - weisen Sie den fehlenden Punkten einen gewissen Wert zu, nach einigen Berechnungsregeln. Der einfachste Algorithmus hält den vorherigen Wert, der im Wesentlichen lakeshs Idee ist. Aber der Vorteil des Denkens in diesem Aspekt liegt in der Fähigkeit, Ihre Daten genauer zu machen. Es kann sich nicht auf einen Börsenfall bewerben, sollte aber im Allgemeinen so sein, wie etwa eine Temperaturmessung oder Windgeschwindigkeit, die über die Zeit reibungslos veränderbar ist (anstatt 2 Minuten konstant zu halten und sich plötzlich in einer Sekunde zu ändern). Sie können verschiedene Interpolationstechniken verwenden, um die Daten zu polieren. Polieren in diesem Sinne ist ok, weil man in irgendeiner Weise das Konzept des Durchschnitts verwenden muss. Eine gute Interpolation sollte die Daten einem Modell näher bringen, das sich bewährt hat, mit dem eigentlichen Problem zu arbeiten. CODE - Ich setze das max Intervall auf 5 Minuten, um einen großen Unterschied zwischen den beiden Methoden zu zeigen. Es hängt von Ihrer Beobachtung und Erfahrung ab, um zu entscheiden, welche (oder jede andere) Methode das Beste ist, um die Vergangenheit vorherzusagen. Hinweis: undefinierte Punkte sollten von NaN präsentiert werden. Aber -1 scheint leichter zu spielen. Antwortete Jul 30 14 um 20:40


No comments:

Post a Comment