mikrocontroller.net

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


Autor: Tobias N. (technick2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joe J. (j_955)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Joe F. (easylife)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph db1uq K. (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dr. Bödefeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: justme (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Proletus protectus Troll (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph db1uq K. (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das dürfte es sein:
https://de.mathworks.com/matlabcentral/fileexchang...
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.

Autor: Tobias N. (technick2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlef _. (detlef_a)
Datum:
Angehängte Dateien:

Bewertung
2 lesenswert
nicht 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

Autor: Adrian Hoffmann (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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/Proceedin... 
. 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: DocDirac (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlef _. (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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/Proceedin...

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

Autor: Tobias N. (technick2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Adrian Hoffmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.