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.