Gast
#2963390
Hallo Leute, ich will mir mit meinem ATMega128 drei digitale Filter basteln. Einen Notch-Filter(50Hz), einen Tiefpass(ca.150Hz) und einen Hochpass(ca. 1Hz). Den Notch-Filter habe ich bereits implementiert und er funktioniert. Die Koeffizienten habe ich in MATLAB berechnet. Das Eingangssignal hat eine Samplerate von 500Hz und ist ein signed long 32-Bit Wert. Folgende Filterform habe ich verwendet: Die Gleichungen für ein IIR-Filter Direct-Form II, SOS w[n] = Gin*x[n] + a1*w[n-1] + a2*w[n-2] y[n] = Gout*(b0*w[n] + b1*w[n-1] + b2*w[n-2]) Filterkoeffizienten: //Zähler b[0] = 1 b[1] = -1.6180339887498947 b[2] = 0.99999999999999989 //Nenner a[0] = 1.6077528939666013 a[1] = -0.98729186796473045 Um mit Festkommazahlen rechnen zu können müssen die Koeffizienten ja skaliert werden. Da die Koeffizienten nicht im Bereich -1...+1 liegen habe ich sie zunächst durch 2 geteilt und dann mit 2^(31) multipliziert um sie im Q31 Format abzuspeichern. Das ist der C-Code meines Filters.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
Hat jemand noch eine Idee wie man die Koeffizienten vielleicht noch besser skalieren könnte um das Ergebnis möglicherweise noch zu verbessern??