Thursday, November 10, 2016

Eingebettetes c moving average

Wie andere schon erwähnt haben, sollten Sie einen IIR (Endlosimpulsantwort) - Filter anstelle des FIR (Finite Impulse Response) Filter, den Sie jetzt verwenden. Es gibt mehr dazu, aber auf den ersten Blick werden FIR-Filter als explizite Windungen und IIR-Filter mit Gleichungen implementiert. Das besondere IIR-Filter, das ich viel in Mikrocontrollern verwende, ist ein einpoliges Tiefpaßfilter. Dies ist das digitale Äquivalent eines einfachen R-C-Analogfilters. Für die meisten Anwendungen haben diese bessere Eigenschaften als der Kastenfilter, den Sie verwenden. Die meisten Verwendungen eines Box-Filter, die ich begegnet bin, sind ein Ergebnis von jemand nicht Aufmerksamkeit in der digitalen Signalverarbeitung Klasse, nicht als Ergebnis der Notwendigkeit ihrer besonderen Eigenschaften. Wenn Sie nur wollen, um hohe Frequenzen zu dämpfen, dass Sie wissen, Rauschen sind, ist ein einpoliges Tiefpassfilter besser. Der beste Weg, um ein digitales in einem Mikrocontroller zu implementieren, ist in der Regel: FILT lt - FILT FF (NEW - FILT) FILT ist ein Stück persistenter 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. Die die Schwere des Filters einstellt. Betrachten Sie diesen Algorithmus und sehen Sie, dass für FF 0 der Filter unendlich schwer ist, da sich der Ausgang nie ändert. Für FF 1 ist das eigentlich gar kein Filter, da der Ausgang nur dem Eingang folgt. Nützliche Werte sind dazwischen. Bei kleinen Systemen wählen Sie FF auf 1/2 N, so dass die Multiplikation mit FF als Rechtsverschiebung um N Bits erreicht werden kann. Beispielsweise kann FF 1/16 betragen und das Multiplizieren mit FF daher eine Rechtsverschiebung von 4 Bits. Andernfalls benötigt dieses Filter nur eine Subtraktion und eine Addition, obwohl die Zahlen in der Regel größer als der Eingangswert sein müssen (mehr über die numerische Genauigkeit in einem separaten Abschnitt weiter unten). Ich normalerweise nehmen A / D-Messwerte 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 dB / Oktave über der Rolloff-Frequenz. Für A / D-Messungen ist dies jedoch üblicherweise relevanter, um das Filter im Zeitbereich zu betrachten, indem man seine Sprungantwort betrachtet. Dies zeigt Ihnen, wie schnell Ihr System eine Änderung sehen wird, wenn die Sache, die Sie messen, ändert. Zur Erleichterung der Gestaltung dieser Filter (was nur bedeutet Kommissionierung FF und entscheiden, wie viele von ihnen zu kaskadieren), benutze ich mein Programm FILTBITS. Sie legen die Anzahl der Schaltbits für jede FF in der kaskadierten Filterreihe fest und berechnen die Schrittantwort und andere Werte. Eigentlich habe ich in der Regel laufen diese über mein Wrapper-Skript PLOTFILT. Dies führt FILTBITS, die eine CSV-Datei macht, dann die CSV-Datei. Beispielsweise ist hier das Ergebnis von PLOTFILT 4 4: Die beiden Parameter zu PLOTFILT bedeuten, dass es zwei Filter gibt, die von dem oben beschriebenen Typ kaskadiert sind. Die Werte von 4 geben die Anzahl der Schaltbits an, um die Multiplikation mit FF zu realisieren. Die beiden FF-Werte sind in diesem Fall 1/16. Die rote Spur ist die Einheit Schritt Antwort, und ist die Hauptsache zu betrachten. Dies bedeutet beispielsweise, dass sich der Ausgang des kombinierten Filters auf 90 des neuen Wertes in 60 Iterationen niederschlägt, falls sich der Eingang sofort ändert. Wenn Sie ca. 95 Einschwingzeit kümmern, dann müssen Sie ca. 73 Iterationen warten, und für 50 Einschwingzeit nur 26 Iterationen. Die grüne Kurve zeigt Ihnen den Ausgang einer einzelnen Amplitude. Dies gibt Ihnen eine Vorstellung von der zufälligen Rauschunterdrückung. Es sieht aus wie keine einzelne Probe wird mehr als eine 2,5 Änderung in der Ausgabe verursachen. Die blaue Spur soll ein subjektives Gefühl geben, was dieser Filter mit weißem Rauschen macht. Dies ist kein strenger Test, da es keine Garantie gibt, was genau der Inhalt der Zufallszahlen war, die als der weiße Rauscheneingang für diesen Durchlauf von PLOTFILT ausgewählt wurden. Seine nur, um Ihnen ein grobes Gefühl, wie viel es gequetscht werden und wie glatt es ist. PLOTFILT, vielleicht FILTBITS, und viele andere nützliche Dinge, vor allem für PIC-Firmware-Entwicklung ist verfügbar in der PIC Development Tools-Software-Release auf meiner Software-Downloads-Seite. Hinzugefügt über numerische Genauigkeit Ich sehe aus den Kommentaren und nun eine neue Antwort, dass es Interesse an der Diskussion der Anzahl der Bits benötigt, um diesen Filter zu implementieren. Beachten Sie, dass das Multiplizieren mit FF Log 2 (FF) neue Bits unterhalb des Binärpunkts erzeugt. Bei kleinen Systemen wird FF gewöhnlich mit 1/2 N gewählt, so daß diese Multiplikation tatsächlich durch eine Rechtsverschiebung von N Bits realisiert wird. FILT ist daher meist eine feste Ganzzahl. Beachten Sie, dass dies ändert keine der Mathematik aus der Prozessoren Sicht. Wenn Sie beispielsweise 10-Bit A / D-Messwerte und N 4 (FF 1/16) filtern, benötigen Sie 4 Fraktionsbits unter den 10-Bit-Integer-A / D-Messwerten. Einer der meisten Prozessoren, youd tun 16-Bit-Integer-Operationen aufgrund der 10-Bit-A / D-Lesungen. In diesem Fall können Sie immer noch genau die gleichen 16-Bit-Integer-Opertions, aber beginnen mit der A / D-Lesungen um 4 Bits verschoben verschoben. Der Prozessor kennt den Unterschied nicht und muss nicht. Das Durchführen der Mathematik auf ganzen 16-Bit-Ganzzahlen funktioniert, ob Sie sie als 12,4 feste oder wahre 16-Bit-Ganzzahlen (16,0 Fixpunkt) betrachten. Im Allgemeinen müssen Sie jedem Filterpole N Bits hinzufügen, wenn Sie aufgrund der numerischen Darstellung kein Rauschen hinzufügen möchten. Im obigen Beispiel müsste das zweite Filter von zwei 1044 18 Bits haben, um keine Informationen zu verlieren. In der Praxis auf einer 8-Bit-Maschine bedeutet, dass youd 24-Bit-Werte verwenden. Technisch nur den zweiten Pol von zwei würde den größeren Wert benötigen, aber für Firmware Einfachheit ich in der Regel die gleiche Darstellung, und damit der gleiche Code, für alle Pole eines Filters. Normalerweise schreibe ich eine Unterroutine oder Makro, um eine Filterpol-Operation durchzuführen, dann gelten, dass für jeden Pol. Ob eine Unterroutine oder ein Makro davon abhängt, ob Zyklen oder Programmspeicher in diesem Projekt wichtiger sind. So oder so, ich benutze einige Scratch-Zustand, um NEU in die Subroutine / Makro, die FILT Updates, sondern auch lädt, dass in den gleichen Kratzer NEU war in. Dies macht es einfach, mehrere Pole anzuwenden, da die aktualisierte FILT von einem Pol ist Die NEUE der nächsten. Wenn ein Unterprogramm, ist es sinnvoll, einen Zeiger auf FILT auf dem Weg in, die auf nur nach FILT auf dem Weg nach draußen aktualisiert wird. Auf diese Weise arbeitet das Unterprogramm automatisch auf aufeinanderfolgenden Filtern im Speicher, wenn es mehrmals aufgerufen wird. Mit einem Makro benötigen Sie nicht einen Zeiger, da Sie in der Adresse passieren, um auf jeder Iteration zu arbeiten. Code-Beispiele Hier ein Beispiel für ein Makro wie oben für eine PIC 18 beschrieben: Und hier ist ein ähnliches Makro für eine PIC 24 oder dsPIC 30 oder 33: Beide Beispiele werden als Makros unter Verwendung meines PIC-Assembler-Präprozessors implementiert. Die mehr fähig ist als eine der eingebauten Makroanlagen. Clabacchio: Ein weiteres Thema, das ich erwähnen sollte, ist die Firmware-Implementierung. Sie können eine einpolige Tiefpassfilter-Subroutine einmal schreiben und dann mehrmals anwenden. Tatsächlich schreibe ich normalerweise solch eine Unterroutine, um einen Zeiger im Gedächtnis in den Filterzustand zu nehmen, dann ihn den Zeiger voranbringen lassen, so daß er nacheinander leicht aufgerufen werden kann, um mehrpolige Filter zu verwirklichen. Ndash Olin Lathrop Apr 20 12 at 15:03 1. Dank sehr viel für Ihre Antworten - alle von ihnen. Ich beschloss, dieses IIR-Filter zu verwenden, aber dieser Filter wird nicht als Standard-Tiefpaßfilter verwendet, da ich die Zählerwerte berechnen und sie vergleichen muss, um Änderungen in einem bestimmten Bereich zu erkennen. Da diese Werte von sehr unterschiedlichen Dimensionen abhängig von Hardware Ich wollte einen Durchschnitt nehmen, um in der Lage sein, auf diese Hardware spezifischen Änderungen automatisch reagieren. Wenn Sie mit der Beschränkung einer Macht von zwei Anzahl von Elementen zu durchschnittlich leben können (dh 2,4,8,16,32 etc), dann kann die Teilung einfach und effizient auf einem getan werden Low-Performance-Mikro ohne dedizierte Division, weil es als Bit-Shift durchgeführt werden kann. Jede Schicht rechts ist eine Macht von zwei zB: Der OP dachte, er hatte zwei Probleme, die Teilung in einem PIC16 und Speicher für seinen Ringpuffer. Diese Antwort zeigt, dass die Teilung nicht schwierig ist. Zwar adressiert es nicht das Gedächtnisproblem, aber das SE-System erlaubt Teilantworten, und Benutzer können etwas von jeder Antwort für selbst nehmen oder sogar redigieren und kombinieren andere39s Antworten. Da einige der anderen Antworten eine Divisionsoperation erfordern, sind sie ähnlich unvollständig, da sie nicht zeigen, wie dies auf einem PIC16 effizient erreicht werden kann. Ndash Martin Apr 20 12 at 13:01 Es gibt eine Antwort für einen echten gleitenden Durchschnitt Filter (auch bekannt als Boxcar-Filter) mit weniger Speicher Anforderungen, wenn Sie dont mind Downsampling. Es heißt ein kaskadiertes Integrator-Kamm-Filter (CIC). Die Idee ist, dass Sie einen Integrator, die Sie nehmen Differenzen über einen Zeitraum, und die wichtigsten Speicher-sparende 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 um Stateize Proben zu halten. Offensichtlich können Sie bessere Leistung erzielen, wenn Ihr stateize und decimationFactor Potenzen von 2 sind, so dass die Divisions - und Restoperatoren durch Shifts und Masken ersetzt werden. Postscript: Ich stimme mit Olin, dass Sie immer sollten einfache IIR-Filter vor einem gleitenden durchschnittlichen Filter. Wenn Sie die Frequenz-Nullen eines Boxcar-Filters nicht 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 (mit einer hohen Sample-Rate-Eingang und Mittelung es für die Verwendung durch einen Low-Rate-Prozess), dann kann ein CIC-Filter genau das, was Sie suchen. (Vor allem, wenn Sie stateize1 verwenden und den Ringbuffer insgesamt mit nur einem einzigen vorherigen Integrator-Wert zu vermeiden) Theres einige eingehende Analyse der Mathematik hinter der Verwendung der ersten Ordnung IIR-Filter, Olin Lathrop bereits beschrieben hat auf der Digital Signal Processing Stack-Austausch (Enthält viele schöne Bilder.) Die Gleichung für diese IIR-Filter ist: Dies kann mit nur Ganzzahlen und keine Division mit dem folgenden Code implementiert werden (möglicherweise benötigen einige Debugging, wie ich aus dem Speicher wurde.) Dieser Filter approximiert einen gleitenden Durchschnitt von Die letzten K Proben durch Einstellen des Wertes von alpha auf 1 / K. Führen Sie dies im vorherigen Code durch die Definition von BITS auf LOG2 (K), dh für K 16 gesetzt BITS auf 4, für K 4 gesetzt BITS auf 2, etc. (Ill Überprüfung der Code hier aufgelistet, sobald ich eine Änderung und Bearbeiten Sie diese Antwort, wenn nötig.) Antwort # 1 am: Juni 23, 2010, um 4:04 Uhr Heres ein einpoliges Tiefpassfilter (gleitender Durchschnitt, mit Cutoff-Frequenz CutoffFrequency). Sehr einfach, sehr schnell, funktioniert super, und fast kein Speicher Overhead. Hinweis: Alle Variablen haben einen Bereich über die Filterfunktion hinaus, mit Ausnahme des übergebenen newInput Hinweis: Dies ist ein einstufiger Filter. Mehrere Stufen können zusammen kaskadiert werden, um die Schärfe des Filters zu erhöhen. Wenn Sie mehr als eine Stufe verwenden, müssen Sie DecayFactor anpassen (was die Cutoff-Frequenz betrifft), um sie zu kompensieren. Und natürlich alles, was Sie brauchen, ist die beiden Zeilen überall platziert, brauchen sie nicht ihre eigene Funktion. Dieser Filter hat eine Rampenzeit, bevor der gleitende Durchschnitt diejenige des Eingangssignals darstellt. 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. (CutoffFrequency / SampleRate) einen Bereich zwischen 0 und 0,5 aufweist. DecayFactor ist ein Wert zwischen 0 und 1, in der Regel in der Nähe von 1. Single-precision Schwimmer sind gut genug für die meisten Dinge, ich bevorzuge nur Doppel. Wenn Sie mit ganzen Zahlen bleiben müssen, können Sie DecayFactor und Amplitude Factor in Fractional Integers umwandeln, in denen der Zähler als Integer gespeichert wird und der Nenner eine Ganzzahl von 2 ist (so können Sie Bit-Shift nach rechts als die Nenner, anstatt sich während der Filterschleife teilen zu müssen). Zum Beispiel, wenn DecayFactor 0.99, und Sie Ganzzahlen verwenden möchten, können Sie DecayFactor 0.99 65536 64881. Und dann immer wenn Sie multiplizieren mit DecayFactor in Ihrer Filterschleife, nur verschieben Sie das Ergebnis 16. Für weitere Informationen über dieses, ein ausgezeichnetes Buch thats Online, Kapitel 19 auf rekursive Filter: www. dspguide / ch19.htm PS Für das Moving Average-Paradigma, einen anderen Ansatz für die Einstellung DecayFactor und AmplitudeFactor, die möglicherweise mehr relevant für Ihre Bedürfnisse, können Sie sagen, dass Sie wollen, dass die vorherigen, etwa 6 Artikeln durchschnittlich zusammen, tun es diskret, fügen Sie 6 Elemente und teilen durch 6, so Können Sie den AmplitudeFactor auf 1/6 und DecayFactor auf (1.0 - AmplitudeFactor) einstellen. Antwortete May 14 12 at 22:55 Jeder andere hat kommentiert gründlich über den Nutzen der IIR vs FIR, und auf Power-of-two-Division. Id nur, um einige Implementierungsdetails zu geben. Das unten genannte funktioniert gut auf kleinen Mikrocontrollern ohne FPU. Es gibt keine Multiplikation, und wenn Sie N eine Potenz von zwei halten, ist die gesamte Division ein-Zyklus-Bit-Verschiebung. Basic FIR-Ringpuffer: Halten Sie einen laufenden Puffer der letzten N-Werte und einen laufenden SUM aller Werte im Puffer. Jedes Mal, wenn eine neue Probe kommt, subtrahieren Sie den ältesten Wert im Puffer von SUM, ersetzen Sie ihn durch das neue Sample, fügen Sie das neue SUM zu SUM hinzu und geben Sie SUM / N aus. Modifizierter IIR-Ringpuffer: Halten Sie einen laufenden SUM der letzten N-Werte. Jedes Mal, wenn ein neues Sample eingeht, SUM - SUM / N, fügen Sie das neue Sample hinzu und geben SUM / N aus. Antwort # 1 am: August 28, 2008, um 13:45 Uhr Wenn Sie 399m lesen Sie Recht, you39re beschreiben ein erster Ordnung IIR-Filter der Wert you39re subtrahieren isn39t der älteste Wert, der herausfällt, sondern ist stattdessen der Durchschnitt der vorherigen Werte. Erstklassige IIR-Filter können sicherlich nützlich sein, aber I39m nicht sicher, was du meinst, wenn Sie vorschlagen, dass der Ausgang ist der gleiche für alle periodischen Signale. Bei einer Abtastrate von 10 kHz liefert das Einspeisen einer 100 Hz-Rechteckwelle in ein 20-stufiges Kastenfilter ein Signal, das für 20 Abtastungen gleichmäßig ansteigt, für 30 sitzt, für 20 Abtastungen gleichmäßig sinkt und für 30 sitzt. Ein erster Ordnung IIR-Filter. Ndash Supercat Aug 28 13 bei 15:31 wird eine Welle, die scharf anfängt zu steigen und allmählich Niveaus in der Nähe (aber nicht auf) das Eingabe-Maximum, dann scharf beginnt zu fallen und schrittweise Niveaus in der Nähe (aber nicht auf) der Eingabe Minimum. Sehr unterschiedliches Verhalten. Ndash Supercat Ein Problem ist, dass ein einfacher gleitender Durchschnitt kann oder auch nicht nützlich sein. Mit einem IIR-Filter können Sie einen schönen Filter mit relativ wenigen Calcs erhalten. Die FIR Sie beschreiben kann Ihnen nur ein Rechteck in der Zeit - ein sinc in freq - und Sie können nicht die Seitenkeulen zu verwalten. Es kann lohnt sich, in ein paar ganzzahlige Multiplikatoren zu werfen, um es eine schöne symmetrische abstimmbare FIR, wenn Sie die Zeitschaltuhren ersparen können. Ndash ScottSeidman: Keine Notwendigkeit für Multiplikatoren, wenn man einfach jede Stufe der FIR entweder den Durchschnitt der Eingabe auf diese Stufe und ihre vorherigen gespeicherten Wert, und dann speichern Sie die Eingabe (wenn man hat Der numerische Bereich, man könnte die Summe anstatt den Durchschnitt verwenden). Ob das besser ist als ein Box-Filter, hängt von der Anwendung ab (die Sprungantwort eines Boxfilters mit einer Gesamtverzögerung von 1ms wird zum Beispiel eine böse d2 / dt-Spitze aufweisen, wenn der Eingang geändert wird, und wieder 1ms später, wird aber haben Die minimal mögliche d / dt für einen Filter mit einer Gesamtverzögerung von 1ms). Ndash supercat Wie mikeselectricstuff sagte, wenn Sie wirklich brauchen, um Ihren Speicherbedarf zu reduzieren, und Sie dont dagegen Ihre Impulsantwort ist eine exponentielle (anstelle eines rechteckigen Puls), würde ich für einen exponentiellen gleitenden durchschnittlichen Filter gehen . Ich nutze sie ausgiebig. Mit dieser Art von Filter, brauchen Sie nicht jeden Puffer. Sie brauchen nicht zu speichern N Vergangenheit Proben. Nur einer. So werden Ihre Speicheranforderungen um einen Faktor von N reduziert. Auch brauchen Sie keine Division für das. Nur Multiplikationen. Wenn Sie Zugriff auf Gleitpunktarithmetik haben, verwenden Sie Fließkomma-Multiplikationen. Andernfalls können ganzzahlige Multiplikationen und Verschiebungen nach rechts erfolgen. Allerdings sind wir im Jahr 2012, und ich würde Ihnen empfehlen, Compiler (und MCUs), mit denen Sie mit Gleitkommazahlen arbeiten können. Abgesehen davon, dass mehr Speicher effizienter und schneller (Sie dont haben, um Elemente in jedem kreisförmigen Puffer zu aktualisieren), würde ich sagen, es ist auch natürlich. Weil eine exponentielle Impulsantwort besser auf die Art und Weise reagiert, wie sich die Natur verhält, in den meisten Fällen. Ein Problem mit dem IIR-Filter fast berührt von Olin und Supercat, aber anscheinend von anderen ignoriert ist, dass die Rundung nach unten führt einige Ungenauigkeiten (und möglicherweise Bias / Trunkierung). Unter der Annahme, dass N eine Potenz von zwei ist und nur ganzzahlige Arithmetik verwendet wird, beseitigt das Shift-Recht systematisch die LSBs des neuen Samples. Das bedeutet, dass, wie lange die Serie jemals sein könnte, wird der Durchschnitt nie berücksichtigen. Nehmen wir z. B. eine langsam abnehmende Reihe (8,8,8,8,7,7,7,7,6,6) an und nehmen an, daß der Durchschnitt tatsächlich 8 ist. Die Faust 7 Probe bringt den Durchschnitt auf 7, unabhängig von der Filterstärke. Nur für eine Probe. Gleiche Geschichte für 6, usw. Jetzt denke an das Gegenteil. Die serie geht auf. Der Durchschnitt bleibt auf 7 für immer, bis die Probe groß genug ist, um es zu ändern. Natürlich können Sie für die Bias korrigieren, indem Sie 1 / 2N / 2, aber das nicht wirklich lösen, die Präzision Problem. In diesem Fall wird die abnehmende Reihe für immer bei 8 bleiben, bis die Probe 8-1 / 2 (N / 2) ist. Für N4 zum Beispiel, wird jede Probe über Null halten den Durchschnitt unverändert. Ich glaube, eine Lösung für das implizieren würde, um einen Akkumulator der verlorenen LSBs halten. Aber ich habe es nicht weit genug, um Code bereit, und Im nicht sicher, es würde nicht schaden, die IIR Macht in einigen anderen Fällen der Serie (zum Beispiel, ob 7,9,7,9 würde durchschnittlich 8 dann). Olin, Ihre zweistufige Kaskade würde auch eine Erklärung brauchen. Halten Sie zwei durchschnittliche Werte mit dem Ergebnis der ersten in die zweite in jeder Iteration eingezogen halten. Was ist der Vorteil dieses Embedded C Software Engineer Jobs Die folgende Tabelle ist für den Vergleich mit den oben genannten und bietet Statistiken für die gesamte Job-Titel-Kategorie in ständigen Arbeitsplätzen in ganz Großbritannien angekündigt. Die meisten offenen Stellen beinhalten eine erkennbare Job-Titel. Die Zahlen in der ersten Zeile geben somit einen Hinweis auf die Gesamtzahl der Dauerjobs in der Gesamtstichprobe. Indeed. de mein. indeed - einloggen - Einstellungen Job - Titel Job - Stellenangebote bundesweit Erhalten Sie Job-Emails für diese Suchanfrage Meine E-Mail-Adresse: Job-Emails können jederzeit wieder gelöscht werden Mehr als UK ohne London Median Gehalt Embedded C Software Engineer Jobs Demand Trend Die Nachfrage Trend von Stellenanzeigen, die Embedded C Software Engineer in der Berufsbezeichnung vorgestellten. Embedded C Software Engineer Gehaltstabelle Diese Grafik zeigt den dreimonatigen gleitenden Durchschnitt für Gehälter, die in permanenten IT-Jobs zitiert werden und zitieren Embedded C Software Engineer in Großbritannien. Embedded C Software Engineer Gehalt Histogramm Diese Grafik bietet ein Gehalt Histogramm für IT-Arbeitsplätze zitiert Embedded C Software Engineer über die 3 Monate bis 6. Oktober 2016 in Großbritannien. Embedded C Software Engineer Top 30 Job Locations Die folgende Tabelle zeigt die Nachfrage und bietet einen Leitfaden für die in den IT-Jobs zitierten mittleren Gehälter, die Embedded C Software Engineer innerhalb des Vereinigten Königreichs in den drei Monaten bis zum 6. Oktober 2016 nennen Angabe der Veränderung der Nachfrage in jedem Standort auf der Grundlage der gleichen 3 Monate Zeitraum im vergangenen Jahr. Ort (Klicken Sie auf detaillierte Statistiken und Trends) Rang Änderung auf die gleiche Zeit Letztes Jahr Matching Permanent IT Job-Anzeigen Median Gehalt Letzte 3 MonateEmbedded C Jobs Die Nachfrage Trend von Stellenanzeigen zitiert Embedded C als Anteil aller IT-Jobs mit einem Spiel in der Programmierung Sprachen. Eingebettete C-Gehaltstendenzen Diese Grafik zeigt den dreimonatigen Gleitendurchschnitt für Gehälter, die in permanenten IT-Jobs zitiert wurden und zitiert Embedded C in Großbritannien. Embedded C Gehalt Histogramm Dieses Diagramm bietet ein Gehalt Histogramm für IT-Arbeitsplätze zitiert Embedded C über die 3 Monate bis 6. Oktober 2016 in Großbritannien. Eingebettete C-Top-30-Arbeitsplätze Die folgende Tabelle zeigt die Nachfrage und stellt einen Leitfaden für die in den IT-Arbeitsplätzen zitierten mittleren Gehälter dar, auf die Embedded C innerhalb des Vereinigten Königreichs in den drei Monaten bis zum 6. Oktober 2016 hingewiesen wird In der Nachfrage innerhalb jedes Standortes auf der Grundlage der gleichen 3 Monate im vergangenen Jahr. Location (Klicken Sie auf detaillierte Statistiken und Trends) Rang Änderung auf die gleiche Zeit Letztes Jahr Matching Permanent IT Job-Anzeigen Median Gehalt Letzte 3 MonateDigital Filterung ohne die Schmerzen In meiner Bibliothek speichern Follow Comments Gary A. GeissingerSeptember 28, 2005 Vor ein paar Jahren, während der Lehre Ein Undergraduate-Kurs in Elektrotechnik, brauchte ich, um das Konzept der digitalen Filterung einzuführen. Der Trick war, einen Weg zu finden, das Material zu präsentieren, ohne (zumindest zunächst) auf fortgeschrittene mathematische Konzepte zu vertrauen. Dies ist der Ansatz, auf dem ich mich eingelebt habe. Mittelwert Erinnern Sie sich zurück in der Grundschule, als Sie über Durchschnitt gelernt haben Sie sind ein leistungsfähiges Werkzeug. Die meisten der Zeit ist ein Durchschnitt definiert als: Die Idee der Anpassung der Mittelwertbildung auf digitale Filterung ist, dass wenn Sie n laute Messungen haben, wird der Durchschnitt dieser Messungen geben Ihnen die beste Schätzung der wahre Natur von x. Diese Technik scheint wie ein Tiefpassfilter, aber in der Grundschule, dass Begriff hätte nicht viel Sinn gemacht. Wir betrachten den einfachsten Fall der Mittelung der Messwerte. In diesem Fall messen Sie das Signal mit einer festen Abtastrate. Die Messdaten können Sie mit einem Analog-Digital-Wandler (ADC) oder einem Voltmeter erhalten. Die einzige wirkliche Anforderung ist, dass ein fester Zeitabstand zwischen jeder Messung stattfindet. Der einfachste Durchschnitt, den Sie ausführen können, wäre: Die Implementierung ist ziemlich einfach. Fügen Sie einfach die aktuelle Messung der vorherigen Messung und dividieren durch die Anzahl der Messungen, in diesem Fall einfach zwei. Moving Average FIR-Filter Diese Art der Mittelung ist auch ein einfaches Beispiel für ein symmetrisches digitales Filter mit finiter Impulsantwort (FIR). Warum ist die Antwort endlich Da nur die letzten beiden Samples verwendet werden, stehen keine älteren Samples für die Berechnung zur Verfügung. Daher ist die Dauer der Probenbeeinflussung auf die Ausgabe begrenzt. Im DSP-Land könnte die Gleichung so aussehen: Die Indizes auf x und y geben nur das relative Alter der Daten und des Ergebnisses an. Ein paar Kommentare sind in Ordnung. Zuerst bemerken Sie, dass die Koeffizienten symmetrisch sind (beide sind 0,5), dh die Liste der Koeffizienten ist identisch, wenn sie vorwärts oder rückwärts untersucht wird. Diese numerische Palindrome scheint nicht wie eine große Sache hier mit nur zwei Koeffizienten, aber einige symmetrische FIR-Filter haben viele, viele Koeffizienten. Beachten Sie auch, dass dieses Filter eine Einheitsverstärkung für einen Gleichstromeingang hat. Immerhin ergibt der Durchschnitt zweier identischer Ablesungen den gleichen Wert wie die Ablesungen selbst. Was nicht so offensichtlich sein mag, ist, dass ein Eingang bei der Hälfte der Abtastrate vollständig abgebrochen wird, wie Sie in Abbildung 1 sehen können. Abbildung 1: Paarweise genommen summiert sich der abgetastete Eingang immer auf 0 Ein weiteres wichtiges Merkmal dieses Filters ist das Seine unbedingte Stabilität. Ohne Rückmeldung jeglicher Art muss diese Stabilität der Fall sein. Wie Sie später sehen werden, können nicht alle digitalen Filter diese Behauptung machen. Wenn Sie die Daten abgetastet haben, wussten Sie, wann die Proben entnommen wurden. Für welche Zeit ist die Ausgabe des Filters mit anderen Worten definiert, was ist die Verzögerung des Filters Intuitiv, da die Größe der Filter-Ausgang ist der Durchschnitt aus zwei aufeinander folgenden Samples, scheint es, wie die Filterverzögerung sollte auf halbem Weg zwischen den gemittelten Proben. Für ein Signal mit der Hälfte der Abtastrate wäre dies eine Verzögerung von 1/4 der Periode des Eingangs oder 90 Grad. Überprüfen der Filterleistung mithilfe von Matlab Wir haben ein wenig Mathe und viel Intuition verwendet, um die Filterleistung zu bestimmen. Ein Tool wie MATLAB kann uns ein wenig besseres Bild geben. Das in Listing 1 dargestellte MATLAB-Programm wurde verwendet. Listing 1: MATLAB-Programm zur Bestimmung der Filterleistung Die in Abbildung 2 dargestellte Größenverteilung verifiziert, dass die Verstärkung 1,0 bei Nullfrequenz ist und auf 0,0 fällt, wenn die Frequenz die Hälfte der Samplefrequenz beträgt. Abbildung 2: Einfache FIR-Amplitudenreaktion Das Phasendiagramm in Fig. 3 zeigt, daß das Filter eine lineare Verzögerung aufweist, die maximal 90 Grad bei einer Frequenz der halben Abtastrate beträgt. Abbildung 3: Einfache FIR-Phasenreaktion Manuelles Berechnen der symmetrischen FIR-Filterleistung Wenn youre wie ich, sind Sie verdächtig von Software-Werkzeugen, bis Sie die Mathe manuell tun. Für einen einfachen FIR-Filter ist das nicht zu hart. In Gleichung 3 geben die Indizes x und y das relative Alter der eingehenden Daten und die Filterausgabe an. Wir können die Gleichung für diesen Filter mit dem Einheitszeitverzögerungsoperator z neu schreiben. Der Z-Operator ist sehr praktisch. Es ermöglicht eine mathematische Analyse von Vorgängen, die auf Abtastung in konstanten Zeitintervallen beruhen. In einem mathematischen Ausdruck, wenn Daten mit z multipliziert werden. Der Exponent von z gibt das relative Alter der Daten an. Während eine allgemeine Diskussion von z-Transformationen über den Rahmen dieses Artikels hinausgeht, können einfache Anwendungen von z-Transformationen sehr nützlich sein. Mit Hilfe des z-Operators kann Gleichung 4 in die folgende Form gebracht werden: X (z) bezeichnet eine Zeitreihe von Dateneingaben in den Filter Y (z) bezeichnet eine Zeitreihe der Filterausgänge. In diesem Fall ist die Übertragungsfunktion (der Begriff, der die Eingabe in den Ausgang umwandelt) definiert als: In die übliche DSP-Terminologie gegossen, ist es unser Ziel, die Eigenschaften unserer Übertragungsfunktion zu finden. Anstatt verbringen ein Semester in einem linearen Systems natürlich, für jetzt können wir nur ein paar Fakten über Z-Transformationen, die wir benötigen. Das erste Z kann folgendermaßen definiert werden: Eine Notiz über j. Nein, Sie können nicht nehmen die Quadratwurzel von -1, aber denken Sie an die Eigenschaften, die j haben würde. Wenn j mit j multipliziert wird. Das Ergebnis ist -1. Zwei Terme mit j können zusammen addiert werden. Also ist j wirklich nur ein Operator, der sich wie die Quadratwurzel von -1 verhalten würde. Eine leichte Abschweifung hier, um über die maximale Bandbreite von digitalen Filtern zu sprechen. Die maximale Ausgangsbandbreite eines digitalen Filters ist definiert als weniger als die Hälfte der Abtastrate und wird als Basisband bezeichnet. Wenn die Abtastrate als 2pi angesehen wird, dann sollte die Festlegung der Frequenz Omega zwischen 0 und pi vollkommen sinnvoll sein. Denken Sie daran, unser Ziel hier: finden Sie die Filterantwort als Funktion der Frequenz. Der Plan, mathematisch gesprochen, ist, die z Ausdrücke in den Gleichungen so schnell wie möglich loszuwerden. Sie können dies mit einem kleinen Trigne um Eulers Formel in die Form umschreiben: Können wir unsere Gleichung in dieser Form Ja, wenn wir uns erinnern, dass beide Koeffizienten identisch sind und ein wenig Mathematik Schritt für Schritt: Über diese Zeit können Sie betrachten Gleichung 9 und versucht zu sagen, einfach großartig. Und jetzt, was bedeutet das? Es gibt drei Bedingungen zu beachten. Der konstante Term 2 b 0 ist einfach 2 0,5 oder nur 1. hat eine konstante Größe von 1, aber seine Phase variiert linear mit der Frequenz. Diese Variante ist der Grund, warum symmetrische FIR-Filter eine lineare Phasenleistung haben sollen. Übrigens ist die lineare Phasenleistung eine sehr gute Sache. Es minimiert Verzerrungen der gefilterten Daten. Hat eine Amplitude, die mit der Frequenz variiert. Wenn Omega Null ist, ist die Amplitude 1. Wenn Omega gleich pi ist, ist die Amplitude Null. Dies dupliziert unser Verständnis des Filters aus der Intuition. Die tatsächliche Kurve ist in Abbildung 4 dargestellt. Abbildung 4: Zwei-Punkt-Mittelwertreaktion Wie Sie sehen können, ist es ziemlich einfach, die Leistung eines Filters mit nur zwei Taps vorherzusagen. Wie Sie sich vorstellen können, steigt, wenn die Anzahl der Koeffizienten zunimmt, die Leistung des Filters ebenfalls. Natürlich haben wir aus dem Blickwinkel der Filterkonstruktion im vorherigen Beispiel das Problem rückwärts gelöst. Jetzt können Sie versuchen, in die andere Richtung. Manuelles Design eines FIR-Filters Sie können FIR-Filter von Hand entwerfen. Fügen Sie die Einschränkung hinzu, dass, wenn die Eingangsfrequenz ein Viertel der Abtastrate beträgt, die Verstärkung des Filters 0,5 ist. Wir wollen weiterhin, dass der Filter ein Tiefpaßfilter mit einer Eins-Verstärkung bei einer Nullfrequenz und einer Verstärkung von Null bei der Hälfte der Abtastrate ist. Weil wir nur eine weitere Einschränkung hinzugefügt haben, müssen wir noch einen weiteren Koeffizienten hinzufügen. Da wir Pairing-Begriffe wollen, wenn Sie zunächst eine geringe Anzahl von Taps haben, können Sie nur einen Koeffizienten hinzufügen. Wenn Sie eine ungerade Anzahl von Taps haben, müssen Sie zwei hinzufügen. Da der ursprüngliche Filter zwei Anzapfungen aufweist, benötigen wir drei Übertragungsfunktionen: Da mit symmetrischen FIR-Filtern gearbeitet wurde, werden die ersten und letzten Anzapfungen gepaart, so dass die Koeffizienten identisch sein müssen. Die Arbeit der Mathematik ergibt: Wieder gibt die verbleibende Exponential nur die Filterverzögerung in diesem Fall ist es ein Zeitschritt. Die Amplitude des Filters ist durch den zweiten Term gegeben. Man braucht eine Algebra, um die beiden Koeffizienten zu berechnen. Der Cos-Term verschwindet, wenn omega pi / 2. Bei dieser Frequenz wollen wir die Antwort 0,5, also b 1 0,5. Wenn die Frequenz 0 ist, wollen wir, dass die Antwort 1 ist, also b 0 0,25. Wenn diese Kurve aufgetragen wird, ergibt diese Reaktion die in Fig. 5 gezeigte Kurve. Fig. 5: Dreiwege-FIR-Filterstärkenreaktion Zwei Eigenschaften eines beliebigen symmetrischen FIR-Filters können nun verstanden werden. Zunächst nimmt die Verzögerung durch das Filter zu, wenn die Anzahl der Ausdrücke (oder Taps) zunimmt. Die Verzögerung beträgt die Hälfte der Gesamtverzögerung im Filter. Zweitens kann, wenn die Anzahl der Begriffe in dem Filter erhöht wird, das Filter an mehr und mehr Punkten spezifiziert werden. Es ist offensichtlich, dass mit diesem Ansatz es möglich ist, Tiefpass-, Hochpass - und Bandpassfilter unter Verwendung von Algebra zu entwerfen. Wie Sie addieren Koeffizienten, erhöht die Höhe der Berechnung schließlich seine ziemlich unfabelbar, um die Mathematik von Hand zu tun. Dieser Prozess wurde automatisiert in Software-Algorithmen oft angewendet werden die Parks-McClelland und Remez Austausch-Algorithmen. Ein weiterer Kommentar: echte Brick-Wall-Filter erfordern unendlich viele Taps, aber ein symmetrischer FIR-Filter mit mehreren tausend Taps entworfen kann ziemlich gut aussehen Entwerfen eines FIR-Filter mit MATLAB Entwirft einen Filter, der eine Anwendung im Amateurfunk hat. Der Dovetron MPC-1000R Funk-Teletype-Demodulator verwendet separate Superheterodyne-Empfänger für die Markierungs - und Raumtöne mit einer Zwischenfrequenz (IF) von 750 Hz. Das MATLAB-Programm in Listing 2 erzeugt ein 750Hz-ZF-Filter unter Verwendung von DSP anstelle von aktiven Operationsverstärkern. Listing 2: MATLAB-Programm zur Bestimmung der Filterleistung Das Programm erzeugte den Filter mit 179 Koeffizienten, die in Abbildung 6 dargestellt sind. Natürlich würde jeder, der analoge Filter verwendet, diesen Filter wirklich hassen. Die Durchlaßbandwelligkeit scheint hoch und die Out-of-Band-Abweisung ist lausig, bei 30 dB. Sie können die Ripple-Parameter ändern und einen besseren, in Abbildung 7 dargestellten Filter erstellen. Abbildung 6: DoRemez-Magnitudenreaktion Diese Leistungsverbesserung erfordert natürlich mehr Koeffizienten. In diesem Fall waren 369 erforderlich. Das bedeutet, dass mindestens 369 Additionen und 185 Multiplikationen 8.000 mal pro Sekunde durchgeführt werden müssen, um den Filter auf dem neuesten Stand zu halten. Da ein Funkfernschreiber-Demodulator zwei dieser Filter und den Rest des Codes erfordern würde, können perfekte Filter Sie aus CPU-Zyklen herausführen. Sie sollten erwarten, Kompromisse auf Filter Länge (und damit Leistung) in realen Anwendungen. Vielleicht gibt es einen rechnerisch effizienteren Weg, einen digitalen Filter zu implementieren. Dies erfordert, dass wir auf das Konzept der Mittelwerte zurückgreifen. Optimierte Durchschnittsberechnung Lets sagen, dass Sie den Durchschnitt der letzten 100 Datenproben berechnen möchten. Dies könnte unter Verwendung des folgenden Ausdrucks erfolgen: Mit diesem Ansatz müssen Sie an den letzten 100 Samples hängen. Um das neue Ergebnis zu berechnen, wird die älteste Probe weggeworfen und die neueste Probe eingefügt. Dies scheint ziemlich ineffizient, rechnerisch. Vielleicht können Sie eine ähnliche Wirkung ohne all die Komplexität zu bekommen. Wenn Sie eine Minute lang darüber nachdenken, hängt nur ein Prozent des Ergebnisses von der letzten Datenstichprobe ab. Die restlichen 99 hängt von den vorherigen Proben ab. Probieren Sie es einfach aus: Diese Berechnung hat eine DC-Verstärkung von 1, und der neueste Messwert wird wie gewünscht auf 1 gewichtet. Seine auch viel schneller zu berechnen und nur die vorherige Schätzung und ein neues Muster erforderlich sind, um den Filter zu aktualisieren. Wegen der Rückkopplung (unter Verwendung der vorherigen Schätzung) ist dies ein unendlicher Impulsantwort (IIR) - Filter Warum ist das der Fall Nun, darüber nachzudenken, was passiert, wenn Sie eine wirklich schlechte Lesung zu bekommen. Nach jeder neuen Probe wird der Effekt der schlechten Probe nur um den Faktor 0,99 reduziert. In einer realistischen DSP-Implementierung ist der Effekt einer schlechten Probe nicht wirklich unendlich, aber es kann eine sehr lange Zeit dauern. Dieses Beispiel eines einfachen IIR-Filters lohnt es sich zu erinnern. Es funktioniert ganz gut, wenn sorgfältig implementiert und kann eine sehr lange Zeit konstant. Es macht eine große variable Bandbreite Tiefpassfilter nur zwei Koeffizienten müssen angepasst werden, um die Bandbreite zu ändern. Die IIR-Filtertransferfunktion Die Gleichung für das, was wir gerade erreicht haben, könnte folgendermaßen geschrieben werden: Mit einer kleinen Algebra können wir die Übertragungsfunktion erreichen: In einem Standardformat wird der Zählerkoeffizientenvektor der Übertragungsfunktion mit dem Namen b bezeichnet. Der Nennerkoeffizientenvektor wird aufgerufen ein. Das folgende MATLAB-Programm wurde verwendet, um die Filterantwort zu zeichnen: Die Amplitudenreaktionskurve in 8 zeigt eine steile Tiefpassantwort. Wie Sie sehen können, hat dieser Filter beeindruckende Leistung angesichts der einfachen Mathematik. Können Sie kombinieren die einfache FIR und IIR Filter, die geprüft wurden sicher. Abbildung 8: Einfache IIR-Größenreaktion Kombinierte (Kaskadierungs-) Filter Die FIR-Übertragungsfunktion, die wir grundsätzlich gefunden haben, lautet: Gleichung 16 kann mit der IIR-Übertragungsfunktion multipliziert werden, was zu einer neuen Übertragungsfunktion führt: Dieses neue IIR-Filter in Abbildung 9 , Hat die Eigenschaften der beiden vorherigen Filter. Abbildung 9: Kombinierte IIR-Größenreaktion Die Charakteristiken umfassen die steile Tiefpasskurve des IIR-Filters mit der 0-Verstärkung bei der Hälfte der Abtastfrequenz des FIR-Filters. Da der neue Filter einen vorherigen Filterausgangswert verwendet, muss der Filter immer noch ein IIR-Filter sein. Die meisten praktischen IIR-Filter verwenden eine Zeitreihe sowohl der Eingangsabtastwerte als auch der Filterausgänge. IIR-Filter haben keine lineare Phasenreaktion, wie Sie in Abbildung 10 sehen können. Abbildung 10: Kombinierte IIR-Phasenantwort Da es möglich ist, Bessel-Filter mit einem IIR-Design zu realisieren, kann diese Begrenzung in den meisten Fällen gemildert werden. IIR-Filter und Stabilität Betrachten wir das soeben beschriebene IIR-Filterbeispiel mit einer konstanten Eingangsamplitude von 1,0. Was passiert, wenn aufgrund eines numerischen Fehlers ist der 0,99 Koeffizient tatsächlich 1,0 Wie Sie in Tabelle 1 sehen können, steigt die Ausgabe mit jeder Probe. Bei genügend Zeit, wird der geschätzte Wert ziemlich groß und schließlich Absturz des Prozesses. Es dauert nicht viel für einen IIR-Filter instabil zu gehen. Da ein IIR-Filter Feedback verwendet, kann es offensichtlich instabil sein, wenn es nicht richtig konzipiert ist. Wie Sie am Beispiel sehen können, muss der Filter auch korrekt implementiert werden. Es ist möglich - und ziemlich einfach - zu ermitteln, ob ein gegebenes IIR-Filter stabil im Entwurf ist: 1. Multiplizieren Sie immer alle Terme im Nenner der Übertragungsfunktion mit z, bis alle Potenzen von z ungleich Null sind. Dies ergibt ein Polynom in z im Nenner. 2. Lösen Sie für z im Polynom des Nenners. 3. Alle Wurzeln dieses Nennerpolynoms (oft Pole genannt) müssen kleiner als eine Größe sein. Dies wird üblicherweise als angegeben: Die im Nenner einer Übertragungsfunktion fälligen Pole müssen sich innerhalb der Einheitsscheibe befinden. Schließlich hat jedes gegebene DSP-System aufgrund von numerischen Fehlern in der Regel eine praktische Grenze für die Anzahl von Begriffen (Taps), die mit einem IIR-Filter sicher sind. Es kann so wenige wie 15 oder 20 Nenner Koeffizienten. Bei einer praktischen Begrenzung der Anzahl der Begriffe in einem IIR-Filter gibt es einen Weg um das Problem, wenn ein Hochleistungs-IIR-Filter benötigt wird. Ein langes IIR-Filter kann in kleinere Filter unterteilt werden, die partielle Bruchdehnung und kaskadiert verwenden. Oder einfach Kaskade kürzer identischen IIR-Filter-Abschnitte, bis Sie die gewünschte Leistung erhalten. Beide Lösungen werden häufig in realen Designs verwendet. Software-Design von IIR-Filtern IIR-Filter können entworfen werden, um traditionelle Filtercharakteristiken wie Butterworth, Bessel, Cauer und Chebyshev-Filter zu implementieren. Wegen der langen Datenhaltung in IIR-Filtern kann ein IIR-Filter von bescheidener Länge die gleiche Grundamplitudenleistung wie ein FIR-Filter mit vielen weiteren Anzapfungen aufweisen. Hier ist ein MATLAB-Programm, das ein Bessel-Filter ähnlich dem FIR-basierten IF-Filter entwirft, den wir vorher entworfen haben. Dieses Programm erzeugt eine Übertragungsfunktion mit nur 15 Zählerkoeffizienten und 15 Nennerkoeffizienten. Das bedeutet, dass die Filteraktualisierung nur 30 Additionen und 30 Multiplikationen erfordert. Die Filterleistung, die in Fig. 11 gezeigt ist, ist unter Berücksichtigung der kleinen Anzahl von Koeffizienten gut. Fig. 11: Bessel-diskrete Bandpass-Magnitude-Bessel-Filter werden wegen der linearen Phasencharakteristiken im Durchlaßband verwendet. Beachten Sie, wie linear sich die Phase von etwa 720 auf 790Hz in Abbildung 12 ändert. Abbildung 12: Bessel diskrete Bandpaßgröße Sie müssen sich bewusst sein, dass die Diskontinuitäten aus der Phasenverpackung im Plot stammen. Der nichtlineare Anteil ist am besten von 600 bis 700 Hz und 800 bis 900 Hz zu sehen. Mit jedem Glück wird es nicht viel Energie durch den Filter in dieser Region passiert. Zurück in die Klasse Neben der Art und Weise, war das letzte Projekt in der Klasse, ein komplettes DSP-Äquivalent des Dovetron MPC-1000R Demodulator zu entwerfen. Als die Schüler fertig kodierten ihre Projekte und debugged sie, hatten sie FSK Modulation und Demodulation sowie Radio-Fernschreiben Übertragung und Empfang ziemlich gut herausgefunden. Mehr als ein Interesse für Amateurfunk Gary Geissinger ist Chef Elektroingenieur bei DigitalGlobe Inc und lehrt Senior-und Graduate-Level-Hardware-und Software-Interface-Klassen an der University of Colorado. Sie erreichen ihn bei ggeissingerdigitalglobe. Quellen: Oppenheim, A. V. und R. W. Schafer. Digitale Signalverarbeitung . Prentice-Hall, Inc. 1975. Rabiner, L. R. und B. Gold. Theorie und Anwendung der digitalen Signalverarbeitung. Prentice-Hall, Inc. 1975. Stearns, S. D. und R. A. David. Signalverarbeitungsalgorithmen. Englewood Cliffs: Prentice-Hall, Inc. 1988. Mitra, S. K. Digitale Signalverarbeitung: ein computerbasierter Ansatz. McGraw-Hill, 2001. Rorabaugh, C. B. Digital-Filter-Designer-Handbuch. McGraw-Hill, 1993. Lathi, B. P. Lineare Systeme und Signale. Berkeley-Cambridge, 1992 Durchschnittswerte / Einfacher gleitender Durchschnitt Durchschnittswerte / Einfacher gleitender Durchschnitt Sie werden aufgefordert, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, indem Sie jede beliebige Sprache verwenden. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktion / Klasse / Instanz, die einen Punkt dauert und gibt eine Routine zurück, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zurückgibt. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160-Nummern aus dem Strom 160, wobei 160 P 160 als Periode bekannt ist. Sie kann implementiert werden, indem eine Initialisierungsroutine mit 160 P 160 als Argument 160 I (P) 160 aufgerufen wird, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen aufeinanderfolgenden Elementen eines Stroms von Zahlen aufgerufen wird, den Mittelwert von (up To), die letzten 160 P 160 von ihnen, rufen Sie diese 160 SMA (). Das Wort 160 stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit für 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Der Zeitraum 160 P 160 Ein geordneter Container von mindestens den letzten 160 P 160 Nummern von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe von 160 I (), 160 der Initialisierer, 160 separate Routinen zurückgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die letzten p-Werte zu halten. Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Zustand in einem Atom mit einem Queue-Wert. Diese Implementierung verwendet eine zirkuläre Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der sich gerade aus dem Fenster bewegt und durch den gerade addierten Wert ersetzt wird. Verwenden eines Closure-Edit derzeit Diese sma kann nicht nogc, weil es eine Schließung auf dem Heap zugeordnet. Einige Escape-Analyse konnte die Heap-Zuweisung entfernen. Verwenden einer Strukturbearbeitung Diese Version vermeidet die Heapzuweisung des Verschlusses, der die Daten im Stapelrahmen der Hauptfunktion hält. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Näherungen aufeinandertreiben und wachsen, kann der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Zustand teilen. Es ist idiomatisch in E, die Eingabe von der Ausgabe (Lesen von Schreiben) zu trennen, anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixierprogramm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die run-Funktion liest die numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Verschlüsse, aber unveränderliche Variablen. Eine Lösung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte für eine gegebene Reihenfolge von Elementen zu berechnen. Es ist weniger effizient Schleife wie in den folgenden Befehlen. Fordert kontinuierlich einen Eingang I auf. Die dem Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS gefunden werden. Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisieren der gleitenden Durchschnittsberechnung und Definieren des Zeitraums von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3), und das Ergebnis wird auf der Variablen x gespeichert und movinav2 (4, : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) / 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Indexvariable und zeigt auf das Ende der Unterliste die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste bei der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen p Elemente berücksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewöhnlich negativ sein, so daß die folgende Gleichung negative Indexe vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen ist ebenfalls kleiner, der korrekte Wert (Endindex - Anfangsindex 1) oder die Anordnung der Gleichung (i - (max (ip, 0) 1) 1) , (I-max (ip, 0)). Die Variable z enthält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) .) Summiert sie sum (.) / (Iz) ri wird sie mitteln und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern Verwenden eines Schließens und Erstellen einer Funktion


No comments:

Post a Comment