Forum: Digitale Signalverarbeitung / DSP / Machine Learning Digitale Filter - Frame vs Single-Sample


von Stefan (Gast)


Lesenswert?

Mal kurz eine Frage:

Bei digitalen Filter ist es ja in der Regel so, dass man diverse 
N-vergangene Samples braucht um den Filter sinnvoll zu rechnen.

Wenn ich jetzt im Mikrocontroller einen Interrupt auslöse und berechne 
das filter jedes mal neu wenn ein neuer Wert anliegt, merke ich mir 
einfach die letzten vergangenen Samples in einem Array.


Mordernere Mikrocontroller haben ja aber z.B. DMA wo es sich anbietet 
Block-Weise die Daten zu verarbeiten z.B. immer 1024 auf einmal.

Die C-Code Implementierungen die ich gesehen habe war alle in etwa so 
function (Pointer* in, Pointer* out, int buffersize)

Wenn ich jetzt immer im 1024er Block aber diese Funktion aufrufe heißt 
das ja dass mit jedem mal wo ich diese Funktion aufrufe die N-letzten 
Samples zumindest am Anfang immer 0 sind?

Inwiefern wirkt sich das denn auf meinen Filter aus?



Danke & Gruß
Markus

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Das kommt auf die Koeffizienten und Auslegung des Filters an. Bei einem 
symmetrischen Filter mit erwartetem Offset bekommst Du einen Sprung, 
ansonsten kriecht das Filter auf den Wert.

von Mark B. (markbrandis)


Lesenswert?

Stefan schrieb:
> Mordernere Mikrocontroller haben ja aber z.B. DMA wo es sich anbietet
> Block-Weise die Daten zu verarbeiten z.B. immer 1024 auf einmal.

Wenn man Echtzeitverarbeitung macht, dann bekommt man pro Zyklus einen 
neuen Abtastwert (pro Eingang bzw. pro A/D-Wandler) herein. Also bei 
Mono einen, bei Stereo zwei, ...

> Wenn ich jetzt immer im 1024er Block aber diese Funktion aufrufe

Warum sollte das so sein?

Die Anzahl der Speicherstellen eines (FIR-)Filters hängt mit der Anzahl 
der Koeffizienten zusmamen. Es besteht eine Differenz von 1:

Anzahl der Speicherstellen = Anzahl der Koeffizienten minus 1

Wieviele Daten der Mikrocontroller DMA-mäßig verarbeiten kann, ist 
zunächst mal irrelevant. Es müssen pro Zyklus eben so viele 
Multiplikationen und Additionen durchgeführt werden, wie es dem 
einzusetzenden Filter entspricht.

Von den gespeicherten Werten verwirft man dann pro Zyklus genau einen, 
und ein neuer kommt hinzu. Der Rest verschiebt sich einfach um eine 
Stelle. Das erfordert aber keinen extra Speicherzugriff, sondern die 
entsprechenden Zeiger werden einfach eine Position weiter gesetzt 
(Prizip des Ringpuffers).

> das ja dass mit jedem mal wo ich diese Funktion aufrufe die N-letzten
> Samples zumindest am Anfang immer 0 sind?

Am Anfang sind die Speicherstellen eines in Software realisierten 
Filters üblicherweise zu Null initialisiert, ja.

> Inwiefern wirkt sich das denn auf meinen Filter aus?

Wie Jürgen gesagt hat.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.