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.
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
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
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.
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.
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?
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.
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.
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.
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.
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.
>>>>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
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.
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
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?
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.
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.
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.
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
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.
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.
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?
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.