Eingebettetes C Moving Average




Eingebettetes C Moving AverageWie andere schon erwahnt 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 Aquivalent eines einfachen R-C-Analogfilters. Fur 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 dampfen, 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 Stuck persistenter Zustand. Dies ist die einzige persistente Variable, die Sie benotigen, 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 fur FF 0 der Filter unendlich schwer ist, da sich der Ausgang nie andert. Fur FF 1 ist das eigentlich gar kein Filter, da der Ausgang nur dem Eingang folgt. Nutzliche Werte sind dazwischen. Bei kleinen Systemen wahlen 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 benotigt dieses Filter nur eine Subtraktion und eine Addition, obwohl die Zahlen in der Regel gro?er als der Eingangswert sein mussen (mehr uber die numerische Genauigkeit in einem separaten Abschnitt weiter unten). Ich normalerweise nehmen A / D-Messwerte deutlich schneller als sie benotigt werden und wenden Sie zwei dieser Filter kaskadiert. Dies ist das digitale Aquivalent von zwei R-C-Filtern in Serie und dampft um 12 dB / Oktave uber der Rolloff-Frequenz. Fur A / D-Messungen ist dies jedoch ublicherweise relevanter, um das Filter im Zeitbereich zu betrachten, indem man seine Sprungantwort betrachtet. Dies zeigt Ihnen, wie schnell Ihr System eine Anderung sehen wird, wenn die Sache, die Sie messen, andert. 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 fur jede FF in der kaskadierten Filterreihe fest und berechnen die Schrittantwort und andere Werte. Eigentlich habe ich in der Regel laufen diese uber mein Wrapper-Skript PLOTFILT. Dies fuhrt 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 niederschlagt, falls sich der Eingang sofort andert. Wenn Sie ca. 95 Einschwingzeit kummern, dann mussen Sie ca. 73 Iterationen warten, und fur 50 Einschwingzeit nur 26 Iterationen. Die grune Kurve zeigt Ihnen den Ausgang einer einzelnen Amplitude. Dies gibt Ihnen eine Vorstellung von der zufalligen Rauschunterdruckung. Es sieht aus wie keine einzelne Probe wird mehr als eine 2,5 Anderung in der Ausgabe verursachen. Die blaue Spur soll ein subjektives Gefuhl 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 fur diesen Durchlauf von PLOTFILT ausgewahlt wurden. Seine nur, um Ihnen ein grobes Gefuhl, wie viel es gequetscht werden und wie glatt es ist. PLOTFILT, vielleicht FILTBITS, und viele andere nutzliche Dinge, vor allem fur PIC-Firmware-Entwicklung ist verfugbar in der PIC Development Tools-Software-Release auf meiner Software-Downloads-Seite. Hinzugefugt uber numerische Genauigkeit Ich sehe aus den Kommentaren und nun eine neue Antwort, dass es Interesse an der Diskussion der Anzahl der Bits benotigt, um diesen Filter zu implementieren. Beachten Sie, dass das Multiplizieren mit FF Log 2 (FF) neue Bits unterhalb des Binarpunkts erzeugt. Bei kleinen Systemen wird FF gewohnlich mit 1/2 N gewahlt, so da? diese Multiplikation tatsachlich durch eine Rechtsverschiebung von N Bits realisiert wird. FILT ist daher meist eine feste Ganzzahl. Beachten Sie, dass dies andert keine der Mathematik aus der Prozessoren Sicht. Wenn Sie beispielsweise 10-Bit A / D-Messwerte und N 4 (FF 1/16) filtern, benotigen 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 konnen 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 Durchfuhren 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 mussen Sie jedem Filterpole N Bits hinzufugen, wenn Sie aufgrund der numerischen Darstellung kein Rauschen hinzufugen mochten. Im obigen Beispiel musste 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 wurde den gro?eren Wert benotigen, aber fur Firmware Einfachheit ich in der Regel die gleiche Darstellung, und damit der gleiche Code, fur alle Pole eines Filters. Normalerweise schreibe ich eine Unterroutine oder Makro, um eine Filterpol-Operation durchzufuhren, dann gelten, dass fur jeden Pol. Ob eine Unterroutine oder ein Makro davon abhangt, 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 ladt, 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 nachsten. 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 benotigen Sie nicht einen Zeiger, da Sie in der Adresse passieren, um auf jeder Iteration zu arbeiten. Code-Beispiele Hier ein Beispiel fur ein Makro wie oben fur eine PIC 18 beschrieben: Und hier ist ein ahnliches Makro fur eine PIC 24 oder dsPIC 30 oder 33: Beide Beispiele werden als Makros unter Verwendung meines PIC-Assembler-Praprozessors implementiert. Die mehr fahig ist als eine der eingebauten Makroanlagen. Clabacchio: Ein weiteres Thema, das ich erwahnen sollte, ist die Firmware-Implementierung. Sie konnen eine einpolige Tiefpassfilter-Subroutine einmal schreiben und dann mehrmals anwenden. Tatsachlich schreibe ich normalerweise solch eine Unterroutine, um einen Zeiger im Gedachtnis 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 fur 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 Zahlerwerte berechnen und sie vergleichen muss, um Anderungen in einem bestimmten Bereich zu erkennen. Da diese Werte von sehr unterschiedlichen Dimensionen abhangig von Hardware Ich wollte einen Durchschnitt nehmen, um in der Lage sein, auf diese Hardware spezifischen Anderungen automatisch reagieren. Wenn Sie mit der Beschrankung einer Macht von zwei Anzahl von Elementen zu durchschnittlich leben konnen (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 durchgefuhrt 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 fur seinen Ringpuffer. Diese Antwort zeigt, dass die Teilung nicht schwierig ist. Zwar adressiert es nicht das Gedachtnisproblem, aber das SE-System erlaubt Teilantworten, und Benutzer konnen etwas von jeder Antwort fur selbst nehmen oder sogar redigieren und kombinieren andere39s Antworten. Da einige der anderen Antworten eine Divisionsoperation erfordern, sind sie ahnlich unvollstandig, 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 fur 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 uber einen Zeitraum, und die wichtigsten Speicher-sparende Gerat ist, dass durch Downsampling, mussen Sie nicht jeden Wert des Integrators zu speichern. Es kann mit dem folgenden Pseudocode implementiert werden: Ihre effektive gleitende durchschnittliche Lange ist decimationFactorstatesize, aber Sie mussen nur um Stateize Proben zu halten. Offensichtlich konnen 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 benotigen, wird ein 1-poliger oder 2-poliger Tiefpassfilter wahrscheinlich gut funktionieren. Auf der anderen Seite, wenn Sie fur die Zwecke der Dezimierung filtern (mit einer hohen Sample-Rate-Eingang und Mittelung es fur 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 (Enthalt viele schone Bilder.) Die Gleichung fur diese IIR-Filter ist: Dies kann mit nur Ganzzahlen und keine Division mit dem folgenden Code implementiert werden (moglicherweise benotigen 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. Fuhren Sie dies im vorherigen Code durch die Definition von BITS auf LOG2 (K), dh fur K 16 gesetzt BITS auf 4, fur K 4 gesetzt BITS auf 2, etc. (Ill Uberprufung der Code hier aufgelistet, sobald ich eine Anderung und Bearbeiten Sie diese Antwort, wenn notig.) 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 uber die Filterfunktion hinaus, mit Ausnahme des ubergebenen newInput Hinweis: Dies ist ein einstufiger Filter. Mehrere Stufen konnen zusammen kaskadiert werden, um die Scharfe des Filters zu erhohen. Wenn Sie mehr als eine Stufe verwenden, mussen Sie DecayFactor anpassen (was die Cutoff-Frequenz betrifft), um sie zu kompensieren. Und naturlich alles, was Sie brauchen, ist die beiden Zeilen uberall 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 mussen, konnen 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 Nahe von 1. Single-precision Schwimmer sind gut genug fur die meisten Dinge, ich bevorzuge nur Doppel. Wenn Sie mit ganzen Zahlen bleiben mussen, konnen Sie DecayFactor und Amplitude Factor in Fractional Integers umwandeln, in denen der Zahler als Integer gespeichert wird und der Nenner eine Ganzzahl von 2 ist (so konnen Sie Bit-Shift nach rechts als die Nenner, anstatt sich wahrend der Filterschleife teilen zu mussen). Zum Beispiel, wenn DecayFactor 0.99, und Sie Ganzzahlen verwenden mochten, konnen Sie DecayFactor 0.99 65536 64881. Und dann immer wenn Sie multiplizieren mit DecayFactor in Ihrer Filterschleife, nur verschieben Sie das Ergebnis 16. Fur weitere Informationen uber dieses, ein ausgezeichnetes Buch thats Online, Kapitel 19 auf rekursive Filter: www. dspguide / ch19.htm PS Fur das Moving Average-Paradigma, einen anderen Ansatz fur die Einstellung DecayFactor und AmplitudeFactor, die moglicherweise mehr relevant fur Ihre Bedurfnisse, konnen Sie sagen, dass Sie wollen, dass die vorherigen, etwa 6 Artikeln durchschnittlich zusammen, tun es diskret, fugen Sie 6 Elemente und teilen durch 6, so Konnen Sie den AmplitudeFactor auf 1/6 und DecayFactor auf (1.0 - AmplitudeFactor) einstellen. Antwortete May 14 12 at 22:55 Jeder andere hat kommentiert grundlich uber 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 altesten Wert im Puffer von SUM, ersetzen Sie ihn durch das neue Sample, fugen 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, fugen 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 alteste Wert, der herausfallt, sondern ist stattdessen der Durchschnitt der vorherigen Werte. Erstklassige IIR-Filter konnen sicherlich nutzlich sein, aber I39m nicht sicher, was du meinst, wenn Sie vorschlagen, dass der Ausgang ist der gleiche fur alle periodischen Signale. Bei einer Abtastrate von 10 kHz liefert das Einspeisen einer 100 Hz-Rechteckwelle in ein 20-stufiges Kastenfilter ein Signal, das fur 20 Abtastungen gleichma?ig ansteigt, fur 30 sitzt, fur 20 Abtastungen gleichma?ig sinkt und fur 30 sitzt. Ein erster Ordnung IIR-Filter. Ndash Supercat Aug 28 13 bei 15:31 wird eine Welle, die scharf anfangt zu steigen und allmahlich Niveaus in der Nahe (aber nicht auf) das Eingabe-Maximum, dann scharf beginnt zu fallen und schrittweise Niveaus in der Nahe (aber nicht auf) der Eingabe Minimum. Sehr unterschiedliches Verhalten. Ndash Supercat Ein Problem ist, dass ein einfacher gleitender Durchschnitt kann oder auch nicht nutzlich sein. Mit einem IIR-Filter konnen Sie einen schonen Filter mit relativ wenigen Calcs erhalten. Die FIR Sie beschreiben kann Ihnen nur ein Rechteck in der Zeit - ein sinc in freq - und Sie konnen nicht die Seitenkeulen zu verwalten. Es kann lohnt sich, in ein paar ganzzahlige Multiplikatoren zu werfen, um es eine schone symmetrische abstimmbare FIR, wenn Sie die Zeitschaltuhren ersparen konnen. Ndash ScottSeidman: Keine Notwendigkeit fur 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 konnte die Summe anstatt den Durchschnitt verwenden). Ob das besser ist als ein Box-Filter, hangt von der Anwendung ab (die Sprungantwort eines Boxfilters mit einer Gesamtverzogerung von 1ms wird zum Beispiel eine bose d2 / dt-Spitze aufweisen, wenn der Eingang geandert wird, und wieder 1ms spater, wird aber haben Die minimal mogliche d / dt fur einen Filter mit einer Gesamtverzogerung 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), wurde ich fur 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 fur das. Nur Multiplikationen. Wenn Sie Zugriff auf Gleitpunktarithmetik haben, verwenden Sie Flie?komma-Multiplikationen. Andernfalls konnen ganzzahlige Multiplikationen und Verschiebungen nach rechts erfolgen. Allerdings sind wir im Jahr 2012, und ich wurde Ihnen empfehlen, Compiler (und MCUs), mit denen Sie mit Gleitkommazahlen arbeiten konnen. Abgesehen davon, dass mehr Speicher effizienter und schneller (Sie dont haben, um Elemente in jedem kreisformigen Puffer zu aktualisieren), wurde ich sagen, es ist auch naturlich. Weil eine exponentielle Impulsantwort besser auf die Art und Weise reagiert, wie sich die Natur verhalt, in den meisten Fallen. Ein Problem mit dem IIR-Filter fast beruhrt von Olin und Supercat, aber anscheinend von anderen ignoriert ist, dass die Rundung nach unten fuhrt einige Ungenauigkeiten (und moglicherweise 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 konnte, wird der Durchschnitt nie berucksichtigen. 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 tatsachlich 8 ist. Die Faust 7 Probe bringt den Durchschnitt auf 7, unabhangig von der Filterstarke. Nur fur eine Probe. Gleiche Geschichte fur 6, usw. Jetzt denke an das Gegenteil. Die serie geht auf. Der Durchschnitt bleibt auf 7 fur immer, bis die Probe gro? genug ist, um es zu andern. Naturlich konnen Sie fur die Bias korrigieren, indem Sie 1 / 2N / 2, aber das nicht wirklich losen, die Prazision Problem. In diesem Fall wird die abnehmende Reihe fur immer bei 8 bleiben, bis die Probe 8-1 / 2 (N / 2) ist. Fur N4 zum Beispiel, wird jede Probe uber Null halten den Durchschnitt unverandert. Ich glaube, eine Losung fur das implizieren wurde, um einen Akkumulator der verlorenen LSBs halten. Aber ich habe es nicht weit genug, um Code bereit, und Im nicht sicher, es wurde nicht schaden, die IIR Macht in einigen anderen Fallen der Serie (zum Beispiel, ob 7,9,7,9 wurde durchschnittlich 8 dann). Olin, Ihre zweistufige Kaskade wurde auch eine Erklarung 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 fur den Vergleich mit den oben genannten und bietet Statistiken fur die gesamte Job-Titel-Kategorie in standigen Arbeitsplatzen in ganz Gro?britannien angekundigt. 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 fur diese Suchanfrage Meine E-Mail-Adresse: Job-Emails konnen jederzeit wieder geloscht 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 fur Gehalter, 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 fur IT-Arbeitsplatze zitiert Embedded C Software Engineer uber 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 fur die in den IT-Jobs zitierten mittleren Gehalter, die Embedded C Software Engineer innerhalb des Vereinigten Konigreichs in den drei Monaten bis zum 6. Oktober 2016 nennen Angabe der Veranderung 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 Anderung 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 fur Gehalter, die in permanenten IT-Jobs zitiert wurden und zitiert Embedded C in Gro?britannien. Embedded C Gehalt Histogramm Dieses Diagramm bietet ein Gehalt Histogramm fur IT-Arbeitsplatze zitiert Embedded C uber die 3 Monate bis 6. Oktober 2016 in Gro?britannien. Eingebettete C-Top-30-Arbeitsplatze Die folgende Tabelle zeigt die Nachfrage und stellt einen Leitfaden fur die in den IT-Arbeitsplatzen zitierten mittleren Gehalter dar, auf die Embedded C innerhalb des Vereinigten Konigreichs 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 Anderung 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, wahrend der Lehre Ein Undergraduate-Kurs in Elektrotechnik, brauchte ich, um das Konzept der digitalen Filterung einzufuhren. Der Trick war, einen Weg zu finden, das Material zu prasentieren, ohne (zumindest zunachst) auf fortgeschrittene mathematische Konzepte zu vertrauen. Dies ist der Ansatz, auf dem ich mich eingelebt habe. Mittelwert Erinnern Sie sich zuruck in der Grundschule, als Sie uber Durchschnitt gelernt haben Sie sind ein leistungsfahiges 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 Schatzung der wahre Natur von x. Diese Technik scheint wie ein Tiefpassfilter, aber in der Grundschule, dass Begriff hatte 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 konnen 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 ausfuhren konnen, ware: Die Implementierung ist ziemlich einfach. Fugen 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 fur ein symmetrisches digitales Filter mit finiter Impulsantwort (FIR). Warum ist die Antwort endlich Da nur die letzten beiden Samples verwendet werden, stehen keine alteren Samples fur die Berechnung zur Verfugung. Daher ist die Dauer der Probenbeeinflussung auf die Ausgabe begrenzt. Im DSP-Land konnte 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 vorwarts oder ruckwarts 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 Einheitsverstarkung fur 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 Halfte der Abtastrate vollstandig abgebrochen wird, wie Sie in Abbildung 1 sehen konnen. Abbildung 1: Paarweise genommen summiert sich der abgetastete Eingang immer auf 0 Ein weiteres wichtiges Merkmal dieses Filters ist das Seine unbedingte Stabilitat. Ohne Ruckmeldung jeglicher Art muss diese Stabilitat der Fall sein. Wie Sie spater sehen werden, konnen nicht alle digitalen Filter diese Behauptung machen. Wenn Sie die Daten abgetastet haben, wussten Sie, wann die Proben entnommen wurden. Fur welche Zeit ist die Ausgabe des Filters mit anderen Worten definiert, was ist die Verzogerung des Filters Intuitiv, da die Gro?e der Filter-Ausgang ist der Durchschnitt aus zwei aufeinander folgenden Samples, scheint es, wie die Filterverzogerung sollte auf halbem Weg zwischen den gemittelten Proben. Fur ein Signal mit der Halfte der Abtastrate ware dies eine Verzogerung von 1/4 der Periode des Eingangs oder 90 Grad. Uberprufen 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 Gro?enverteilung verifiziert, dass die Verstarkung 1,0 bei Nullfrequenz ist und auf 0,0 fallt, wenn die Frequenz die Halfte der Samplefrequenz betragt. Abbildung 2: Einfache FIR-Amplitudenreaktion Das Phasendiagramm in Fig. 3 zeigt, da? das Filter eine lineare Verzogerung aufweist, die maximal 90 Grad bei einer Frequenz der halben Abtastrate betragt. Abbildung 3: Einfache FIR-Phasenreaktion Manuelles Berechnen der symmetrischen FIR-Filterleistung Wenn youre wie ich, sind Sie verdachtig von Software-Werkzeugen, bis Sie die Mathe manuell tun. Fur 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 konnen die Gleichung fur diesen Filter mit dem Einheitszeitverzogerungsoperator z neu schreiben. Der Z-Operator ist sehr praktisch. Es ermoglicht eine mathematische Analyse von Vorgangen, 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. Wahrend eine allgemeine Diskussion von z-Transformationen uber den Rahmen dieses Artikels hinausgeht, konnen einfache Anwendungen von z-Transformationen sehr nutzlich 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 Filterausgange. In diesem Fall ist die Ubertragungsfunktion (der Begriff, der die Eingabe in den Ausgang umwandelt) definiert als: In die ubliche DSP-Terminologie gegossen, ist es unser Ziel, die Eigenschaften unserer Ubertragungsfunktion zu finden. Anstatt verbringen ein Semester in einem linearen Systems naturlich, fur jetzt konnen wir nur ein paar Fakten uber Z-Transformationen, die wir benotigen. Das erste Z kann folgenderma?en definiert werden: Eine Notiz uber j. Nein, Sie konnen nicht nehmen die Quadratwurzel von -1, aber denken Sie an die Eigenschaften, die j haben wurde. Wenn j mit j multipliziert wird. Das Ergebnis ist -1. Zwei Terme mit j konnen zusammen addiert werden. Also ist j wirklich nur ein Operator, der sich wie die Quadratwurzel von -1 verhalten wurde. Eine leichte Abschweifung hier, um uber die maximale Bandbreite von digitalen Filtern zu sprechen. Die maximale Ausgangsbandbreite eines digitalen Filters ist definiert als weniger als die Halfte 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 Ausdrucke in den Gleichungen so schnell wie moglich loszuwerden. Sie konnen dies mit einem kleinen Trigne um Eulers Formel in die Form umschreiben: Konnen wir unsere Gleichung in dieser Form Ja, wenn wir uns erinnern, dass beide Koeffizienten identisch sind und ein wenig Mathematik Schritt fur Schritt: Uber diese Zeit konnen 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 Gro?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. Ubrigens 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 Verstandnis des Filters aus der Intuition. Die tatsachliche Kurve ist in Abbildung 4 dargestellt. Abbildung 4: Zwei-Punkt-Mittelwertreaktion Wie Sie sehen konnen, ist es ziemlich einfach, die Leistung eines Filters mit nur zwei Taps vorherzusagen. Wie Sie sich vorstellen konnen, steigt, wenn die Anzahl der Koeffizienten zunimmt, die Leistung des Filters ebenfalls. Naturlich haben wir aus dem Blickwinkel der Filterkonstruktion im vorherigen Beispiel das Problem ruckwarts gelost. Jetzt konnen Sie versuchen, in die andere Richtung. Manuelles Design eines FIR-Filters Sie konnen FIR-Filter von Hand entwerfen. Fugen Sie die Einschrankung hinzu, dass, wenn die Eingangsfrequenz ein Viertel der Abtastrate betragt, die Verstarkung des Filters 0,5 ist. Wir wollen weiterhin, dass der Filter ein Tiefpa?filter mit einer Eins-Verstarkung bei einer Nullfrequenz und einer Verstarkung von Null bei der Halfte der Abtastrate ist. Weil wir nur eine weitere Einschrankung hinzugefugt haben, mussen wir noch einen weiteren Koeffizienten hinzufugen. Da wir Pairing-Begriffe wollen, wenn Sie zunachst eine geringe Anzahl von Taps haben, konnen Sie nur einen Koeffizienten hinzufugen. Wenn Sie eine ungerade Anzahl von Taps haben, mussen Sie zwei hinzufugen. Da der ursprungliche Filter zwei Anzapfungen aufweist, benotigen wir drei Ubertragungsfunktionen: Da mit symmetrischen FIR-Filtern gearbeitet wurde, werden die ersten und letzten Anzapfungen gepaart, so dass die Koeffizienten identisch sein mussen. Die Arbeit der Mathematik ergibt: Wieder gibt die verbleibende Exponential nur die Filterverzogerung 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-Filterstarkenreaktion Zwei Eigenschaften eines beliebigen symmetrischen FIR-Filters konnen nun verstanden werden. Zunachst nimmt die Verzogerung durch das Filter zu, wenn die Anzahl der Ausdrucke (oder Taps) zunimmt. Die Verzogerung betragt die Halfte der Gesamtverzogerung im Filter. Zweitens kann, wenn die Anzahl der Begriffe in dem Filter erhoht wird, das Filter an mehr und mehr Punkten spezifiziert werden. Es ist offensichtlich, dass mit diesem Ansatz es moglich ist, Tiefpass-, Hochpass - und Bandpassfilter unter Verwendung von Algebra zu entwerfen. Wie Sie addieren Koeffizienten, erhoht die Hohe 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-Empfanger fur die Markierungs - und Raumtone 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 Operationsverstarkern. Listing 2: MATLAB-Programm zur Bestimmung der Filterleistung Das Programm erzeugte den Filter mit 179 Koeffizienten, die in Abbildung 6 dargestellt sind. Naturlich wurde 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 konnen die Ripple-Parameter andern und einen besseren, in Abbildung 7 dargestellten Filter erstellen. Abbildung 6: DoRemez-Magnitudenreaktion Diese Leistungsverbesserung erfordert naturlich mehr Koeffizienten. In diesem Fall waren 369 erforderlich. Das bedeutet, dass mindestens 369 Additionen und 185 Multiplikationen 8.000 mal pro Sekunde durchgefuhrt werden mussen, um den Filter auf dem neuesten Stand zu halten. Da ein Funkfernschreiber-Demodulator zwei dieser Filter und den Rest des Codes erfordern wurde, konnen perfekte Filter Sie aus CPU-Zyklen herausfuhren. Sie sollten erwarten, Kompromisse auf Filter Lange (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 zuruckgreifen. Optimierte Durchschnittsberechnung Lets sagen, dass Sie den Durchschnitt der letzten 100 Datenproben berechnen mochten. Dies konnte unter Verwendung des folgenden Ausdrucks erfolgen: Mit diesem Ansatz mussen Sie an den letzten 100 Samples hangen. Um das neue Ergebnis zu berechnen, wird die alteste Probe weggeworfen und die neueste Probe eingefugt. Dies scheint ziemlich ineffizient, rechnerisch. Vielleicht konnen Sie eine ahnliche Wirkung ohne all die Komplexitat zu bekommen. Wenn Sie eine Minute lang daruber nachdenken, hangt nur ein Prozent des Ergebnisses von der letzten Datenstichprobe ab. Die restlichen 99 hangt von den vorherigen Proben ab. Probieren Sie es einfach aus: Diese Berechnung hat eine DC-Verstarkung von 1, und der neueste Messwert wird wie gewunscht auf 1 gewichtet. Seine auch viel schneller zu berechnen und nur die vorherige Schatzung und ein neues Muster erforderlich sind, um den Filter zu aktualisieren. Wegen der Ruckkopplung (unter Verwendung der vorherigen Schatzung) ist dies ein unendlicher Impulsantwort (IIR) - Filter Warum ist das der Fall Nun, daruber 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 sorgfaltig implementiert und kann eine sehr lange Zeit konstant. Es macht eine gro?e variable Bandbreite Tiefpassfilter nur zwei Koeffizienten mussen angepasst werden, um die Bandbreite zu andern. Die IIR-Filtertransferfunktion Die Gleichung fur das, was wir gerade erreicht haben, konnte folgenderma?en geschrieben werden: Mit einer kleinen Algebra konnen wir die Ubertragungsfunktion erreichen: In einem Standardformat wird der Zahlerkoeffizientenvektor der Ubertragungsfunktion 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 konnen, hat dieser Filter beeindruckende Leistung angesichts der einfachen Mathematik. Konnen Sie kombinieren die einfache FIR und IIR Filter, die gepruft wurden sicher. Abbildung 8: Einfache IIR-Gro?enreaktion Kombinierte (Kaskadierungs-) Filter Die FIR-Ubertragungsfunktion, die wir grundsatzlich gefunden haben, lautet: Gleichung 16 kann mit der IIR-Ubertragungsfunktion multipliziert werden, was zu einer neuen Ubertragungsfunktion fuhrt: Dieses neue IIR-Filter in Abbildung 9 , Hat die Eigenschaften der beiden vorherigen Filter. Abbildung 9: Kombinierte IIR-Gro?enreaktion Die Charakteristiken umfassen die steile Tiefpasskurve des IIR-Filters mit der 0-Verstarkung bei der Halfte 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 Filterausgange. IIR-Filter haben keine lineare Phasenreaktion, wie Sie in Abbildung 10 sehen konnen. Abbildung 10: Kombinierte IIR-Phasenantwort Da es moglich ist, Bessel-Filter mit einem IIR-Design zu realisieren, kann diese Begrenzung in den meisten Fallen gemildert werden. IIR-Filter und Stabilitat 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 tatsachlich 1,0 Wie Sie in Tabelle 1 sehen konnen, steigt die Ausgabe mit jeder Probe. Bei genugend Zeit, wird der geschatzte Wert ziemlich gro? und schlie?lich Absturz des Prozesses. Es dauert nicht viel fur 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 konnen, muss der Filter auch korrekt implementiert werden. Es ist moglich - und ziemlich einfach - zu ermitteln, ob ein gegebenes IIR-Filter stabil im Entwurf ist: 1. Multiplizieren Sie immer alle Terme im Nenner der Ubertragungsfunktion mit z, bis alle Potenzen von z ungleich Null sind. Dies ergibt ein Polynom in z im Nenner. 2. Losen Sie fur z im Polynom des Nenners. 3. Alle Wurzeln dieses Nennerpolynoms (oft Pole genannt) mussen kleiner als eine Gro?e sein. Dies wird ublicherweise als angegeben: Die im Nenner einer Ubertragungsfunktion falligen Pole mussen sich innerhalb der Einheitsscheibe befinden. Schlie?lich hat jedes gegebene DSP-System aufgrund von numerischen Fehlern in der Regel eine praktische Grenze fur 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 benotigt wird. Ein langes IIR-Filter kann in kleinere Filter unterteilt werden, die partielle Bruchdehnung und kaskadiert verwenden. Oder einfach Kaskade kurzer identischen IIR-Filter-Abschnitte, bis Sie die gewunschte Leistung erhalten. Beide Losungen werden haufig in realen Designs verwendet. Software-Design von IIR-Filtern IIR-Filter konnen 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 Lange die gleiche Grundamplitudenleistung wie ein FIR-Filter mit vielen weiteren Anzapfungen aufweisen. Hier ist ein MATLAB-Programm, das ein Bessel-Filter ahnlich dem FIR-basierten IF-Filter entwirft, den wir vorher entworfen haben. Dieses Programm erzeugt eine Ubertragungsfunktion mit nur 15 Zahlerkoeffizienten 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 Berucksichtigung 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 andert. Abbildung 12: Bessel diskrete Bandpa?gro?e Sie mussen sich bewusst sein, dass die Diskontinuitaten 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 Gluck wird es nicht viel Energie durch den Filter in dieser Region passiert. Zuruck in die Klasse Neben der Art und Weise, war das letzte Projekt in der Klasse, ein komplettes DSP-Aquivalent des Dovetron MPC-1000R Demodulator zu entwerfen. Als die Schuler fertig kodierten ihre Projekte und debugged sie, hatten sie FSK Modulation und Demodulation sowie Radio-Fernschreiben Ubertragung und Empfang ziemlich gut herausgefunden. Mehr als ein Interesse fur 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 losen, 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 zuruck, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zuruckgibt. 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 zuruckgeben 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 fur 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 zuruckgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhangigen Datenstromen verwendet werden konnen. Pseudocode fur 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 zuruckgegeben wird, hat ihren Zustand in einem Atom mit einem Queue-Wert. Diese Implementierung verwendet eine zirkulare Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert halt, 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 halt. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Naherungen aufeinandertreiben und wachsen, kann der Code eine periodische Summe auf dem gesamten kreisformigen Warteschlangen-Array ausfuhren. 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 ubergibt sie an die neu erstellte anonyme Funktion und pruft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage fur jeden gleitenden Durchschnitt bildet. Erlang hat Verschlusse, aber unveranderliche Variablen. Eine Losung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte fur 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 hinzugefugt wird. L1 kann durch Drucken von 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS gefunden werden. Drucken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zuruckgibt Programm, das bei jedem Aufruf einen einfachen Wert zuruckgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zuruck: 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 zuruckgegeben 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 nachsten Durchschnittsberechnung berucksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also mussen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise mussen p Elemente berucksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewohnlich 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 enthalt 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