Moving Average Circular Puffer
Ive verwendete es für ein Gedächtnisprotokoll mit einer eingeschränkten Größe. Beispielsweise würde die Anwendung Protokolleinträge schreiben, während Benutzeranforderungen verarbeitet werden. Immer wenn eine Ausnahme aufgetreten ist (die die Verarbeitung beeinträchtigen würde), würden die im Speicher befindlichen Protokolldatensätze zusammen mit ihr ausgegeben. Der Vorteil eines kreisförmigen Puffers ist, dass Sie nicht unendlich viel Speicher benötigen, da ältere Einträge automatisch überschrieben werden. Die Challange ist, dass Sie eine passende Größe für Ihr usecase finden müssen. Im obigen Beispiel wäre es sehr unglücklich, wenn der Protokolldatensatz mit den wichtigsten Informationen über die Ausnahme bereits überschrieben worden wäre. Einige Systemanwendungen verfügen über Tools, mit denen Sie den aktuellen Inhalt des Puffers auf Anforderung extrahieren können, und nicht nur, wenn er automatisch (wenn überhaupt) extrahiert wird. Ich glaube, ETW und die CLRs Stress-Protokoll. Unter vielen anderen Systemen Kernel oder Highperformance Trace Logging, sind so implementiert. Das Konzept der Verwendung solcher Puffer für in-Memory-Tracing-Protokollierung ist eigentlich ziemlich häufig (nicht zu sagen, dass dies die einzige Verwendung ist - sicherlich nicht), denn es ist viel schneller als schriftliche Aufzeichnungen in einer Datei-Datenbank, die Sie vielleicht nie interessiert sein Sofern kein Fehler auftritt. Und auf einer verwandten Anmerkung, konserviert es Festplattenraum. Circular Puffer sind gut für serielle Datenströme in eingebetteten Systemen. Mikrocontroller haben oft eine UART, um ein serielles Byte hereinzukommen, das in Ordnung gelagert werden muss und später behandelt werden (Bytes kommen oft schneller als sie gehandhabt werden können). Der Puffer teilt die erforderliche zeitkritische Reaktion (wenn die Bytes in Mikrosekunden kommen) wirksam auf die nicht zeitkritische Antwort auf die gesamte Nachricht (z. B. Anzeige der eingehenden Nachricht in Millisekunden), z. B .: 1) Auf Kann der Empfang eines Bytes der UART einen Interrupt erzeugen, auf den die Software reagiert, indem sie schnell das empfangene Byte aufnimmt und es auf das Ende des Puffers schiebt. 2) Hintergrund-Software-Routinen können dann regelmäßig überprüfen, ob der Puffer noch etwas in ihm noch und leer, wie erforderlich. Da die zirkuläre Puffergröße vordefiniert werden kann, ist die Größe dann begrenzt. Dies trägt dazu bei, die Raumeffizienz zu verbessern und Speicherbeschädigung bei einem Trade-Off zu beseitigen, wie viele Bytes empfangen werden können, bevor Daten verloren gehen. Ich weiß, das ist Betrug, aber wikipedia hat eine sehr gute Erklärung. Ein kreisförmiger Puffer, zyklischer Puffer oder Ringpuffer ist eine Datenstruktur, die einen einzelnen Puffer mit fester Grße verwendet, als ob er von Ende zu Ende verbunden wäre. Diese Struktur eignet sich leicht zum Puffern von Datenströmen. Ein Beispiel, das möglicherweise einen überschreibenden Zirkularpuffer verwenden könnte, ist mit Multimedia. Wenn der Puffer als der beschränkte Puffer in dem Erzeuger-Verbraucher-Problem verwendet wird, ist es wahrscheinlich erwünscht, daß der Erzeuger (z. B. ein Audiogenerator) alte Daten überschreibt, wenn der Verbraucher (beispielsweise die Soundkarte) Ein anderes Beispiel ist das digitale Wellenleitersyntheseverfahren, das kreisförmige Puffer verwendet, um den Klang von vibrierenden Saiten oder Blasinstrumenten effizient zu simulieren. In Bezug auf den Vergleich mit doppelt verbundenen Listen, ich glaube, es hängt wirklich davon ab, was Sie mit der Liste für. Die Implementierung von cirular Puffern scheint komplexer zu sein, bitte (wieder) beziehen sich auf die wiki Seite das erklärt Implementierung, Überlegungen usw. und zeigt auch Beispielcode. Beantwortet Mar 31 10 um 14: 25Die Wissenschaftler und Ingenieure Leitfaden für digitale Signalverarbeitung Von Steven W. Smith, Ph. D. Kapitel 28: Digitale Signalprozessoren Digitale Signalprozessoren dienen zur schnellen Durchführung von FIR-Filtern und ähnlichen Techniken. Um die Hardware zu verstehen. Müssen wir zuerst die Algorithmen verstehen. In diesem Abschnitt werden wir eine detaillierte Liste der Schritte für die Umsetzung eines FIR-Filter. Im nächsten Abschnitt werden wir sehen, wie DSPs entworfen sind, um diese Schritte so effizient wie möglich durchzuführen. Um zu starten, müssen wir zwischen der Offline-Verarbeitung und der Echtzeit-Verarbeitung unterscheiden. Bei der Offline-Verarbeitung befindet sich das gesamte Eingangssignal gleichzeitig im Computer. Zum Beispiel könnte ein Geophysiker ein Seismometer verwenden, um die Erdbewegung während eines Erdbebens aufzuzeichnen. Nachdem das Schütteln beendet ist, können die Informationen in einen Computer gelesen und in irgendeiner Weise analysiert werden. Ein weiteres Beispiel für die Offline-Verarbeitung ist die medizinische Bildgebung, wie Computertomographie und MRT. Der Datensatz wird erfasst, während sich der Patient innerhalb der Maschine befindet, aber die Bildrekonstruktion kann bis zu einem späteren Zeitpunkt verzögert werden. Wesentlich ist, dass alle Informationen gleichzeitig dem Verarbeitungsprogramm zur Verfügung stehen. Dies ist häufig in der wissenschaftlichen Forschung und Technik, aber nicht in Konsumgütern. Off-line-Verarbeitung ist das Reich der persönlichen Computer und mainframes. Bei der Echtzeitverarbeitung wird das Ausgangssignal zu dem Zeitpunkt erzeugt, zu dem das Eingangssignal akquiriert wird. Dies wird zum Beispiel in der Telefonkommunikation, Hörgeräten und Radar benötigt. Diese Anwendungen müssen die Informationen sofort verfügbar, obwohl es um einen kurzen Betrag verzögert werden kann. Beispielsweise kann eine Verzögerung von 10 Millisekunden in einem Telefonanruf nicht vom Lautsprecher oder Hörer erkannt werden. Ebenso macht es keinen Unterschied, ob ein Radarsignal um wenige Sekunden verzögert wird, bevor es dem Bediener angezeigt wird. Real-time-Anwendungen Eingabe einer Stichprobe, führen Sie den Algorithmus, und geben Sie eine Probe, over-and-over. Alternativ können sie eine Gruppe von Abtastwerten eingeben, den Algorithmus ausführen und eine Gruppe von Abtastwerten ausgeben. Dies ist die Welt der digitalen Signalprozessoren. Nun blicken wir auf Abb. 28-2 und stellen Sie sich vor, dass dies ein FIR-Filter ist, der in Echtzeit implementiert wird. Um das Ausgangssample zu berechnen, müssen wir Zugriff auf eine bestimmte Anzahl der letzten Samples vom Eingang haben. Angenommen, wir verwenden in diesem Filter acht Koeffizienten, eine 0. A 1. Hellip ein 7. Das heißt, wir müssen den Wert der acht letzten Samples aus dem Eingangssignal x n, x n -1, hellip x n -7 kennen. Diese acht Samples müssen im Speicher abgelegt und kontinuierlich aktualisiert werden, wenn neue Samples gewonnen werden. Was ist der beste Weg, um diese gespeicherten Proben zu verwalten Die Antwort ist kreisförmige Pufferung. Fig. 28-3 zeigt einen kreisförmigen Puffer mit acht Proben. Wir haben diesen Kreispuffer in acht aufeinanderfolgenden Speicherplätzen, 20041 bis 20048, platziert. Abbildung (a) zeigt, wie die acht Samples aus dem Eingang zu einem bestimmten Zeitpunkt gespeichert werden können, während (b) die Änderungen nach dem nächsten Sample angezeigt werden erworben. Die Idee der Zirkularpufferung besteht darin, dass das Ende dieses linearen Arrays mit seinem Anfangsspeicherort 20041 verbunden ist, wird als neben 20048 betrachtet, ebenso wie 20044 neben 20045. Sie behalten das Array mit einem Zeiger (eine Variable, deren Wert ist eine Adresse), die angibt, wo sich die letzte Probe befindet. Zum Beispiel enthält der Zeiger in (a) die Adresse 20044, während er in (b) 20045 enthält. Wenn ein neuer Sample erfasst wird, ersetzt er den ältesten Sample im Array und der Zeiger wird um eine Adresse weiter geschoben. Kreispuffer sind effizient, da nur ein Wert geändert werden muss, wenn ein neues Sample erfasst wird. Es werden vier Parameter benötigt, um einen kreisförmigen Puffer zu verwalten. Zunächst muss es einen Zeiger geben, der den Anfang des Zirkularpuffers im Speicher angibt (in diesem Beispiel 20041). Zweitens muss ein Zeiger sein, der das Ende des Arrays angibt (z. B. 20048) oder eine Variable, die seine Länge (z. B. 8) hält. Drittens muss die Schrittgröße der Speicheradressierung angegeben werden. In Fig. 28-3 ist die Schrittgröße eins. Zum Beispiel: Adresse 20043 enthält ein Beispiel, Adresse 20044 enthält das nächste Beispiel, und so weiter. Dies ist oft nicht der Fall. Beispielsweise kann sich die Adressierung auf Bytes beziehen, und jeder Abtastwert kann zwei oder vier Bytes benötigen, um seinen Wert zu halten. In diesen Fällen müsste die Schrittweite zwei oder vier betragen. Diese drei Werte definieren die Größe und die Konfiguration des kreisförmigen Puffers und werden sich während des Programmbetriebs nicht ändern. Der vierte Wert, der Zeiger auf das aktuellste Sample, muss beim Erfassen jedes neuen Samples modifiziert werden. Mit anderen Worten muss es eine Programmlogik geben, die steuert, wie dieser vierte Wert basierend auf dem Wert der ersten drei Werte aktualisiert wird. Während diese Logik ganz einfach ist, muss sie sehr schnell sein. Dies ist der ganze Punkt dieser Diskussion DSPs sollten bei der Verwaltung von kreisförmigen Puffern optimiert werden, um die höchstmögliche Ausführungsgeschwindigkeit zu erreichen. Nebenbei ist die kreisförmige Pufferung auch für die Offline-Verarbeitung von Nutzen. Betrachten wir ein Programm, bei dem sowohl das Eingangssignal als auch das Ausgangssignal vollständig im Speicher enthalten sind. Zirkularpufferung wird nicht für eine Faltungsberechnung benötigt, da auf jede Probe sofort zugegriffen werden kann. Viele Algorithmen werden jedoch stufenweise implementiert. Wobei zwischen jeder Stufe ein Zwischensignal erzeugt wird. Zum Beispiel arbeitet ein rekursiver Filter, der als eine Reihe von Biquaden ausgeführt wird, auf diese Weise. Das Brute-Force-Verfahren ist es, die gesamte Länge jedes Zwischensignals im Speicher zu speichern. Zirkularpufferung bietet eine weitere Option: Nur die Zwischenproben, die für die Berechnung benötigt werden, speichern. Dies verringert die erforderliche Menge an Speicher, auf Kosten eines komplizierteren Algorithmus. Die wichtige Idee ist, dass kreisförmige Puffer für die Offline-Verarbeitung nützlich sind, aber für Echtzeitanwendungen kritisch sind. Nun können wir die Schritte betrachten, die erforderlich sind, um ein FIR-Filter unter Verwendung von kreisförmigen Puffern sowohl für das Eingangssignal als auch für die Koeffizienten zu implementieren. Diese Liste mag trivial und überexamiert sein. Die effiziente Handhabung dieser einzelnen Aufgaben ist es, was einen DSP von einem herkömmlichen Mikroprozessor trennt. Für jedes neue Sample müssen alle folgenden Schritte durchgeführt werden: Das Ziel ist, diese Schritte schnell auszuführen. Da die Schritte 6-12 viele Male wiederholt werden (einmal für jeden Koeffizienten im Filter), müssen diese Operationen besonders beachtet werden. Traditionelle Mikroprozessoren müssen in der Regel diese 14 Schritte seriell (eine nach der anderen), während DSPs sind entworfen, um sie parallel durchzuführen. In einigen Fällen können alle Operationen innerhalb der Schleife (Schritte 6-12) in einem einzigen Taktzyklus abgeschlossen werden. Lets Blick auf die interne Architektur, die diese großartige Leistung ermöglicht.
Comments
Post a Comment