Sunday 12 March 2017

Moving Average Filter Hardware

Ich kodiere etwas in dem Moment, wo ich bin ein paar Werte im Laufe der Zeit von einem Hardware-Kompass Dieser Kompass ist sehr genau und Updates sehr oft, mit dem Ergebnis, dass, wenn es leicht wackelt, ich am Ende mit dem seltsamen Wert, der s wild Im Widerspruch zu seinen Nachbarn möchte ich diese Werte ausgleichen. Wenn man einiges herumgelesen hat, scheint es, dass was ich will, ist ein Hochpass-Filter, ein Tiefpass-Filter oder ein gleitender Durchschnitt Moving-Durchschnitt kann ich mit, nur Behalte eine Geschichte der letzten 5 Werte oder was auch immer, und benutze den Durchschnitt dieser Werte stromabwärts in meinem Code, wo ich einmal nur mit dem aktuellsten Wert war. Das sollte ich, glaube ich, die Jiggles schön glätten, aber das schlägt mir das Es ist wahrscheinlich ziemlich ineffizient, und das ist wahrscheinlich eines dieser Bekannten Probleme zu ordnungsgemäßen Programmierern, zu denen es eine wirklich ordentliche Clever Math-Lösung gibt. Ich bin aber einer dieser schrecklichen selbstgelehrten Programmierer ohne einen Fetzen der formalen Bildung in irgendetwas sogar Vage im Zusammenhang mit CompSci oder Mathe Reading um ein bisschen deutet darauf hin, dass dies ein High-oder Tiefpass-Filter sein kann, aber ich kann nicht finden, was das erklärt, was für einen Hack wie mich verständlich ist, was die Wirkung dieser Algorithmen wäre auf einer Reihe von Werte, geschweige denn, wie die Mathematik arbeitet Die Antwort, die hier zum Beispiel gegeben wird, antwortet technisch auf meine Frage, aber nur für diejenigen, die wohl schon wissen wollten, wie man das Problem lösen könnte. Es wäre eine sehr schöne und kluge Person Könnte erklären, die Art von Problem, das ist, und wie die Lösungen funktionieren, im Sinne verständlich für ein Arts graduate. asked Sep 21 10 am 13 01.Wenn Ihr gleitender Durchschnitt muss lang sein, um die erforderliche Glättung zu erreichen, und Sie don Ich brauche wirklich eine bestimmte Form des Kernels, dann bist du besser dran, wenn du einen exponentiell abklingenden gleitenden Durchschnitt benutzt. Dort wählst du winzig, um eine passende Konstante zu sein, zB wenn du winzige 1- 1 N wählst, wird es die gleiche Menge an Mittelung haben Als ein Fenster der Größe N, aber verteilt anders über ältere Punkte. Anyway, da der nächste Wert des gleitenden Durchschnittes hängt nur von der vorherigen und Ihre Daten, müssen Sie nicht eine Warteschlange oder etwas zu halten Und Sie können daran denken So etwas wie, Nun, ich habe einen neuen Punkt, aber ich glaube es wirklich nicht, also gehe ich 80 meiner alten Schätzung der Messung, und vertraue nur diesem neuen Datenpunkt 20 Das ist so ziemlich das Genauso wie zu sagen, Nun, ich vertraue nur diesem neuen Punkt 20, und ich benutze 4 weitere Punkte, denen ich vertraue, die gleiche Menge, außer dass anstatt explizit die 4 anderen Punkte zu nehmen, nehmen Sie an, dass die Mittelung Sie das letzte Mal war Vernünftig, so können Sie Ihre vorherige work. answered Sep 21 10 bei 14 27.Hey, ich weiß, das ist 5 Jahre zu spät, aber danke für eine tolle Antwort Ich arbeite an einem Spiel, wo der Klang ändert sich auf Ihre Geschwindigkeit, aber fällig Um das Spiel auf einem langsamen Computer zu laufen, würde die Geschwindigkeit wild schwanken, was für das Lenken gut war, aber super nervig in Bezug auf Sound Dies war eine wirklich einfache und billige Lösung für etwas, was ich dachte, wäre ein wirklich komplexes Problem Adam Mar 16 15 bei 20 20.Wenn Sie versuchen, den gelegentlichen ungeraden Wert zu entfernen, ist ein Tiefpassfilter das Beste aus den drei Optionen, die Sie identifiziert haben. Tiefpassfilter erlauben niedrige Geschwindigkeitsänderungen wie die, die durch das Drehen verursacht werden Kompass von Hand, bei der Ablehnung von High-Speed-Änderungen wie die, die durch Stöße auf der Straße verursacht werden, zum Beispiel. Ein gleitender Durchschnitt wird wahrscheinlich nicht ausreichen, da die Auswirkungen eines einzelnen Blips in Ihre Daten beeinflussen mehrere nachfolgende Werte, abhängig von Auf die Größe Ihres gleitenden durchschnittlichen Fensters. Wenn die ungeraden Werte leicht erkannt werden, können Sie sogar besser mit einem Glitch-Entfernungs-Algorithmus, der sie völlig ignoriert. Hier ist ein Guick-Diagramm zu illustrieren. Der erste Graph ist das Eingangssignal, Mit einer unangenehmen Störung Die zweite Grafik zeigt die Wirkung eines 10-prozentigen gleitenden Durchschnitts Die endgültige Grafik ist eine Kombination aus dem 10-Sample-Durchschnitt und dem oben beschriebenen einfachen Glitch-Detection-Algorithmus Wenn der Glitch erkannt wird, wird der 10-Sample-Durchschnitt verwendet Anstatt der tatsächlichen Wert. Moving Durchschnitt kann ich mit unten, aber es schlägt mich, dass es wahrscheinlich ziemlich ineffizient. There s wirklich kein Grund ein gleitender Durchschnitt sollte ineffizient Sie halten die Anzahl der Datenpunkte, die Sie wollen in einigen Puffer wie ein Rundschreiben Warteschlange Auf jedem neuen Datenpunkt platzieren Sie den ältesten Wert und subtrahieren ihn aus einer Summe und schieben den neuesten und fügen ihn der Summe hinzu. Jeder neue Datenpunkt bringt also nur einen Pop-Push, eine Addition und eine Subtraktion mit. Ihr gleitender Durchschnitt ist Immer diese Verschiebungssumme geteilt durch die Anzahl der Werte in deinem Puffer. Es wird ein wenig schwieriger, wenn du gleichzeitig Daten von mehreren Threads empfängst, aber da deine Daten von einem Hardwaregerät kommen, das mir höchst zweifelhaft erscheint. Oh und auch schrecklich Selbstbelehrte Programmierer vereinen. Der gleitende Durchschnitt schien mir ineffizient zu sein, weil man einen Puffer von Werten speichern muss - besser, nur einige Clever Maths mit deinem Eingabewert und dem aktuellen Arbeitswert zu machen, denke ich, dass s, wie exponentieller gleitender Durchschnitt funktioniert Eine Optimierung I Ich habe für diese Art von gleitenden Durchschnitt gesehen, mit der Verwendung einer festen Länge Warteschlange ein Zeiger auf, wo Sie sind in dieser Schlange, und nur wickeln Sie den Zeiger herum mit oder ein, wenn Voila Keine teuren Push-Pop Power an die Amateure, Bruder Henry Cooke Sep 22 10 bei 0 54. Henry Für einen geradlinigen gleitenden Durchschnitt brauchst du den Puffer einfach so, dass du weißt, welcher Wert geknallt wird, wenn der nächste Wert gedrückt wird. Das heißt, die feste Länge in der Warteschlange ein Zeiger, den du beschreibst, ist genau das, was ich bin Gemeint durch kreisförmige Warteschlange Das ist der Grund, warum ich sagte, es ist nicht ineffizient Was meinst du, ich meinte Und wenn deine Antwort ein Array ist, das seine Werte wieder auf jede indizierte Entfernung wie Std-Vektor in C verschiebt, dann bin ich so verletzt ich Ich möchte gar nicht mehr mit dir reden Dan Tao Sep 22 10 bei 1 58. Henry Ich weiß nicht über AS3, aber ein Java-Programmierer s hat Sammlungen wie CircularQueue zu seiner Verfügung Ich bin kein Java-Entwickler, also bin ich sicher dort Sind bessere Beispiele da draußen s genau das, was ich von einer schnellen Google-Suche gefunden habe, die genau die Funktionalität implementiert, von der wir reden, ich bin ziemlich zuversichtlich, dass die Mehrheit der Mittel - und Tiefsprachen mit Standardbibliotheken etwas Ähnliches hat, Warteschlange T Jedenfalls war ich Philosophie selbst, also ist alles vergeben Dan Tao Sep 22 10 bei 12 44. Ein exponentiell abklingender gleitender Durchschnitt kann von Hand mit nur dem Trend berechnet werden, wenn man die richtigen Werte verwendet. Siehe für eine Idee, wie man es macht Dies schnell mit einem Stift und Papier, wenn Sie auf der Suche nach exponentiell geglätteten gleitenden Durchschnitt mit 10 Glättung Aber da Sie einen Computer haben, möchten Sie wahrscheinlich wollen binäre Verschiebung im Gegensatz zu dezimalen Verschiebung. Dieser Weg, alles, was Sie brauchen, ist eine Variable für Ihr aktueller Wert und einer für den Durchschnitt Der nächste Durchschnitt kann dann berechnet werden, dass am 21. September 10 bei 14 39.there sa Technik namens ein Bereich Tor, das gut funktioniert mit Low-Auftreten falsche Proben unter der Verwendung eines der Filter Techniken, die oben erwähnt werden, gleitender Durchschnitt, exponentiell, sobald man genügend Geschichte hat eine Zeit Konstante können Sie das neue, eingehende Datenmuster für Angemessenheit testen, bevor es der Berechnung hinzugefügt wird. some Kenntnis der maximal vernünftigen Änderungsrate des Signals Ist erforderlich, dass die Rohprobe mit dem letzten geglätteten Wert verglichen wird und wenn der Absolutwert dieser Differenz größer ist als der zulässige Bereich, wird dieser Stichprobe ausgelöst oder durch eine Heuristik ersetzt, zB eine Vorhersage auf der Grundlage der Steigungsdifferenz oder des Trends Vorhersage-Wert von doppelter exponentieller Glättung. answered Apr 30 16 at 6 56. Der Wissenschaftler und Ingenieur s Guide to Digitale Signalverarbeitung Von Steven W Smith, Ph D. Kapitel 15 Moving Average Filters. Relatives of the Moving Average Filter In einer perfekten Welt , Filter-Designer würden nur mit Zeitbereich oder Frequenzbereich verschlüsselte Informationen zu behandeln, aber nie eine Mischung aus den beiden in das gleiche Signal Leider gibt es einige Anwendungen, wo beide Domains gleichzeitig wichtig sind Zum Beispiel, TV-Signale fallen in diese böse Kategorie Videoinformation wird im Zeitbereich codiert, dh die Form der Wellenform entspricht den Helligkeitsmustern im Bild. Während der Übertragung wird das Videosignal jedoch entsprechend seiner Frequenzzusammensetzung, wie z. B. seiner Gesamtbandbreite, wie der Träger behandelt Wellen für Klangfarbe werden hinzugefügt, Eliminierungswiederherstellung der Gleichstromkomponente usw. Als weiteres Beispiel wird elektromagnetische Interferenz am besten im Frequenzbereich verstanden, auch wenn die Signalinformation im Zeitbereich codiert ist. Zum Beispiel der Temperaturüberwachung In einem wissenschaftlichen Experiment könnte mit 60 Hertz aus den Stromleitungen, 30 kHz aus einer Schaltnetzteil oder 1320 kHz von einem lokalen AM-Radiosender verunreinigt werden. Die Verwandten des gleitenden Durchschnittsfilters haben eine bessere Frequenzdomänenleistung und können in diesen nützlich sein Gemischte Domänenanwendungen. Multiple-Pass-Gleitende durchschnittliche Filter beinhalten das Durchleiten des Eingangssignals durch einen gleitenden Durchschnittsfilter zweimal oder mehr Mal Abbildung 15-3a zeigt den Gesamtfilterkern, der aus einem, zwei und vier Durchgängen resultiert. Zwei Durchgänge sind gleichbedeutend mit der Verwendung eines Dreiecksfilters Kernel ein rechtwinkliger Filterkern, der mit sich selbst gefaltet ist Nach vier oder mehr Pässe sieht der äquivalente Filterkernel wie ein Gaußscher Rückruf des Central Limit Theorems aus. Wie in b gezeigt, erzeugen mehrere Pässe eine s-förmige Schrittantwort, verglichen mit der geraden Linie der Single Pass Die Frequenzantworten in c und d sind gegeben durch Gl. 15-2 multipliziert mit sich selbst für jeden Durchlauf Das heißt, jedes Mal führt die Domänenfaltung zu einer Multiplikation der Frequenzspektren. Abbildung 15-4 zeigt den Frequenzgang zweier anderer Verwandter von Der gleitende Durchschnittsfilter Wenn ein reiner Gaussian als Filterkern verwendet wird, ist der Frequenzgang auch ein Gaußscher, wie in Kapitel 11 diskutiert. Der Gauß ist wichtig, weil es die Impulsantwort vieler natürlicher und künstlicher Systeme ist. Zum Beispiel ein kurzer Puls Des Lichts, das in eine lange faseroptische Übertragungsleitung eintritt, wird als Gaußscher Puls aufgrund der unterschiedlichen Pfade der Photonen innerhalb der Faser beendet. Der Gaußsche Filterkernel wird auch weitgehend in der Bildverarbeitung verwendet, da er einzigartige Eigenschaften aufweist, die eine schnelle zweidimensionale ermöglichen Convolutions siehe Kapitel 24 Der zweite Frequenzgang in Abb. 15-4 entspricht der Verwendung eines Blackman-Fensters als Filterkernel. Der Begriff Fenster hat hier keine Bedeutung, hier ist einfach ein Teil des akzeptierten Namens dieser Kurve. Die genaue Form des Blackman-Fensters ist gegeben In Kapitel 16 Gl. 16-2, Abb. 16-2 Allerdings sieht es viel wie ein Gaußscher aus. Wie sind diese Verwandten des gleitenden Durchschnittsfilters besser als der gleitende Mittelfilter selbst. Drei Wege Zuerst und am wichtigsten, haben diese Filter ein besseres Stoppband Dämpfung als der gleitende Mittelwertfilter Zweitens verjüngen sich die Filterkerne zu einer kleineren Amplitude in der Nähe der Enden. Erinnern Sie sich, dass jeder Punkt im Ausgangssignal eine gewichtete Summe einer Gruppe von Abtastwerten aus dem Eingang ist. Wenn sich der Filterkern verjüngt, werden die Abtastwerte im Eingangssignal ausgegeben Die weiter entfernt sind, werden weniger Gewicht gegeben als die dritten, die Schrittreaktionen sind glatte Kurven, anstatt die abrupte gerade Linie des gleitenden Durchschnitts. Diese letzten beiden sind in der Regel von begrenztem Nutzen, obwohl Sie Anwendungen finden könnten, wo sie echte Vorteile sind Der gleitende Durchschnittsfilter und seine Verwandten sind bei gleichzeitiger Reduzierung von zufälligem Rauschen bei gleichzeitiger Beibehaltung einer scharfen Stufenreaktion. Die Mehrdeutigkeit liegt darin, wie die Laufzeit der Sprungantwort gemessen wird. Wenn die Laufzeit von 0 bis 100 des Schritts gemessen wird, Bewegter durchschnittlicher Filter ist das Beste, was Sie tun können, wie bereits gezeigt Im Vergleich dazu misst die Messung von 20 bis 90 das Blackman-Fenster besser als das gleitende Mittelfilter Der Punkt ist, das ist nur theoretische Streitung, die diese Filter in diesem Parameter gleich sind. Der größte Unterschied in diesen Filtern ist die Ausführungsgeschwindigkeit Unter Verwendung eines rekursiven Algorithmus, der als nächstes beschrieben wird, läuft der gleitende Durchschnittsfilter wie ein Blitz in deinem Computer. In der Tat ist es der schnellste digitale Filter. Mehrere Pässe des gleitenden Durchschnitts werden entsprechend langsamer sein, aber immer noch Sehr schnell Im Vergleich dazu sind die Gaussian - und Blackman-Filter quälend langsam, weil sie die Faltung verwenden müssen. Denken Sie einen Faktor von zehnmal die Anzahl der Punkte im Filterkern auf der Basis der Multiplikation, die etwa 10 mal langsamer als die Zugabe ist. Erwarten Sie beispielsweise einen 100-Punkt Gaussian, um 1000 mal langsamer als ein gleitender Durchschnitt mit Rekursion zu sein. Wie andere erwähnt haben, sollten Sie einen IIR unendlichen Impulsantwort-Filter anstatt der FIR-Finite-Impuls-Antwort-Filter, die Sie jetzt verwenden, Es gibt mehr dazu, aber auf den ersten Blick FIR Filter sind als explizite Windungen und IIR-Filter mit Gleichungen implementiert. Der besondere IIR-Filter Ich benutze viel in Mikrocontroller ist ein einpoliger Tiefpass-Filter Dies ist das digitale Äquivalent eines einfachen RC-Analog-Filter Für die meisten Anwendungen haben diese bessere Eigenschaften als Der Kastenfilter, den Sie verwenden Die meisten Verwendungen eines Kastenfilters, dem ich angetroffen habe, sind ein Resultat von jemand, das nicht Aufmerksamkeit in der digitalen Signalverarbeitung Klasse, nicht als Ergebnis der Notwendigkeit ihrer besonderen Eigenschaften Wenn Sie nur wollen, um hohe Frequenzen, die Sie abschwächen Wissen, Lärm, ein einpoliger Tiefpassfilter ist besser Der beste Weg, um ein digital in einem Mikrocontroller zu implementieren ist in der Regel. FILT - FILT FF NEU - FILT. FILT ist ein Stück persistenten Zustand Dies ist die einzige persistente Variable, die Sie benötigen Berechnen Sie diesen Filter NEU ist der neue Wert, den der Filter mit dieser Iteration aktualisiert wird FF ist die Filterfraktion, die die Schwere des Filters anpasst. Betrachten Sie diesen Algorithmus und sehen Sie, dass für FF 0 der Filter unendlich schwer ist, da sich die Ausgabe niemals ändert FF 1, es ist eigentlich kein Filter, da der Ausgang gerade dem Eingang folgt. Nützliche Werte sind dazwischen Bei kleinen Systemen wählst du FF auf 1 2 N, so dass die Multiplikation mit FF als Rechtsverschiebung durch N Bits For erreicht werden kann Beispiel könnte FF 1 16 sein und das Multiplikation mit FF also eine rechte Verschiebung von 4 Bits. Andernfalls braucht dieser Filter nur einen Subtrahier und einen hinzuzufügen, obwohl die Zahlen in der Regel breiter sein müssen als der Eingabewert mehr auf numerische Genauigkeit in einem separaten Abschnitt Unten. Ich nehme in der Regel AD-Messungen deutlich schneller als sie benötigt werden und wenden Sie zwei dieser Filter kaskadiert Dies ist das digitale Äquivalent von zwei RC-Filter in Serie und dämpft um 12 dB Oktave über die Rolloff-Frequenz Allerdings für AD-Messungen ist es in der Regel Mehr relevant, um den Filter im Zeitbereich zu betrachten, indem man seine Schrittantwort betrachtet. Dies sagt Ihnen, wie schnell Ihr System eine Veränderung sehen wird, wenn das, was Sie Messungen ändern. Um die Gestaltung dieser Filter zu erleichtern, bedeutet das nur, FF zu wählen und zu entscheiden, wie viele von Sie kaskadieren, ich benutze mein programm FILTBITS Sie geben die Anzahl der Verschiebungsbits für jede FF in der kaskadierten Filterreihe an und es berechnet die Sprungantwort und andere Werte. Eigentlich laufe ich in der Regel über mein Wrapperskript PLOTFILT Das läuft FILTBITS, welches Macht eine CSV-Datei, dann zeichnet die CSV-Datei zum Beispiel hier ist 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 an Realisieren die Multiplikation mit FF Die beiden FF-Werte sind daher 1 16 in diesem Fall. Die rote Spur ist die Einheit Schritt Antwort, und ist die Hauptsache zu betrachten Zum Beispiel, dies sagt Ihnen, dass, wenn die Eingabe ändert sich sofort, die Ausgabe von Der kombinierte Filter wird sich auf 90 des neuen Wertes in 60 Iterationen niederlassen Wenn du ungefähr 95 Einschwingzeit kümmertest, dann musst du etwa 73 Iterationen warten und für 50 Einschwingzeit nur 26 Iterationen. Die grüne Spur zeigt dir die Ausgabe von einem einzigen voll Amplitude Spike Dies gibt Ihnen eine Vorstellung von der zufälligen Rauschunterdrückung Es sieht aus wie keine einzelne Probe wird mehr als eine 2 5 ändern in der Ausgabe. Die blaue Spur ist, um ein subjektives Gefühl, was dieser Filter mit weißen Rauschen Dies ist nicht Ein 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 Es ist nur, um Ihnen ein grobes Gefühl, wie viel es wird gequetscht und wie glatt ist es. 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. Ziehen von numerischen Präzision. I sehen aus den Kommentaren und jetzt eine neue Antwort, die es gibt Interesse an der Diskussion über die Anzahl der Bits, die für die Implementierung dieses Filters benötigt werden. 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 1 2 N gewählt, so dass diese Multiplikation tatsächlich realisiert wird Eine rechte Verschiebung von N Bits. FILT ist also meist eine Fixpunkt-Ganzzahl. Beachten Sie, dass dies keine der Mathematik aus der Sicht des Prozessors ändert. Wenn Sie beispielsweise 10-Bit-AD-Werte und N 4 FF 1 16 filtern, Dann brauchst du 4 Fraktionsbits unterhalb der 10-Bit-Integer-AD-Lesungen Einer der meisten Prozessoren, du machst 16-Bit-Integer-Operationen aufgrund der 10-Bit-AD-Messungen. In diesem Fall kannst du immer noch genau die gleichen 16-Bit-Integer-OTP-Spiele ausführen Mit den AD-Lesungen links um 4 Bits verschoben Der Prozessor kennt den Unterschied nicht und braucht nicht die Mathe auf ganze 16-Bit-Ganzzahlen zu arbeiten, ob man sie als 12 4 Fixpunkt oder wahre 16-Bit-Integer 16 0 Fixpunkt betrachtet. Im Allgemeinen müssen Sie N Bits jeden Filterpol hinzufügen, wenn Sie nicht möchten, dass Rauschen aufgrund der numerischen Darstellung hinzuzufügen. Im obigen Beispiel müsste der zweite Filter von zwei 10 4 4 18 Bits haben, um keine Informationen zu verlieren. In der Praxis Auf einer 8-Bit-Maschine bedeutet das, dass du 24-Bit-Werte verwendet. 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 Filterpole-Vorgang auszuführen, dann wende das an jeden Pol an Ob eine Subroutine oder ein Makro davon abhängt, ob Zyklen oder Programmspeicher in diesem bestimmten Projekt wichtiger sind. Irgendeine Weise verwende ich einen Kratzzustand, um NEU weiterzugeben In das Subroutine-Makro, das FILT aktualisiert, aber auch lädt das in den gleichen Scratch-Status NEU war in Dies macht es einfach, mehrere Pole anzuwenden, da die aktualisierte FILT von einem Pole ist die NEU der nächsten Wenn eine Subroutine, ist es nützlich Um einen Zeiger auf FILT auf dem Weg in, die aktualisiert wird, kurz nach FILT auf dem Weg nach draussen auf diese Weise die Subroutine automatisch arbeitet auf aufeinanderfolgenden Filtern im Speicher, wenn mehrere Male mit einem Makro Sie don t brauchen einen Zeiger, da Sie passieren In der Adresse, um auf 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.Bof diese Beispiele sind als Makros implementiert Mit meinem PIC Assembler Preprocessor, die mehr fähig ist als eine der eingebauten Makroanlagen. Clabacchio Ein weiteres Problem, das ich erwähnt habe, ist die Firmware-Implementierung Sie können einmal ein einzelnes Pole-Tiefpass-Filter-Subroutine schreiben, dann wenden Sie es mehrmals an. In der Tat schreibe ich normalerweise eine solche Unterroutine, um einen Zeiger im Speicher auf den Filterzustand zu setzen Der Zeiger, so dass es nacheinander einfach aufgerufen werden kann, um mehrpolige Filter zu realisieren Olin Lathrop 20. April 12 um 15 03.1 Vielen Dank für Ihre Antworten - alle von ihnen habe ich beschlossen, diesen IIR Filter zu verwenden, aber dieser Filter wird nicht als verwendet Ein Standard-LowPass-Filter, da ich durchschnittliche Zählerwerte verwerten und sie vergleichen muss, um Änderungen in einer bestimmten Reichweite zu erkennen, da diese Werte von sehr unterschiedlichen Dimensionen abhängig von Hardware sind, wollte ich einen Durchschnitt nehmen, um auf diese Hardware reagieren zu können Spezifische Änderungen automatisch sensslen Mai 21 12 um 12 06.Wenn Sie mit der Beschränkung einer Macht von zwei Anzahl von Gegenständen zu durchschnittlich dh 2,4,8,16,32 etc leben können, dann kann die Kluft einfach und effizient auf einem getan werden Low-Performance-Mikro mit keiner dedizierten Divide, weil es als Bit-Shift getan werden kann Jeder Shift rechts ist eine Potenz von zwei zB. Die OP dachte, er hatte zwei Probleme, die Teilung in einem PIC16 und Speicher für seine Ring-Puffer Diese Antwort zeigt, dass die Teilung Ist nicht schwierig zugegebenermaßen adressiert es 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 andere s Antworten Da einige der anderen Antworten eine Teilungsoperation erfordern, sie Sind ähnlich unvollständig, da sie nicht zeigen, wie man dies effizient auf einem PIC16 Martin Apr 20 12 um 13 01.Es gibt eine Antwort für eine echte gleitende durchschnittliche Filter aka Boxcar Filter mit weniger Speicherbedarf, wenn Sie don t mind downsampling It s Genannt 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, Sie don t müssen jeden Wert des Integrators speichern Kann mit dem folgenden Pseudocode implementiert werden. Ihre effektive gleitende durchschnittliche Länge ist decimationFactor stateize aber du musst nur um Zustandsmuster zu halten. Offensichtlich kannst du eine bessere Leistung erzielen, wenn dein Status und DecimationFactor Kräfte von 2 sind, so dass die Division und Restbetreiber ersetzt werden Durch verschiebungen und mask-ands. Postscript Ich bin mit Olin einverstanden, dass man immer einfache IIR-Filter vor einem gleitenden durchschnittlichen Filter betrachten sollte Wenn Sie nicht brauchen die Frequenz-Null von einem Boxcar-Filter, eine 1-polige oder 2-polige Low - Pass-Filter wird wahrscheinlich gut funktionieren. Auf der anderen Seite, wenn Sie filtern für die Zwecke der Dezimierung unter einem High-Sample-Rate-Input und Mittelung es für den Einsatz durch einen Low-Rate-Prozess dann ein CIC-Filter kann genau das, was Sie re Vor allem, wenn Sie stateize 1 verwenden können und vermeiden Sie den Ringbuffer insgesamt mit nur einem einzigen vorherigen Integrator Wert. Es gibt eine eingehende Analyse der Mathematik hinter mit dem ersten Auftrag IIR-Filter, die Olin Lathrop bereits über das digitale Signal beschrieben hat Die Verarbeitung von Stack-Austausch umfasst viele schöne Bilder Die Gleichung für diese IIR-Filter ist. Dies kann mit nur Integers implementiert werden und keine Teilung mit dem folgenden Code könnte einige Debugging, wie ich aus dem Speicher war. This Filter nähert sich ein gleitender Durchschnitt der letzten K-Samples durch Setzen des Wertes von alpha auf 1 K Führen Sie dies im vorhergehenden 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. I ll überprüfen den Code aufgeführt Hier, sobald ich eine Änderung bekomme und diese Antwort editiere, wenn nötig. derwered Jun 23 12 am 4 04.Hier ein einpoliger Tiefpassfilter gleitender Durchschnitt, mit Cutoff-Frequenz CutoffFrequenz Sehr einfach, sehr schnell, funktioniert super und fast Kein Speicher overhead. Note Alle Variablen haben Umfang über die Filterfunktion hinaus, außer dass in newInput. Note passiert ist. Dies ist ein einstufiges Filter Mehrere Stufen können zusammenkaskadiert werden, um die Schärfe des Filters zu erhöhen Wenn Sie mehr als eine Stufe verwenden, werden Sie ll Müssen DecayFactor anpassen, bezogen auf die Cutoff-Frequenz, um zu kompensieren. Und offensichtlich alles, was Sie brauchen, ist die beiden Linien platziert irgendwo, sie don t brauchen ihre eigene Funktion Dieser Filter hat eine Ramp-up-Zeit vor dem gleitenden Durchschnitt repräsentiert die der Eingangssignal 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. CutoffFrequenz SampleRate 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 doppelt Wenn Sie mit Integers bleiben müssen, können Sie Konvertieren DecayFactor und Amplitude Factor in gebrochene Ganzzahlen, in denen der Zähler als Ganzzahl gespeichert wird, und der Nenner ist eine ganzzahlige Potenz von 2, so dass Sie sich nach rechts als Nenner bitten können, anstatt sich während der Filterschleife zu teilen Beispiel, wenn DecayFactor 0 99, und du willst ganze Zahlen verwenden, kannst du DecayFactor setzen 0 99 65536 64881 Und dann, wenn du dich von DecayFactor in deiner Filterschleife vermehrst, verschiebe einfach das Ergebnis 16.Für weitere Informationen dazu ein exzellentes Buch S online, Kapitel 19 auf rekursive filter. 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, Sie wollen die vorherigen, etwa 6 Artikel gemittelt zusammen, tun es diskret , Du fügst 6 Gegenstände hinzu und teile mit 6, so dass du den AmplitudeFactor auf 1 6 setzen kannst und DecayFactor auf 1 0 - AmplitudeFactor. answered am 14. Mai 12 um 22 55. Jeder andere hat sich kommentiert über den Nutzen von IIR vs FIR, Und auf Power-of-Two-Division Ich möchte nur einige Implementierungsdetails geben Die unten funktioniert gut auf kleine Mikrocontroller ohne FPU Es gibt keine Multiplikation, und wenn Sie N eine Macht von zwei behalten, ist die ganze Teilung Single-Cycle-Bit - shifting. Basic FIR Ringpuffer halten einen laufenden Puffer der letzten N Werte und eine laufende SUM aller Werte im Puffer Jedes Mal, wenn ein neues Sample hereinkommt, subtrahiere den ältesten Wert im Puffer von SUM, ersetze ihn mit dem Neues Sample, fügt das neue Sample zu SUM hinzu und gibt SUM N aus. Modifizierter IIR Ringpuffer behält einen laufenden SUM der letzten N Werte Jedes Mal, wenn ein neues Sample kommt, SUM - SUM N, fügen Sie das neue Sample hinzu und geben Sie SUM aus N. answered Aug 28 13 at 13 45.Wenn ich dich richtig richtig lese, beschreibst du einen IIR-Filter erster Ordnung, den Wert, den du subtrahierst, ist nicht der älteste Wert, der herausfällt, sondern stattdessen der Durchschnitt der vorherigen Werte ist Erste-Ordnung-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 10KHz-Abtastrate wird eine 100Hz-Rechteckwelle in einen 20-stufigen Boxfilter geleitet Ergibt ein Signal, das für 20 Abtastungen gleichmäßig ansteigt, für 30 sitzt, für 20 Proben gleichmäßig abfällt und für 30 A für den ersten A-IIR-Filter-Supercat am 28. August bei 15 31 niedrig sitzt. Es wird eine Welle ergeben, die scharf ansteigt und allmählich ansteigt Levels in der Nähe, aber nicht am Eingangsmaximum, dann fängt man scharf an und schreitet allmählich aus, aber nicht am Eingang Minimum Sehr unterschiedliches Verhalten supercat Aug 28 13 bei 15 32.Ein Problem 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 du beschreibst, kann dir nur ein Rechteck geben - ein sinc in freq - und du kannst die Seitenlappen nicht verwalten. Es lohnt sich auch Werfen in ein paar Integer Multiplikationen, um es eine schöne symmetrische abstimmbare FIR, wenn Sie die Uhr ticks Scott Seidman Aug 29 13 bei 13 50. ScottSeidman Keine Notwendigkeit für Multiplikationen, wenn man einfach jede Stufe der FIR entweder die Ausgabe der Durchschnitt der Eingabe in diesem Stadium und seinen vorherigen gespeicherten Wert, und dann speichern Sie die Eingabe, wenn man den numerischen Bereich hat, könnte man die Summe anstelle von Durchschnitt verwenden Ob das besser als ein Kastenfilter hängt von der Anwendung die Schrittantwort eines Feldfilters mit Eine Gesamtverzögerung von 1ms, zum Beispiel, wird eine böse d2 dt Spike haben, wenn die Eingabe ändern, und wieder 1ms später, aber haben die minimale d dt für einen Filter mit einer Gesamtmenge von 1ms Verzögerung supercat Aug 29 13 bei 15 25. Wie mikeselectricstuff sagte, wenn Sie wirklich brauchen, um Ihre Gedächtnisbedürfnisse zu reduzieren, und Sie don t mind Ihre Impulsantwort ein exponentieller statt eines rechteckigen Pulses, würde ich für einen exponentiellen gleitenden durchschnittlichen Filter Ich benutze sie ausgiebig Mit dieser Art von Filter, Du brauchst keinen Puffer Du musst nicht n hintere Samples speichern Nur ein So, deine Speicheranforderungen werden durch einen Faktor von N abgeschnitten. Auch du brauchst keine Division für das Nur Multiplikationen Wenn du Zugriff auf Floating - Punkt-Arithmetik, verwenden Sie Gleitkomma-Multiplikationen Andernfalls tun Sie ganzzahlige Multiplikationen und Verschiebungen nach rechts Allerdings sind wir im Jahr 2012, und ich würde Ihnen empfehlen, Compiler und MCUs zu verwenden, die Ihnen erlauben, mit Gleitkommazahlen zu arbeiten. Besides ist mehr Speicher Effizient und schneller Sie don t haben, um Elemente in jedem kreisförmigen Puffer zu aktualisieren, würde ich sagen, es ist auch natürlicher, weil eine exponentielle Impulsantwort besser ist die Art und Weise die Natur verhält sich in den meisten Fällen. answered Apr 20 12 bei 9 59.Ein Problem mit Der IIR-Filter, der fast von Olin und Supercat berührt wird, aber anscheinend von anderen nicht beachtet wird, ist, dass die Abrundung eine Ungenauigkeit und eine potenzielle Bias-Trunkierung einnimmt, vorausgesetzt, dass N eine Potenz von zwei ist und nur eine ganzzahlige Arithmetik verwendet wird, das Verschiebungsrecht systematisch eliminiert LSBs der neuen Probe Das bedeutet, dass, wie lange die Serie jemals sein könnte, wird der Durchschnitt niemals diese berücksichtigen. Zum Beispiel nehmen wir eine langsam abnehmende Serie 8,8,8 8,7,7,7 7,6,6 an , Und nehmen Sie den Durchschnitt ist in der Tat 8 am Anfang Die Faust 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 denken, das Gegenteil der Serie geht nach oben Der Durchschnitt wird bleiben auf 7 für immer, bis die Probe groß genug ist, um es zu ändern. Natürlich können Sie für die Bias durch Hinzufügen von 1 2 N 2 korrigieren, aber das gewann t wirklich lösen das Präzisionsproblem in diesem Fall die abnehmende Serie wird für immer bei 8 bleiben Bis die Probe 8-1 2 N 2 ist Für N 4 zum Beispiel wird jede Probe über Null den Durchschnitt unverändert halten. Ich glaube, eine Lösung für das 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 mir 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 bis 8 dann. Olin, deine zweistufige Kaskade braucht auch eine Erklärung zu haben. Du meinst, dass du durchschnittlich durchschnittlich mit dem Ergebnis der ersten in die zweite in jeder Iteration gefüttert hast.


No comments:

Post a Comment