Forum: Digitale Signalverarbeitung / DSP / Machine Learning Abschätzung der notwendigen Genauigkeit von IIR-Filterkoeffizienten


von Tobias (. (Gast)


Lesenswert?

Ich muss in einem Controller, der nur INT kann, IIR-Filter einsetzen, um 
einen ADC-Datenstrom zu glätten. Die Filter sind umschaltbar, werden an 
verschiedene PCBs angepasst und müssen so optimiert werden, dass "es 
gerade noch reinpasst", wie es heute hieß:-)

Jetzt ist es ja so, dass die Abtastrate eine Rolle spielt: Wenn ich z.B. 
die Daten (120kHz Rate) mit jedem Takt annehme und in den Filter jage, 
muss ich 120.000 Berechnungen machen. Die PCBs sind aber umstellbar auf 
1/3 der Datenrate. Dann wären nur 40.000 Berechnungen nötigt und die 
Fehler würden nicht so stark aufsummieren.

Ich sorge mich nämlich um die letztliche Genauigkeit, weil ich gesehen 
habe, dass die Filterkoeffizienten sehr genau sein müssen. Schön wäre 
es, wenn ich eine Abschätzung der notwendigen Genauigkeit dieser 
IIR-Filterkoeffizienten hätte.

Es geht um solche Filter:

y[n] = a0 + a1 * y[n-1] + a2 * y[n-2] + b1 * x[n-1] + b2 * x[n-2].

Die Koeffizienten kommen von MATLAB und haben Real-Format. Ich arbeite 
aktuell mit 16Bit,24Bit und 32Bit Präzision.

Was ich vor allem brauche, wäre eine Idee, bei welcher Auflösung der 
Koeffizienzen welcher Fehler entsteht. Ich würde das ungern alles 
exemplarisch durchackern müssen.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ich glaub' nicht, dass es da irgendwelche simplen Abschaetzungen gibt. 
Das ist halt die Kroete, die man beim IIR Filter schlucken muss.
Allgemein wird's unangenehmer (=muss genauer gerechnet werden), wenn 
Pole oder Nullstellen des Filters in der Naehe des Einheitskreises sind.

Gruss
WK

von Joe J. (j_955)


Lesenswert?

Kannst Du nicht einfach mal den bei Dir maximal erwarteten Wert 
verwenden als Anhaltspunkt? Schlussendlich kannst Du für alle Stellen 
des Filters diesen Maximalwert anlegen und mit deinen 
Filterkoeffizienten beaufschlagt aufsummieren. Dann weisst Du ja, ob 
irgendwelche ausreisser zu erwarten sind. Du musst ja nicht die ganze 
Kette`aller Messwerte durchrechnen.

Für Frequenzen, für die das Filter durchlässig ist ist die maximal 
erwartete Amplitute auch eben dieser Maximalwert. Die Ordnung des 
Filters ist nicht zu verwechseln mit der Anzahl der Samples.

Für die Bestimmung der notwendigen Auflösung der Koeffizienten(die 
ursprüngliche Frage?)->Kriterium Einheitskreis bei IIR -Polen ist dir ja 
bekannt.Vll erkenne ich nicht die Schwierigkeiten auf anhieb, aber ein 
bischen Fleissarbeit gehört dazu.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Kleine Ungenauigkeiten bei den Koeffizienten sorgen ja eigentlich nur 
für eine etwas andere und meist akzeptable Filtercharakteristik.

Tobias N. schrieb:
> Die PCBs sind aber umstellbar auf
> 1/3 der Datenrate. Dann wären nur 40.000 Berechnungen nötigt und die
> Fehler würden nicht so stark aufsummieren.

Dann müssen sich aber auch die Koeffizienten ändern, wenn du die gleiche 
Filtercharakteristik haben möchtest.

Wenn du 32-bit zur Verfügung hast, würde ich die einfach nehmen ohne 
groß Nachzudenken. Besser kann es dann eh nicht werden.

Tobias N. schrieb:
> Die Filter sind umschaltbar

Wenn man im Betrieb die Koeffizienten ändert, kann das zu wilden 
Instabilitäten führen. Daher besser vor und nach dem Umschalten das 
Eingangssignal muten und harte "Einschalt-Sprünge" vermeiden.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Wenn die Pole dicht am Einheitskreis liegen, können sie durch 
Rundungsfehler auch außerhalb zu liegen kommen, dann schwingt das ganze. 
Soweit ich weiß kann Matlab daher eine begrenzte Bitbreite simulieren.

von Dr. Bödefeld (Gast)


Lesenswert?

Joe F. schrieb:
> Wenn man im Betrieb die Koeffizienten ändert, kann das zu wilden
> Instabilitäten führen. Daher besser vor und nach dem Umschalten das
> Eingangssignal muten und harte "Einschalt-Sprünge" vermeiden.
Es dürfte eine Reihe von Anwendungen geben, die das nicht zulassen mit 
dem "Muten".

Christoph db1uq K. schrieb:
> Wenn die Pole dicht am Einheitskreis liegen, können sie durch
> Rundungsfehler auch außerhalb zu liegen kommen,
So knapp wird es keiner bemessen, denke ich.

> Soweit ich weiß kann Matlab daher eine begrenzte Bitbreite simulieren.
Ist das so gemeint, dass MATLAB die Auswirkung der Bitbreite simuliert 
oder selber nur bis zu einer bestimmten Bitbreite arbeitet?

wie geht das real?

von justme (Gast)


Lesenswert?

Dergute W. schrieb:
> Ich glaub' nicht, dass es da irgendwelche simplen Abschaetzungen gibt.

Zumindest wird man mal die rekursive Gleichung in eine Form umstellen 
können, die einem die Sprungantwort verrät und kann deren Verhalten in 
Bezug auf kleine Änderungen der Koeffizienten analysieren.

von Proletus protectus Troll (Gast)


Lesenswert?

Falls es die Rechenleistung zulaesst, wuerde ich alle Filter parallel 
rechnen und und nur deren Ausgang umschalten.
Andererseits sollte es doch nicht so schwierig sein, eine solche 
Simulation selbst zu schreiben.

von Jürgen W. (Firma: MED-EL GmbH) (wissenwasserj)


Lesenswert?

Sofern Speicher kein Problem ist (bzw. Dein ADC nicht viel mehr als z.B. 
12 oder 14 bit liefert), könntest Du für jeden Koeffizienten eine 
Lookup-Tabelle machen - genauer als das wird es nicht.

Wichtig: Wenn Du mit 1/3-Datenrate arbeitest und Dein Filter auf die 
Datenrate adaptiert werden soll, mußt Du
* entweder die Samplingrate auf 1/3 reduzieren oder
* einen neuen Satz FIR-Koeffizienten berechnen, dabei aber 3x mehr 
Koeffizienten.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Das dürfte es sein:
https://de.mathworks.com/matlabcentral/fileexchange/66478-designing-iir-filter-for-an-fpga-fixed-point-implementation?s_tid=prof_contriblnk
http://de.mathworks.com/help/fixedpoint/index.html
Zunächst werden die Filter ideal berechnet, mit sehr großer Bitbreite, 
danach optimiert man die Bitbreite nach gewünschter "Ungenauigkeit", die 
z.B, als Quantisierungsrauschen ausgedrückt wird.

von Tobias (. (Gast)


Lesenswert?

Hallo an alle, die MATLAB Stories kenne ich, das läuft auch auf ein 
Simulieren hinaus. Eben das, was man so normalerweise macht. Welche 
Chancen bestehen, es der Formel anzusehen? Für FIR-filter rechne ich so, 
dass die Koeffizienten immer dieselbe Grösse haben müssen, wie die 
Daten. Das ist meistens genauer, als gebraucht. IIR hat nur eben die 
Eigenschaft, Fehler zu speichern, man kann aber nicht sagen, wie lange, 
weil das halt auch von den Koeffizienten abhängt.

von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

>>>>Welche Chancen bestehen, es der Formel anzusehen?

Die Pole und Nullstellen des Filters hängen natürlich von den 
Koeffizienten der Poynome ab. Es können kleine Änderungen in den 
Koeffizienten zu grossen Änderungen der Pole/Nullen führen. Umgekehrt 
kann man für ene gegebene Qantisierung der Koeffizienten berechnen, wo 
man mit den Polen/Nullen hinkommen kann. Dazu kann man dann auch die 
Filtercharakteristik entsprechend aussuchen und kombinieren.

Anbei die möglichen Pole/Nullen für 6 Bit plus Vorzeichen. Nahe f=0 und 
f=Nyquist kriegt man keine Pole nahe an den Einheitskreis, das ist nicht 
gut.

Cheers
Detlef

clear
n=6;
zhn=2^n;
zhnh=2^(n-2);
rr=[];
for k=-zhn:zhn
for m=-zhn:zhn
rr=[rr roots([1 k/zhnh m/zhnh])];
end;
end;

plot(real(rr),imag(rr),'b.',.....
    cos(2*pi*(0:1000)./1000),sin(2*pi*(0:1000)./1000),'r.-');
%axis([-1.2 1.2 -1.2 1.2]);
axis([-2 2 -2 2]);
grid;
return

von Adrian Hoffmann (Gast)


Lesenswert?

Detlefs Bild illustriert es schön, gerade bei Polen nahe der reellen 
Achse wirken sich Quantisierungsfehler stark aus. Rücken die Pole dann 
auch noch näher an den Einheitskreis, kann eine Quantisierung schnell zu 
Instabilität führen.
Deine Implementierung liegt als Biquad-Filter in Direktform 1 vor, also 
du hast quasi die analytische Differenzengleichung 1:1 in C-Code 
übersetzt. Das ist nicht nur vom Speicherbedarf her suboptimal, sondern 
führt zu genannten Ungenauigkeiten bei Grenzfrequenzen nahe f=0 und 
f=fs/2.
Wenn Bedenken in Sachen Stabilität eine große Rolle spielen, lohnt sich 
normalerweise ein Blick auf Wellendigitalfilter.
Eine weitere Alternative wäre, den Rekursivteil des Filters in der 
Gold&Rader-Struktur zu implementieren 
http://www.wirelessinnovation.org/assets/Proceedings/2007/2007-sdr07-2.3-1-harris.pdf 
. Deren Koeffizienten sind leicht aus den Biquad-Koeffizienten 
abzuleiten, die du aus Matlab bekommst. Und anders als bei der 
Direktform bleibt die Auswirkung der Quantisierung über den kompletten 
Frequenzbereich gleich.

von Stefan (Gast)


Lesenswert?

Nimm lieber einen FIR Filter. In Code gegossen wird dieser gut vom 
Compiler optimiert. Abschätzung von überlaufen ist kein Problem und der 
Filter ist immer stabil

von Bernd K. (prof7bit)


Lesenswert?

Tobias N. schrieb:
> Es geht um solche Filter:
>
> y[n] = a0 + a1 * y[n-1] + a2 * y[n-2] + b1 * x[n-1] + b2 * x[n-2].

Das ist ein FIR-Filter. Hast Du Dich vertippt im Eingangspost?

von Bernd K. (prof7bit)


Lesenswert?

Tobias N. schrieb:
> Ich muss in einem Controller, der nur INT kann, IIR-Filter einsetzen, um
> einen ADC-Datenstrom zu glätten.

Glätten mit IIR?

Nichts einfacher als das:

int filter(int sample) {
    static int acc;
    static int filtered;
    acc += sample - filtered;
    filtered = acc >> FILTER_SHIFT;
    return filtered;
}

> Die Koeffizienten kommen von MATLAB

Das ist der Fehler. Versuche stattdessen praktisch zu denken und setze 
den eigenen Verstand ein.

von DocDirac (Gast)


Lesenswert?

Bernd K. schrieb:
> Tobias N. schrieb:
>> Es geht um solche Filter:
>>
>> y[n] = a0 + a1 * y[n-1] + a2 * y[n-2] + b1 * x[n-1] + b2 * x[n-2].
>
> Das ist ein FIR-Filter. Hast Du Dich vertippt im Eingangspost?

Um ein FIR filter zu sein dürfte rechts es nur x[n-z] Therme geben, 
keine y[n-z] Therme. Es ist also ein IIR Filter.

von Bernd K. (prof7bit)


Lesenswert?

DocDirac schrieb:
> Bernd K. schrieb:
>> Tobias N. schrieb:
>>> Es geht um solche Filter:
>>>
>>> y[n] = a0 + a1 * y[n-1] + a2 * y[n-2] + b1 * x[n-1] + b2 * x[n-2].
>>
>> Das ist ein FIR-Filter. Hast Du Dich vertippt im Eingangspost?
>
> Um ein FIR filter zu sein dürfte rechts es nur x[n-z] Therme geben,
> keine y[n-z] Therme. Es ist also ein IIR Filter.

Ja, ich habs nach dem Absenden gesehen. Leider funktioniert der 
Lösch-Button neuerdings nicht mehr.

von Detlef _. (detlef_a)


Lesenswert?

Adrian Hoffmann schrieb:
> Wenn Bedenken in Sachen Stabilität eine große Rolle spielen, lohnt sich
> normalerweise ein Blick auf Wellendigitalfilter.
> Eine weitere Alternative wäre, den Rekursivteil des Filters in der
> Gold&Rader-Struktur zu implementieren
> 
http://www.wirelessinnovation.org/assets/Proceedings/2007/2007-sdr07-2.3-1-harris.pdf

Super, kannte ich nicht. Tolle Idee. Da hätte ich mir die 64Bit integer 
Rechnung bei meinen scharfen IIR-Filtern sparen können.

Wieder was dabeigelernt, danke für den Tipp.

Cheers
Detlef

von Tobias (. (Gast)


Lesenswert?

DocDirac schrieb:
> Bernd K. schrieb:
>> Tobias N. schrieb:
>>> Es geht um solche Filter:
>>>
>>> y[n] = a0 + a1 * y[n-1] + a2 * y[n-2] + b1 * x[n-1] + b2 * x[n-2].
>>
>> Das ist ein FIR-Filter. Hast Du Dich vertippt im Eingangspost?
>
> Um ein FIR filter zu sein dürfte rechts es nur x[n-z] Therme geben,
> keine y[n-z] Therme. Es ist also ein IIR Filter.

Das will ich auch meinen, war schon im Zweifel. Habe mich jetzt auch mit 
Lattice-Filtern befasst, aber das Finden der Paramter gestaltet sich 
noch schwierig.

von Adrian Hoffmann (Gast)


Lesenswert?

Lattice Filter! Jetzt wird's langsam abenteuerlich... Sowas benutzt man 
eher für aufwändigen Kram, z.B. als Linearprädiktoren in der 
Sprachsignalverarbeitung.
Erzähl uns doch mal, was du noch für Constraints hast. Z.B. geforderte 
Grenzfrequenz, Sperrbereichsdämpfung etc... Ich hab ein wenig das 
Gefühl, dass es ein simpler Moving Average FIR oder ein Integrator 1. 
Ordnung auch tun würden.
Wenn die Filterparameter nicht dynamisch änderbar sein müssen, kannst du 
auch problemlos je einen Parametersatz je Abtastrate berechnen und in 
Matlab quantisieren und simulieren. Wenn's dort stabil ist, ists das 
auch aufm µC.

Bernd K. schrieb:
> Tobias N. schrieb:
>> Ich muss in einem Controller, der nur INT kann, IIR-Filter einsetzen, um
>> einen ADC-Datenstrom zu glätten.
>
> Glätten mit IIR?
>
> Nichts einfacher als das:
>
> int filter(int sample) {
>     static int acc;
>     static int filtered;
>     acc += sample - filtered;
>     filtered = acc >> FILTER_SHIFT;
>     return filtered;
> }


Instabil. Setz mal x[n] = cos(pi n) ein.

von DocDirac (Gast)


Lesenswert?

Adrian Hoffmann schrieb:
> Lattice Filter! Jetzt wird's langsam abenteuerlich... Sowas benutzt man
> eher für aufwändigen Kram, z.B. als Linearprädiktoren in der
> Sprachsignalverarbeitung.
Nicht unbedingt. Latticefilter sind sehr effektiv, weil sie eine 
Kombination aus FIR und IIR darstellen und wenig Speicher benötigen.

> dass es ein simpler Moving Average FIR oder ein Integrator 1.
> Ordnung auch tun würden.
> Wenn die Filterparameter nicht dynamisch änderbar sein müssen, kannst du
> auch problemlos je einen Parametersatz je Abtastrate berechnen und in
> Matlab quantisieren und simulieren. Wenn's dort stabil ist, ists das
> auch aufm µC.

Warum denkst du müsste man den Filtersatz in MATLAB auf Stabilität 
simulieren?

von Martin O. (ossi-2)


Lesenswert?

Ich gehe meist wie folgt vor: FIR Filter mit sehr genauen Koeffizienten 
designen. Dann für verschiedene Frequenzen bei maximaler 
Eingangsamplitude mit einer Simulation rauskriegen, wieviel Bit ich für 
die Zwischenergebnisse im IIR brauche. Dann Filterkoeffizienten auf 
vorgesehene Bitzahl runden und kontrollieren, ob der Frequenzgang noch 
genau genug dem Design entspricht.
Dann Filter auf FPGA laufen lassen und es mal mit datsächlichen Signalen 
"durchsweepen".

von Jürgen S. (engineer) Benutzerseite


Lesenswert?

Martin O. schrieb:
> Dann für verschiedene Frequenzen bei maximaler
> Eingangsamplitude mit einer Simulation rauskriegen, wieviel Bit ich für
> die Zwischenergebnisse im IIR brauche.

Das lässt sich aber auch durch die Koeffizienten selber anhand der 
Fehlerrechnung direkt bestimmen. Ich würde dann auch die minimale 
Amplitude als Maßstab nehmen.

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.