Die Wissenschaftler und Ingenieure Leitfaden für digitale Signalverarbeitung Von Steven W. Smith, Ph. D. Ein enormer Vorteil des gleitenden Mittelfilters besteht darin, dass er mit einem sehr schnellen Algorithmus implementiert werden kann. Um diesen Algorithmus zu verstehen, stellen Sie sich vor, ein Eingangssignal, x, durch ein siebenpunktiges gleitendes Durchschnittsfilter zu führen, um ein Ausgangssignal y zu bilden. Nun wird untersucht, wie zwei benachbarte Ausgangspunkte y 50 und y 51 berechnet werden: Es sind fast dieselben Berechnungspunkte x 48 bis x 53 für y 50 und für y 51 zu addieren. Wenn y 50 bereits berechnet wurde Ist der effizienteste Weg zum Berechnen von y 51: Nachdem y 51 unter Verwendung von y 50 gefunden worden ist, kann y 52 aus der Probe y 51 und so weiter berechnet werden. Nachdem der erste Punkt in y berechnet ist, 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 der Eingabe und vorher berechnete Punkte von der Ausgabe. Dies wird als rekursive Gleichung bezeichnet, dh das Ergebnis einer Berechnung wird in zukünftigen Berechnungen verwendet. (Der Begriff rekursive hat auch andere Bedeutungen, vor allem in der Informatik). Kapitel 19 behandelt eine Vielzahl von rekursiven Filtern genauer. Beachten Sie, dass sich das gleitende, durchschnittliche rekursive Filter sehr von den typischen rekursiven Filtern unterscheidet. Insbesondere haben die meisten rekursiven Filter eine unendlich lange Impulsantwort (IIR), bestehend aus Sinusoiden und Exponentialen. Die Impulsantwort des gleitenden Mittelwertes ist ein Rechteckimpuls (endliche Impulsantwort oder FIR). Dieser Algorithmus ist aus mehreren Gründen schneller als andere digitale Filter. Erstens gibt es nur zwei Berechnungen pro Punkt, unabhängig von der Länge des Filterkerns. Zweitens sind Addition und Subtraktion die einzigen mathematischen Operationen, während die meisten digitalen Filter eine zeitaufwändige Multiplikation erfordern. Drittens ist das Indexierungsschema sehr einfach. Jeder Index in Gl. 15-3 durch Addieren oder Subtrahieren von ganzzahligen Konstanten gefunden, die berechnet werden können, bevor die Filterung beginnt (d. h. p und q). Weiter kann der gesamte Algorithmus mit Ganzzahldarstellung durchgeführt werden. Abhängig von der verwendeten Hardware können ganze Zahlen mehr als eine Größenordnung schneller als der Gleitpunkt sein. Überraschenderweise arbeitet die Ganzzahldarstellung besser als der Gleitkommawert mit diesem Algorithmus, zusätzlich zu dem, was schneller ist. Der Rundungsfehler der Gleitpunktarithmetik kann zu unerwarteten Ergebnissen führen, wenn Sie nicht vorsichtig sind. Stellen Sie sich zum Beispiel ein 10.000 Probensignal vor, das mit diesem Verfahren gefiltert wird. Der letzte Abtastwert im gefilterten Signal enthält den akkumulierten Fehler von 10.000 Additionen und 10.000 Subtraktionen. Dies erscheint im Ausgangssignal als Driftversatz. Integers dont haben dieses Problem, weil es keine Round-off-Fehler in der Arithmetik. Wenn Sie mit diesem Algorithmus Fließkommazahlen verwenden müssen, zeigt das Programm in Tabelle 15-2, wie ein Doppelpräzisionsakkumulator verwendet wird, um diesen Drift zu eliminieren. FIR-Filter, IIR-Filter und die lineare konstante Koeffizientendifferenzgleichung Causal Moving Average (FIR) Filter Weve diskutierte Systeme, bei denen jede Abtastung der Ausgabe eine gewichtete Summe (gewisser) der Abtastwerte des Eingangs ist. Nehmen wir ein kausal gewichtetes Summensystem, wobei Kausal bedeutet, dass ein gegebenes Ausgangssample nur von dem aktuellen Eingangssample und anderen Eingängen früher in der Sequenz abhängt. Weder lineare Systeme überhaupt noch endliche Impulsantwortsysteme müssen kausal sein. Jedoch ist Kausalität bequem für eine Art Analyse, die bald erforschen würde. Wenn wir die Eingaben als Werte eines Vektors x symbolisieren. Und die Ausgänge als entsprechende Werte eines Vektors y. Dann kann ein solches System beschrieben werden, bei dem die b-Werte ein Gewicht sind, das auf die aktuellen und früheren Eingangsabtastwerte angewendet wird, um die aktuelle Ausgangsabtastung zu erhalten. Wir können uns den Ausdruck als Gleichung vorstellen, wobei das Gleichheitszeichen gleich ist oder als Verfahrensanweisung mit dem Gleichheitszeichen Bedeutung Zuordnung. Schreiben wir den Ausdruck für jeden Ausgangsprobe als MATLAB-Schleife von Zuweisungsanweisungen, wobei x ein N-Längenvektor von Eingangsabtastwerten ist und b ein M-Längenvektor von Gewichten ist. Um mit dem Spezialfall am Anfang umzugehen, werden wir x in einen längeren Vektor xhat einbetten, dessen erste M-1 Abtastwerte Null sind. Wir werden die gewichtete Summe für jedes y (n) als inneres Produkt schreiben und einige Manipulationen der Eingänge (wie Reversieren b) zu diesem Zweck durchführen. Diese Art von System wird oft als ein gleitender Durchschnitt Filter, aus offensichtlichen Gründen. Aus unseren früheren Diskussionen sollte klar sein, dass ein solches System linear und verschiebungsinvariant ist. Natürlich wäre es viel schneller, die MATLAB-Convolution-Funktion conv () anstelle unseres mafilt () zu verwenden. Anstatt die ersten M-1 Abtastwerte des Eingangs null zu betrachten, könnten wir sie als dieselben wie die letzten M-1 Abtastwerte betrachten. Dies ist die gleiche wie die Behandlung der Eingabe als periodisch. Nun verwenden Sie cmafilt () als den Namen der Funktion, eine kleine Änderung der früheren mafilt () - Funktion. Bei der Bestimmung der Impulsantwort eines Systems gibt es gewöhnlich keinen Unterschied zwischen diesen beiden, da alle nicht initialen Abtastungen der Eingabe Null sind: Da ein System dieser Art linear und schichtinvariant ist, wissen wir, dass seine Wirkung auf irgendwelche Sinusoid wird nur zu skalieren und verschieben. Hier ist es wichtig, dass wir die kreisförmige Version verwenden. Die kreisförmig gefaltete Version wird verschoben und skaliert, während die Version mit gewöhnlicher Faltung zu Beginn verzerrt ist. Lets sehen, was die exakte Skalierung und Verschiebung ist mit einem fft: Beide Eingang und Ausgang haben Amplitude nur bei Frequenzen 1 und -1, wie es sein sollte, da der Eingang war ein Sinus und das System war linear. Die Ausgangswerte sind um ein Verhältnis von 10,6251 / 8 1,3281 größer. Das ist der Gewinn des Systems. Was ist mit der Phase Wir müssen nur schauen, wo die Amplitude ungleich Null ist: Der Eingang hat eine Phase von pi / 2, wie wir wollten. Die Ausgangsphase wird um eine zusätzliche 1,0594 (mit umgekehrtem Vorzeichen für die negative Frequenz) oder etwa 1/6 eines Zyklus nach rechts verschoben, wie wir im Diagramm sehen können. Nun können wir eine Sinuskurve mit der gleichen Frequenz (1) ausprobieren, aber statt der Amplitude 1 und der Phase pi / 2 versuchen wir die Amplitude 1.5 und die Phase 0. Wir wissen, dass nur Frequenz 1 und -1 Amplitude ungleich Null haben (15.9377 / 12.0000) ist 1.3281 - und für die Phase ist es wieder um 1.0594 verschoben. Wenn diese Beispiele typisch sind, können wir die Wirkung unseres Systems vorhersagen (Impulsantwort .1 .2 .3 .4 .5) auf jedem Sinus mit der Frequenz 1 - wird die Amplitude um den Faktor 1,3281 erhöht und die (positive Frequenz) Phase um 1,0594 verschoben. Wir können die Wirkung dieses Systems auf Sinusoide anderer Frequenzen mit denselben Methoden berechnen. Aber es gibt einen viel einfacheren Weg, und eine, die den allgemeinen Punkt. Da die (zirkuläre) Faltung im Zeitbereich eine Multiplikation im Frequenzbereich bedeutet, folgt daraus, daß mit anderen Worten die DFT der Impulsantwort das Verhältnis der DFT des Ausgangs zu der DFT des Eingangs ist. In dieser Beziehung sind die DFT-Koeffizienten komplexe Zahlen. Wegen der abs (c1 / c2) abs (c1) / abs (c2) für alle komplexen Zahlen c1, c2 gibt diese Gleichung an, dass das Amplitudenspektrum der Impulsantwort immer das Verhältnis des Amplitudenspektrums der Ausgabe zu diesem ist Des Eingangs. Im Falle des Phasenspektrums ist der Winkel (c1 / c2) - Winkel (c1) - Winkel (c2) für alle c1, c2 (mit der Maßgabe, dass sich um n2pi unterschiedliche Phasen unterscheiden). Daher wird das Phasenspektrum der Impulsantwort immer die Differenz zwischen den Phasenspektren des Ausgangs und dem Eingang sein (mit welchen Korrekturen um 2pi benötigt werden, um das Ergebnis zwischen - pi und pi zu halten). Wir können die Phaseneffekte deutlicher sehen, wenn wir die Darstellung der Phase entpacken, d. H. Wenn wir verschiedene Vielfache von 2pi hinzufügen, um die Sprünge zu minimieren, die durch die periodische Natur der Funktion angle () erzeugt werden. Obwohl die Amplitude und die Phase üblicherweise für grafische und sogar tabellarische Darstellungen verwendet werden, sind die komplexen Fourier-Koeffizienten algebraisch nützlicher, da sie eine intuitive Möglichkeit sind, über die Auswirkungen eines Systems auf die verschiedenen Frequenzkomponenten seiner Eingabe nachzudenken Der einfache Ausdruck der Beziehung Der allgemeine Ansatz, den wir soeben gesehen haben, wird mit beliebigen Filtern des skizzierten Typs arbeiten, wobei jeder Ausgangssample eine gewichtete Summe eines Satzes von Eingangsabtastwerten ist. Wie bereits erwähnt, werden diese oft als Finite-Impulse-Response-Filter bezeichnet, da die Impulsantwort von Finite-Size - oder manchmal Moving-Average-Filtern ist. Wir können die Frequenzantwortcharakteristiken eines solchen Filters aus der FFT seiner Impulsantwort bestimmen, und wir können auch neue Filter mit gewünschten Eigenschaften durch IFFT aus einer Spezifikation des Frequenzgangs entwerfen. Autoregressive (IIR) - Filter Es wäre wenig Sinn, mit Namen für FIR-Filter, es sei denn, es gab eine andere Art von ihnen zu unterscheiden, und so diejenigen, die Pragmatik studiert haben, werden nicht überrascht sein, zu erfahren, dass es tatsächlich eine andere große Art Des linearen zeitinvarianten Filters. Diese Filter werden manchmal rekursiv genannt, weil der Wert der vorherigen Ausgaben (sowie vorhergehende Eingaben) von Bedeutung ist, obwohl die Algorithmen im Allgemeinen unter Verwendung von iterativen Konstrukten geschrieben werden. Sie werden auch als Infinite Impulse Response (IIR) - Filter bezeichnet, weil im Allgemeinen ihre Reaktion auf einen Impuls für immer weitergeht. Sie werden auch manchmal als autoregressive Filter bezeichnet, da man die Koeffizienten als das Ergebnis einer linearen Regression verstehen kann, um Signalwerte als Funktion früherer Signalwerte auszudrücken. Die Beziehung von FIR - und IIR-Filtern ist klar in einer linearen konstanten Koeffizienten-Differenzengleichung zu sehen, d. h. eine gewichtete Summe von Ausgaben gleich einer gewichteten Summe von Eingängen zu setzen. Dies ist wie die Gleichung, die wir früher für das kausale FIR-Filter angegeben haben, außer dass wir neben der gewichteten Summe von Eingängen auch eine gewichtete Summe von Ausgängen haben. Wenn wir dies als eine Vorgehensweise zur Erzeugung von Ausgangssamples betrachten wollen, müssen wir die Gleichung neu anordnen, um einen Ausdruck für den aktuellen Ausgabeprobe y (n) zu erhalten, wobei die Konvention angenommen wird, dass a (1) 1 (z Und bs) können wir den 1 / a (1) Term loswerden: y (n) b (1) x (n) b (2) x (n-1). B (Nb1) x (n-nb) - a (2) y (n-1) -. - a (Na1) y (n-na) Wenn alle anderen a (n) als a (1) Null sind, reduziert dies auf unseren alten Freund das kausale FIR-Filter. Dies ist der allgemeine Fall eines (kausalen) LTI-Filters und wird durch den MATLAB-Funktionsfilter implementiert. Es sei der Fall betrachtet, bei dem die b Koeffizienten außer b (1) null sind (anstelle des FIR-Falles, bei dem a (n) null ist): In diesem Fall wird der aktuelle Ausgabeprobe y (n) als a berechnet Gewichtete Kombination der aktuellen Eingangsabtastung x (n) und der vorhergehenden Ausgangsabtastwerte y (n - 1), y (n - 2) usw. Um eine Vorstellung davon zu erhalten, was mit solchen Filtern geschieht, Das heißt, der Stromausgangsabtastwert ist die Summe der aktuellen Eingangsabtastung und der Hälfte der vorhergehenden Ausgangsabtastung. Nun nehmen einen Eingangsimpuls durch ein paar Zeitschritte, eine zu einer Zeit. Es sollte an diesem Punkt klar sein, daß wir leicht einen Ausdruck für den n-ten Ausgabe-Abtastwert schreiben können: er ist nur (Wenn MATLAB von 0 gezählt wird, wäre dies einfach 0,5 n). Da das, was wir berechnen, die Impulsantwort des Systems ist, haben wir durch Beispiel gezeigt, daß die Impulsantwort tatsächlich unendlich viele Proben ungleich Null haben kann. Um diesen trivialen Filter erster Ordnung in MATLAB zu implementieren, könnten wir Filter verwenden. Der Aufruf sieht folgendermaßen aus: und das Ergebnis ist: Ist dieses Geschäft wirklich noch linear? Wir können dies empirisch betrachten: Für einen allgemeineren Ansatz betrachten wir den Wert eines Ausgabebeispiels y (n). Durch sukzessives Ersetzen können wir dies so schreiben: Dies ist genau wie unser alter Freund die Faltungssummenform eines FIR-Filters mit der Impulsantwort, die durch den Ausdruck .5k geliefert wird. Und die Länge der Impulsantwort ist unendlich. Es gelten also die gleichen Argumente, die wir zeigen, dass FIR-Filter linear waren. Bisher scheint dies viel Aufhebens um nicht viel zu sein. Was ist diese ganze Untersuchung gut für gut beantworten diese Frage in Stufen, beginnend mit einem Beispiel. Es ist nicht eine große Überraschung, dass wir berechnen können eine Stichprobe Exponential durch rekursive Multiplikation. Betrachten wir einen rekursiven Filter, der etwas weniger offensichtlich macht. Dieses Mal machen wir es zu einem Filter zweiter Ordnung, so daß der Aufruf zum Filter die Form Lets hat, die den zweiten Ausgangskoeffizienten a2 auf -2cos (2pi / 40) und den dritten Ausgangskoeffizienten a3 auf 1 setzen und anschauen Die Impulsantwort. Nicht sehr nützlich als Filter tatsächlich, aber es erzeugt eine abgetastete Sinuswelle (aus einem Impuls) mit drei Multiplikations-Additionen pro Probe Um zu verstehen, wie und warum es das tut und wie rekursive Filter entworfen und analysiert werden können in Der allgemeinere Fall, müssen wir zurückgehen und einen Blick auf einige andere Eigenschaften von komplexen Zahlen, auf dem Weg zum Verständnis der z-transform. Recursive Moving Average Filter bull quot quot (0) 0 bull 2 160160160160 Der gleitende Durchschnitt Filter ist Ein FIR-Filter der Länge N mit allen Anzapfungen, die gleich (1 / N) gesetzt sind.160 Sein bekanntes für lausige Frequenztrennung, aber ausgezeichnetes Zeitverhalten - in diesem Sinne, es heraus-Bessels ein Bessel-Filter.160 Sie können es mit implementieren SigmaStudios FIR-Block, wie hier beschrieben: Je länger der Filter, desto mehr Glättung - aber der Standard-FIR-Filter-Algorithmus nutzt viele Anweisungen für riesige Filter, weil er für jeden Tap die Koeffizienten multiplizieren muss.160 Dies ist ein Abfall bei allen Koeffizienten Sind die gleichen.160 Wie Kapitel 15 von Steven W. Smiths Buch zeigt, können Sie einen gleitenden Durchschnitt Filter mit einer rekursiven Technik, die einen Hahn vor und nach einer (N-1) Größenverzögerung.160 Ein solcher Filter erscheint unten Als Teil einer Testschaltung mit Signalquelle und einem Bessel-Filter zum Vergleich: 160160160160 Koeffizienten werden am Eingang zum Single-Gain-Block gezogen.160 Das vorliegende Sample addiert den Ausgang, wenn es in die Verzögerung eintritt Der Addierer mit der Rückkopplung akkumuliert diese Additionen und Subtraktionen, um den Ausgang zu bilden - dies tut etwas, das trivial in C ist, aber ansonsten ein Schmerz in der GUI ist.160 Obwohl eine rekursive Technik verwendet wird, bleibt der Filter a True FIR-Filter - die Länge der Impulsantwort wird nur durch Ihre Verzögerung eingestellt. 160160160160 Meine Testeingabe ist eine Rechteckwelle mit addiertem Rauschen.160 Gefilterte Ergebnisse erscheinen als obere Spur in beiden Fotos - Zuerst der gleitende Mittelwertfilter: Der Bessel-Filter: 160160160160 Der gleitende Mittelfilter ermöglicht mehr Rauschen, (Die lineare Phase) .160 Das Abhören der beiden Wellenformen mit Kopfhörern zeigt ein ähnliches Ergebnis - mehr Rauschen mit dem gleitenden Mittelfilter, aber die Charakteristik Klang einer Rechteckwelle kommt durch. 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 erhält, der größer oder gleich dem Zählwert ist, 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 der restlichen Summe machen. Ausgezeichnet Jomit Vaghela 6-Mar-07 20:00 Ich mochte, was Sie sagten, dass kleine Jobs schnell zu großen Jobs werden. Denken an Optimierung während Codierung ist eine gute Praxis. Vielen Dank Mike DiRenzo 5-Mar-07 15:26 Dies ist das erste Mal, dass ich auf einen Ihrer Artikel geantwortet haben. Ich bin aber ein sehr begeisterter Leser. Während des Studiums musste ich gewichtete gleitende Durchschnitte und einfache auch berechnen. Heck, hatte ich sogar einige meiner eigenen gleitenden durchschnittlichen Algorithmen in einer benutzerdefinierten ERP-Implementierung vor einiger Zeit auf der Grundlage einiger der gleichen Formeln, die ich in Operations 101 gelernt zu schaffen. Aber diese Umsetzung, mit Generika, weit überwiegt alles in Bezug auf die Optimierung, Einfachheit und verdammt richtige Coolness. Vielen Dank dafür. Einer Ihrer vielen Fans, In Ruhe und Stille, die Wahrheit wird klar. Ewma gobgob 5-Mar-07 4:30 Wenn Ihr versuchen, einen einfachen gleitenden Durchschnitt zu berechnen, müssen Sie eine Sammlung, die sehr komplex ist für eine solche einfache Aufgabe zu halten. Wie wäre es mit einem ewma Seine 2 Zeilen Code, viel einfacher. (1-alpha) newValue Re: ewma Marc Clifton 5-Mar-07 4:47 Wie wäre es mit einem ewma Interessante Idee. Für Leser, die nicht wissen, was ein ewma ist, ist es ein exponentiell gewichtet Moving Average. Die Leute sind nur notorisch unmöglich. --DavidCrow Theres Keine Entschuldigung für nicht kommentieren Ihren Code. - John Simmons / outlaw Programmierer Leute, die sagen, dass sie ihren Code später umgestalten, um es gut zu machen nicht verstehen Refactoring, noch die Kunst und Handwerk der Programmierung. - Josh Smith Re: ewma pwasser 5-Mar-07 12:21 Eine Schätzung des gleitenden Mittelwertes, wenn die Behältergröße für den gleitenden Durchschnitt n ist, kann erhalten werden durch: NewAverage (((n-1) OldAverage) newValue) / n Dies funktioniert, sobald der Behälter voll ist (Probennummer n). Der Behälter, der teilweise voll ist, wird häufig behandelt, indem ein Samenwert für den anfänglichen gleitenden Durchschnitt (OldAverage) verwendet wird und dann diese Berechnung verwendet wird. Dies nimmt eine normale Verteilung der Werte etc. Sie waren beschäftigt Colin Angus Mackay 4-Mar-07 11:37 Posting zwei Artikel heute Abend. Große Arbeit Ich weiß nicht, wie Sie es tun. Ive erhielt ungefähr 4 oder 5 Artikel halb fertig und ich scheine nie, die Zeit zu finden, sie zu vollenden. Gut. Vielleicht, wenn ich aus der Lounge Id verwalten. Re: Sie waren beschäftigt Marc Clifton 4-Mar-07 13:25 Colin Angus Mackay hat geschrieben: Posting zwei Artikel heute Abend. Große Arbeit Dank schrieb ich eigentlich den Artikel auf den laufenden Durchschnitt und erkannte, dass die kreisförmige Liste tatsächlich ein wirklich guter Stand-alone-Artikel wäre. Plus, sie sind leichte Artikel. Ich kann sie ziemlich schnell wegdrehen. Sein gerade hartes, an nützliches aber einfaches Material zu denken. Stellt sich heraus, ich brauchte diese beiden Klassen sowieso. Die Leute sind nur notorisch unmöglich. --DavidCrow Theres Keine Entschuldigung für nicht kommentieren Ihren Code. - John Simmons / outlaw Programmierer Leute, die sagen, dass sie ihren Code später umgestalten, um es gut zu machen nicht verstehen Refactoring, noch die Kunst und Handwerk der Programmierung. - Josh Smith Re: Sie waren beschäftigt JeffPClark 8-Mar-07 0:07 Von dem, was Ive von Marc gelesen, hat er wahrscheinlich ein Programm, das ein Stück Code untersuchen und erklären kann, die komplizierten Details, dann veröffentlichen sie direkt zu Code Project . Jeff Clark Systems Architect JP Clark, INC. Columbus, Ohio Letzte Aktualisierung: 13-Oct-16 9:59 Allgemeine Nachrichten Vorschlag Frage Bug Antwort Joke Lob Rant Admin Verwenden Sie CtrlLeft / Right zu wechseln CtrlUp / Down zum Umschalten von Threads, CtrlShiftLeft / Right, um Seiten zu wechseln. 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 verarbeiten Ein Algorithmus, den ich schrieb, um den nächsten Peak vor einem Zeitpunkt zu finden. Meine Logik schlägt fehl, weil in meinem Beispiel oben 0.36 die wahre Spitze ist, aber mein Algorithmus würde rückwärts schauen und sehen die sehr letzte Zahl 0.25 als die Spitze, als theres eine Abnahme zu 0.24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus auf sie, die glätten sie ein wenig, so dass ich mehr lineare Werte. (Dh: Id wie meine Ergebnisse curvy, nicht jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich dies tun Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, gehe ich viel besser mit Code. Wie verarbeite ich Werte in meinem Array, die Anwendung einer exponentiellen gleitenden Durchschnittsberechnung, um sie herauszufordern, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Müssen Sie einige Zustand zu halten und Sie benötigen einen Tuning-Parameter. Dies erfordert eine kleine Klasse (vorausgesetzt, Sie verwenden Java 5 oder höher): Instantiate mit dem Decay-Parameter, die Sie wollen (kann Abstimmung sollte zwischen 0 und 1) und dann mit Average () zu filtern. Beim Lesen einer Seite auf einige mathematische Rekursion, alles, was Sie wirklich wissen müssen, wenn Sie es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Theyve einige andere Anmerkungen außerdem, die nicht helfen.) Jedoch ist die EMA ziemlich einfach, da Sie nur an einen alten Wert erinnern müssen, der keine komplizierten Zustandarrays erfordert. Beantwortet Feb 8 12 at 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn die Dinge einfach sein können (Wenn Sie mit einer neuen Sequenz beginnen, erhalten Sie einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz um ein bisschen durch Randeffekte springen, aber Sie erhalten diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass Sie die gleitende durchschnittliche Logik in die Mittelung einwickeln und experimentieren können, ohne den Rest des Programms zu viel zu stören. Ndash Donal Fellows Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu beantworten. 1) Wenn Ihr Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch. Es ist falsch, weil es eine monotone Zunahme oder Abnahme (das ist immer nach oben oder immer nach unten). Wenn Sie ALLE Ihre Daten nicht klassifizieren, sind Ihre Datenpunkte - wie Sie sie darstellen - nichtlinear. Wenn Sie wirklich den maximalen Wert zwischen zwei Zeitpunkten finden wollen, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie das Maximum dieses Unterarrays. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: vorstellen, dass ich die folgende Liste haben: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glätten, 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 könnte es Zeitraum drei oder vier gemacht haben, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um zu sehen, gleitende Durchschnitte bei der Arbeit ist, gehen Sie zu Google Finance, wählen Sie eine Aktie (versuchen Tesla Motors ziemlich volatil (TSLA)) und klicken Sie auf Technische Daten am unteren Rand des Diagramms. Wählen Sie Moving Average mit einer bestimmten Periode und Exponential gleitenden Durchschnitt, um ihre Differenzen zu vergleichen. Exponentielle gleitende Durchschnitt ist nur eine weitere Ausarbeitung dieser, aber gewichtet die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten auszugleichen. Bitte lesen Sie den Wikipedia-Eintrag. Also, dies ist eher ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu klein. Viel Glück. Wenn Sie Probleme mit der Mathematik haben, könnten Sie mit einem einfachen gleitenden Durchschnitt statt exponentiell gehen. Also die Ausgabe erhalten Sie die letzten x-Terme durch x geteilt werden. Ungetestetes Pseudocode: Beachten Sie, dass Sie die Anfangs - und Endteile der Daten behandeln müssen, da deutlich, dass Sie die letzten 5 Ausdrücke nicht durchschnittlich sind, wenn Sie auf Ihrem 2. Datenpunkt sind. Außerdem gibt es effizientere Methoden, diesen gleitenden Durchschnitt zu berechnen (Summe - älteste neueste), aber dies ist, um das Konzept von dem, was passiert ist zu bekommen. Beantwortet Feb 8 12 at 20:41
No comments:
Post a Comment