Auch mit FIR kann man einen Tiefpass realisieren, braucht aber sehr viel
mehr Speicher.
Betrachtet man ein IIR-Tiefpass mit einem Speicher ist die
Einheitssprungantwort eine Exponentialfunktion, und nach N Samples ist
die Höhe ≈ 0,65 × N:
y := x + (N-1)/N × y
Den krummen Faktor erspart man sich durch Addition:
y += x + y/N
Die Division erspart man sich, indem N = 2^K gewählt wird:
Interessant erscheint: Je kleiner der Subtraktionsanteil ist, desto
größer wächst y.
Für ein in etwa gleichwertigen FIR-Tiefpass braucht man N Speicher.
Diese werden einfach addiert. Die Einheitssprungantwort ist eine
lineare Rampe, die bei N mit dem Wert N aufhört, mit dem gleichen
Anstieg wie am Anfang der IIR-Exponentialfunktion.
Um sich die Kettenaddition zu sparen benutzt man für die N Speicher
einen Ringpuffer und einen Schreib/Lesezeiger und subtrahiert den zu
überschreibenden Wert:
1 | auto o = Y[p];
|
2 | y = (Y[p] = x) - o;
|
3 | if (++p==N) p=0;
|
Da auf AVR-Controllern Speicher eher knapp ist wird man IIR-Filter
bevorzugen. Höhergradige Filter sind bei IIR allerdings schwieriger zu
berechnen.