Hallo Leute,
ich schreibe mir gerade ein IIR Filter, und das funktioniert auch soweit ganz gut, allerdings zur Zeit nur mit lahmen floats.
Code:
float filter(uint8_t order, float* coef_a, float* coef_b, float* buf, float x)
{
uint8_t n;
float y = coef_b[0] * x + buf[0];
for(n = 0; n < (order-1); n++)
buf[n] = buf[n+1] + coef_b[n+1] * x - coef_a[n] * y;
buf[order-1] = coef_b[order] * x - coef_a[order-1] * y;
return y;
}
Wie man sieht filtert diese Funktion die Werte quasi "on-the-fly", möchte man ein komplettes Array filtern muss sie eben in einer Schleife aufgerufen werden.
Im nächsten Schritt möchte ich das Ding jetzt auf 16-Bit Festkomma umbauen, es soll also im Endeffekt jedes "float" durch ein "int16_t" ersetzt werden.
Natürlich ist es nicht ganz so einfach, ein paar Steine versperren noch den Weg.
Mein Problem ist folgendes:
ich möchte mit dem int16_t einen Wertebereich von -1 bis 1 abdecken, es gibt (bis auf das Vorzeichen) also nur Nachkomma-Bits.
Das bedeutet natürlich auch, daß die Koeffizienten meines Filters in diesem Bereich liegen müssen... tun sie aber nicht.
Erst dachte ich es würde ausreichen einfach sämtliche Koeffizienten mit dem gleichen Faktor zu skalieren, aber Matlab hat mich da leider eines besseren belehrt.
Mit den skalierten Koeffizienten hatte mein Filter eine völlig andere Impulsantwort.
Also was tun?
wie kriege ich die Koeffizienten in einen Bereich zwischen -1 und 1 gequetscht?
Lesezeichen