Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Samples zu implementieren. Ich habe festgestellt, dass ich ein bisschen optimieren kann, indem ich eine Fenstergröße, die eine Kraft von zwei, um Bit-Verschiebung statt zu teilen, aber Nicht brauchen einen Puffer wäre nett Gibt es eine Möglichkeit, ein neues gleitendes durchschnittliches Ergebnis nur als eine Funktion des alten Ergebnisses und der neuen Probe auszudrücken. Define ein Beispiel gleitenden Durchschnitt, über ein Fenster von 4 Samples zu sein. Add neue Probe eA Gleitender Durchschnitt kann rekursiv umgesetzt werden, aber für eine genaue Berechnung des gleitenden Mittelpunktes musst du dich an den ältesten Input-Sample in der Summe erinnern, dh der a in deinem Beispiel Für eine Länge N gleitenden Durchschnitt berechnen Sie, wo yn das Ausgangssignal und xn ist Ist das Eingangssignal Eq 1 kann rekursiv geschrieben werden. So müssen Sie sich immer an die Probe x nN erinnern, um zu berechnen 2.As, die von Conrad Turner angezeigt werden, können Sie ein unendlich langes exponentielles Fenster verwenden, das Ihnen erlaubt, zu berechnen Die Ausgabe nur aus der Vergangenheit heraus Setzen und die aktuelle input. but dies ist nicht ein Standard ungewichtet gleitenden Durchschnitt, sondern ein exponentiell gewichteter gleitender Durchschnitt, wo Proben weiter in der Vergangenheit bekommen ein kleineres Gewicht, aber zumindest in der Theorie Sie nie vergessen, was die Gewichte nur kleiner und kleiner für Samples weit in der Vergangenheit. Ich habe einen gleitenden Durchschnitt ohne Einzelposten-Speicher für ein GPS-Tracking-Programm, das ich schrieb. Ich beginne mit 1 Probe und teilen durch 1, um die aktuelle avg. I dann fügen Sie anothe Probe und teilen durch 2 an die Dieses Spiel geht weiter, bis ich die Länge des Durchschnittes bekomme. Jede Zeit danach, füge ich in die neue Probe, bekomm den Durchschnitt und entferne diesen Durchschnitt von der total. Ich bin kein Mathematiker, aber das schien wie ein guter Weg zu Tu es dachte ich, dass es den Magen eines echten Mathe-Kerls drehen würde, aber es stellt sich heraus, dass es eine der akzeptierten Weisen ist, es zu tun Und es funktioniert gut Denken Sie daran, dass je höher Ihre Länge, je langsamer es folgt, was Sie folgen wollen Das ist vielleicht egal Die Zeit, aber wenn Sie Satelliten folgen, wenn Sie langsam sind, könnte der Weg weit von der tatsächlichen Position entfernt sein und es wird schlecht aussehen Sie könnten eine Lücke zwischen dem Sat und den hinteren Punkten haben, wählte ich eine Länge von 15 aktualisiert 6 mal pro Minute zu Erhalten Sie genügend Glättung und nicht zu weit von der tatsächlichen Sat-Position mit dem geglätteten Pfad dots. answered 16. November 16 um 23 03.initialize total 0, zählen 0 jedes Mal sehen einen neuen value. Then eine Eingabe scanf, eine addieren total newValue, Eine Inkrementzählung, eine Divide Durchschnittliche Gesamtzählung. Dies wäre ein gleitender Durchschnitt über alle Eingänge. Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, würde es 4 Eingabevariablen erfordern, vielleicht kopiert jeder Eingang in einen älteren Eingang variabel und berechnet dann die neue Bewegung Durchschnittlich als Summe der 4 Eingangsvariablen, geteilt durch 4 rechte Verschiebung 2 wäre gut, wenn alle Eingänge positiv waren, um die durchschnittliche Berechnung zu machen. Vielen Dank am 3. Februar 15 um 4 06.Das wird tatsächlich den Gesamtdurchschnitt und NICHT den gleitenden Durchschnitt berechnen Count erhalten S größer die Auswirkungen einer neuen Eingabe Probe wird verschwindend klein Hilmar 3. Februar 15 um 13 53. Ihre Antwort.2017 Stack Exchange, Inc. Ich weiß, dies ist erreichbar mit Boost wie pro. But ich möchte wirklich vermeiden, Boost ich habe Gegoogelt und fand keine geeigneten oder lesbaren Beispiele. Basisch möchte ich den gleitenden Durchschnitt eines laufenden Stroms von einem Strom von Gleitkommazahlen mit den neuesten 1000 Zahlen als Datenbeispiel verfolgen. Was ist der einfachste Weg, dies zu erreichen. Ich Experimentierte mit der Verwendung eines kreisförmigen Arrays, exponentieller gleitender Durchschnitt und ein einfacher gleitender Durchschnitt und fand heraus, dass die Ergebnisse aus dem kreisförmigen Array meinen Bedürfnissen am besten gefasst wurden. 12 12 bei 4 38.Wenn Ihre Bedürfnisse einfach sind, können Sie einfach nur versuchen, eine Exponentieller gleitender Durchschnitt. Sie einfach machen Sie eine Akkumulator-Variable, und wie Ihr Code bei jedem Sample sieht, aktualisiert der Code den Akkumulator mit dem neuen Wert Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie diese. Sie brauchen nur Einen Wert von a finden Lpha wo die Wirkung einer bestimmten Probe nur für etwa 1000 Proben dauert. Hmm, ich bin nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass ich es hier aussage Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Ich bin mir nicht sicher, dass es ein Alpha gibt, das den Durchschnitt über die letzten 1000 Zahlen verbreiten würde, ohne Unterlauf in der Gleitkomma-Berechnung. Aber wenn man einen kleineren Durchschnitt wünscht, wie 30 Zahlen oder so, ist dies eine sehr einfache und schnelle Art zu tun It. answered Jun 12 12 bei 4 44. 1 auf deinem Post Der exponentielle gleitende Durchschnitt kann das Alpha variabel sein. So kann es verwendet werden, um Zeitbasiswerte zu berechnen zB Bytes pro Sekunde Wenn die Zeit seit dem letzten Akkumulator Update mehr ist Als 1 Sekunde, lassen Sie alpha be 1 0 Andernfalls können Sie alpha be usecs seit letztem Update 1000000 jxh Jun 12 12 at 6 21.Basically Ich möchte den gleitenden Durchschnitt eines laufenden Streams von einem Strom von Gleitkommazahlen mit zu verfolgen Die letzten 1000 Nummern als Datenbeispiel. Nichts E, dass die unten die Gesamtsumme als Elemente als addiert ersetzt, vermeiden kostspielige ON-Traversal, um die Summe zu berechnen - benötigt für den Durchschnitt - on demand. Total ist ein anderer Parameter von T zu unterstützen, zB mit einer langen langen, wenn insgesamt 1000 lang s , Ein int für char s oder ein doppeltes bis total float am. Dies ist ein bisschen fehlerhaft, dass Numsamples an INTMAX vorbeikommen könnten - wenn es dir egal ist, dass du eine langjährige langjährige Benutzung verwenden kannst oder ein extra bool Datenelement verwenden kannst, um zu erfassen, wann der Container ist Wird zuerst gefüllt, während das Radfahren numsamples um das Array am besten dann umbenannt etwas Unschuldiges wie pos. answered Jun 12 12 bei 5 19.on geht davon aus, dass void Operator T Probe ist eigentlich void Operator T Probe oPless Jun 8 14 bei 11 52. oPless ahhh gut gesichtet Eigentlich meinte ich für es, void zu sein Betreiber T Probe aber natürlich könnten Sie verwenden, was auch immer Notation, die Sie mochten, beheben, danke Tony D Jun 8 14 bei 14 27.C Algorithmus für Null-Latenz exponentiell gleitenden Durchschnitt. Last Modified 2012-08- Ich habe versucht, eine Niederfrequenz-Cutoff in c, die im Wesentlichen nimmt einen Strom von Zahlen und glättet die Ausgabe herausfiltern Hochfrequenz-Bewegungs-Jitter, aber es ist wichtig, dass die vorderen gewichteten Zahlen als sofort betrachtet werden, da die Daten zeitkritisch ist, um eine Bewegungssimulationsbasis zu steuern Ausgabe von ein bisschen Spiel-Software Ich habe eine funktionierende gewichtete gleitende durchschnittliche Algoithm, aber könnte mit etwas ein wenig mehr reagieren am vorderen Ende zu tun, und ich fand dies. Der Pseudocode gibt es wie folgt. Inputs Price NumericSeries, Periode NumericSimple Variablen Faktor 0, Lag 0.if CurrentBar 1 dann beginnen ZLEMA Preisfaktor 2 Periode 1 Verzögerung Periode-1 2 Ende sonst Z11MA Faktor 2 Preis-Preis lag 1-Faktor ZLEMA 1 Ende. I ve habe es in C und meinen Code übersetzt Ist wie folgt. Jedoch scheint es nicht so zu verhalten, wie ich es erwartet habe Es scheint fast da zu sein, aber manchmal bekomme ich einen etwas niedrigeren Wert als alle Artikel in der Warteschlange, wenn sie alle höher sind. Meine Warteschlange und die Anzahl der Artikel drin Werden als Parameter übergeben, wobei das jüngste an der Front zu allen Zeiten ist, auch ich gehe einen inkrementierenden Zähler ab 0, wie es die Funktion verlangt. Ich bin mir nicht sicher, dass ich die Bedeutung von ZLEMA 1 richtig interpretiert habe, da es nicht klar ist In seinem Pseudocode, also habe ich davon ausgegangen, dass dies der letzte Aufruf s zlema ist und auch ich vermute, dass Preis tatsächlich bedeutet Preis 0 Vielleicht habe ich das falsch. Ich sollte das eigentliche Zlema berechnete Werte wieder in meine ursprüngliche Warteschlange kopieren Der nächste Anruf Ich ändere nicht die ursprüngliche Warteschlange an allen anderen als nur die Verschiebung aller Werte ein bis zum Ende und das Einfügen der neuesten am Anfang Der Code, den ich verwenden, um dies zu tun ist. Would wäre sehr dankbar, wenn jemand mit einem besseren Verständnis der Mathe könnte bitte Verstand überprüfen, dies für mich zu sehen, ob ich etwas etwas falsch haben. Danke so viel im Voraus, wenn Sie helfen können. Vielen Dank allen für Ihre Eingabe, sehr geschätzt. Das macht Sinn, ich denke, also nehme ich dann das Beste an Ich kann hoffen, ist einfach eine Expone Ntial gleitenden Durchschnitt, akzeptieren wird es eine kleine Verzögerung, aber dies wird durch die schwerere Front-Gewichtung minimiert werden, als in typischen gewichteten gleitenden Durchschnitt gegeben. Ich habe diesen Algorithmus zu, aber ein ähnliches Problem, dass die Werte don t scheinen ganz richtig, wenn dies nicht Ist die Art der formula. For Instanz, sagen, mein Array enthält 16 Werte, alle 0 4775 - die Ausgabe ist 0 4983, aber ich d erwarten, dass es 0 4775.Does dieser Blick direkt zu Ihnen. Exponential Moving Average Float Ema Float Vals, int numVals, int currentSample statischer Floatfaktor 0 statischer Float lastema 0 float ema. if currentSample 1 ema vals 0 Faktor 2 0 float numvals 1 0 sonst ema Faktor vals 0 1 0 - Faktor lastema lastema ema. Rückkehr ema Umgekehrt, manchmal ist die Ausgabe niedriger als jeder einzelne der Eingänge, auch wenn alle höher sind. Es wird in der gleichen Weise wie zlema oben genannt, mit einem inkrementierenden Zähler Die Formel und Pseudocode für diese hier sind hier - Danke Wieder entschuldigt sich für mein Missverständnis von einigen der Grundlagen Mit freundlichen Grüßen, Chris J. As für den Code, den ich gepostet habe, hast du Recht über die Array-Größen-Situation Das sollte leicht behoben werden Wie für deine Fragen.1 Die Filterkonstante stellt eine Frequenzabschaltung dar Ich habe eine digitale Signalverarbeitung DSP für diese Technik ki Low-pas sfilter ist eine einfache Erklärung Sie wollen die Discrete-Time Realisierung Abschnitt In meinem Fall die A ist die RC-Konstante sie reden über die Häufigkeit, die es ausschneidet ist oben 1 2 pi A Wenn du nicht ein Verständnis von Häufigkeit-Domain-Theorie hast, kann dies kompliziert werden. In deinem Fall, Je höher du A machst, desto niedriger die Frequenz, die dieser Filter erlaubt, was bedeutet, dass es die Kurve mehr glatt macht Und mehr Je niedriger du es machst, desto mehr Lärm, das im System erlaubt ist Erinnere dich an A muss größer als oder gleich 1 um effektiv zu sein. Ich habe die XLS wieder angefahren, diesmal ohne die wechselnden Randzahlen Passen Sie die A-Konstante an und beobachten Sie Wie es die Hochfrequenzvariationen glättet oder herausfiltert.2 Der letzte Punkt des Eingangs-Arrays hat den aktuellsten Wert.3 Das gleiche gilt für das Ausgabe-Array Der letzte ist der aktuellste Wert.5 Der NUMVALS ist beliebig Sie können kontinuierlich arbeiten Fügen Sie auf die Eingabe-und Ausgabe-Array so oft wie Sie d mögen und es wouldn t Effekt der Filter Insbesondere habe ich 49 Punkte verwendet Aber ich kann ganz einfach löschen die letzten 20 und die ersten 29 Ausgänge bleiben die gleiche Die Funktion ist nicht Basierend auf wie viele Punkte verwendet werden. Ich möchte Um zu erwähnen, dass ich diese Funktion für eine einmalige Umwandlung entwickelt habe Wenn du eine Umwandlung für den nächsten Wert auf der Fliege machen wolltest, kannst du etwas einfacheres als passendes mal versuchen. Ich bin mustig auf c Ich hoffe das ist richtig Das einzige, was du hättest Notwendigkeit zu liefern ist die Eingabe und Filter constant. Let mir wissen, ob dies hilft.
No comments:
Post a Comment