Tuesday 21 November 2017

Moving Average Filter C Quellencode


Erweiterte Quellcode. Com. Klicke hier zum herunterladen. Ein gleitender Durchschnittsfilter mittelt eine Anzahl von Eingangsabtastwerten und erzeugt eine einzelne Ausgangsabtastung. Diese Mittelungsaktion entfernt die hochfrequenten Komponenten, die in dem Signal vorhanden sind. Gleitende Mittelfilter werden normalerweise als Tiefpassfilter verwendet. Bei dem rekursiven Filteralgorithmus werden auch vorhergehende Abtastwerte für die Mittelung genommen. Dies ist der Grund, warum seine Impulsantwort bis ins Unendliche reicht. Wir haben einen niedrigen Berechnungsansatz für die Iriserkennung auf der Basis eines 1D-gleitenden Durchschnittsfilters entwickelt. Ein einfaches Mitteln wird verwendet, um die Auswirkungen von Rauschen zu reduzieren und eine signifikante Verbesserung der Rechenleistung kann erreicht werden, wenn wir die Berechnung des Mittelwertes rekursiv durchführen. Dieser Code verwendet eine optimierte Version von Libor Maseks Routinen für Iris-Segmentierung hier verfügbar. Libor Masek, Peter Kovesi. MATLAB-Quellcode für ein biometrisches Identifizierungssystem basierend auf Irismustern. Die Schule von Informatik und Software Engineering, die Universität von Westaustralien, 2003. Index-Begriffe: Matlab, Quelle, Code, Iris, Erkennung, bewegt, Durchschnitt, Filter, niedrig, computational. Averaging Filter Dieses Beispiel zeigt den empfohlenen Workflow zum Generieren C-Code aus einer MATLAB-Funktion mit dem Befehl codegen. Dies sind die folgenden Schritte: 1. Fügen Sie die Codegen-Direktive zur MATLAB-Funktion hinzu, um anzuzeigen, dass sie für die Codegenerierung vorgesehen ist. Mit dieser Richtlinie kann der MATLAB-Codeanalysator auch Warnungen und Fehler identifizieren, die für MATLAB zur Codegenerierung spezifisch sind. 2. Generieren Sie eine MEX-Funktion, um zu überprüfen, ob der MATLAB-Code für die Codegenerierung geeignet ist. Wenn Fehler auftreten, sollten Sie sie vor dem Generieren von C-Code zu beheben. 3. Testen Sie die MEX-Funktion in MATLAB, um sicherzustellen, dass es funktional dem ursprünglichen MATLAB-Code entspricht und dass keine Laufzeitfehler auftreten. 4. Generieren Sie C-Code. 5. Überprüfen Sie den C-Code. Inhalt Voraussetzungen Es gibt keine Voraussetzungen für dieses Beispiel. Erstellen eines neuen Ordners und Kopieren von relevanten Dateien Der folgende Code erstellt einen Ordner in Ihrem aktuellen Arbeitsordner (pwd). Der neue Ordner enthält nur die Dateien, die für dieses Beispiel relevant sind. Wenn Sie den aktuellen Ordner nicht beeinflussen möchten (oder wenn Sie keine Dateien in diesem Ordner erzeugen können), sollten Sie den Arbeitsordner ändern. Ausführen des Befehls: Erstellen eines neuen Ordners und Kopieren von relevanten Dateien Über die averagingfilter-Funktion Die averagingfilter. m-Funktion fungiert als Mittelungsfilter für das Eingangssignal, das einen Eingabevektor von Werten annimmt und einen Durchschnitt für jeden Wert im Vektor berechnet. Der Ausgangsvektor ist die gleiche Größe und Form wie der Eingangsvektor. Die Codegen-Kompilierungsrichtlinie zeigt an, dass der MATLAB-Code für die Codegenerierung vorgesehen ist. Erstellen Sie einige Beispieldaten Erstellen Sie eine verrauschte Sinuswelle und zeichnen Sie das Ergebnis. Generieren einer MEX-Funktion zum Testen Generieren Sie eine MEX-Funktion mit dem Befehl codegen. Der Codegen-Befehl überprüft, ob die MATLAB-Funktion für die Codegenerierung geeignet ist, und erzeugt eine MEX-Funktion, die Sie vor dem Generieren des C-Codes in MATLAB testen können. Da C eine statische Typisierung verwendet, muss codegen die Eigenschaften aller Variablen in den MATLAB-Dateien zur Kompilierzeit bestimmen. Hier liefert die Befehlszeilenoption - args eine Beispiel-Eingabe, so dass Codegen neue Typen auf der Grundlage der Eingabetypen ableiten kann. Das Beispielsignal, das oben als Beispiel-Eingang erstellt wurde, stellt sicher, dass die MEX-Funktion denselben Eingang verwenden kann. Standardmäßig generiert codegen eine MEX-Funktion namens averagingfiltermex im aktuellen Ordner. Auf diese Weise können Sie den MATLAB-Code und die MEX-Funktion testen und die Ergebnisse vergleichen. Testen der MEX-Funktion in MATLAB Ausführen der MEX-Funktion in MATLAB Generieren von C-Code Überprüfen des generierten Codes Der Codegen-Befehl mit der Option - config coder. config (lib) erzeugt C-Code, der als eigenständige C-Bibliothek verpackt ist. Der generierte C-Code befindet sich im Verzeichnis codegen / lib / averagingfilter. Die Dateien sind: Überprüfen Sie die C-Code für die averagingfilter. c Funktion Wählen Sie Ihre CountryIs es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren können, indem Sie eine Fenstergröße, die a Macht von zwei, um Bit-Verschiebung statt der Teilung zu ermöglichen, aber nicht brauchen einen Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die a in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Initialize total 0, count0 (jedes Mal, wenn ein neuer Wert angezeigt wird) Dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein Divide-Durchschnitt (total / count) Dies wäre ein gleitender Durchschnitt über alle Eingänge Als nur die letzten 4 Eingänge, würde 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einer älteren inputvariable, dann die Berechnung der neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (rechte Verschiebung 2 wäre gut, wenn alle Eingänge waren Dass die durchschnittliche BerechnungIm nicht suren der richtigen Lösung aber, da Summierung der Durchschnitt jeder Probe würde eine angemessene Menge von Rundungsfehler einzuführen. Hmm. Ich frage mich, wenn die Trennung der gebrochene Teil aus dem ganzen Teil helfen würde. Trennen Sie den gesamten Teil Jede Zahl durch den Zähler behalten. Halten Sie drei laufende Summen: 1) der Durchschnitt der ganzen Teile, 2) der Rest von jeder Division und 3) der Bruchteil einer jeden Zahl. Jedes Mal, wenn der ganze Teil einer Zahl geteilt wird, wird das gesamte Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der verbleibenden laufenden Summe addiert. Wenn die verbleibende laufende Summe einen Wert erhält, der größer oder gleich dem Zählwert ist, wird sein dividiert durch die Zählung mit dem gesamten Teilergebnis zu der durchschnittlichen laufenden Summe addiert, und der Rest wird zu der restlichen laufenden Summe addiert. Auch wird bei jeder Berechnung der Bruchteil zur Bruchlaufsumme addiert. Wenn die Mittelung beendet ist, wird die verbleibende laufende Summe durch die Zählung geteilt, und das Ergebnis wird der durchschnittlichen laufenden Summe als eine fließende Zahl hinzugefügt. Zum Beispiel: Nun, was mit der fraktionalen laufenden Summe zu tun. Die Gefahr des Überlaufs ist hier viel weniger wahrscheinlich, obwohl es immer noch möglich ist, so dass man damit umgehen würde, wäre es, die gebrochene laufende Summe durch den Zähler am Ende zu teilen und es zu unserem Ergebnis hinzuzufügen: Eine Alternative wäre, den fraktionalen Betrieb zu überprüfen Summe bei jeder Berechnung, um zu sehen, ob sie größer oder gleich count ist. Wenn das passiert, tun Sie einfach das Gleiche, was wir mit dem Rest laufen Summe. Durchschnittswerte / Einfache gleitende Durchschnitt Durchschnittliche / Einfache gleitende Durchschnitt Sie sind aufgefordert, diese Aufgabe entsprechend der Aufgabe Beschreibung, mit Hilfe einer Sprache, die Sie vielleicht kennen zu lösen. 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 vom init-moving-average zurückgegebene Funktion hat ihren Zustand in einem Atom, das einen Queue-Wert enthält. 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 Index-Variable, und es 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