Forum: Digitale Signalverarbeitung / DSP / Machine Learning IIR Octave => C-Code


von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo allerseits,

Ich bräuchte etwas Hilfe bei meiner latenten Mathe-Schwäche: ich  weiss 
einigermaßen wie ich mit GNU Octave einen IIR-Filter berechne, leider 
weiß ich nicht was ich mit dem Ergebnis mache, bzw. wie ich das in 
C-Code gieße...

Ich hab mal klein angefangen mit einem Butterworth und Bessel 1. 
ordnung:
1
octave:1> [b,a] = butter (1, 0.1)
2
b = 0.13673   0.13673
3
a = 1.00000  -0.72654
4
5
octave:2> [b,a] = besself (1, 0.1, 'z')
6
b = 0.13673   0.13673
7
a = 1.00000  -0.72654

Schon mal beruhigend, dass das gleiche rauskommt :-)

Die Werte sind ja Koeffizienten des Zähler/Nenner Polynoms der 
Übertragungsfunktion (hoffe ich zumindest, hier wird mein Eis schon sehr 
dünn)

Nur - was mach ich jetzt damit?

ich suche dann ja was in der Art:
1
float IIR(float x)
2
{
3
   v[0] = v[1];
4
   v[1] = 0.245 * x + 0.51 * v[0];
5
   return v[0] + v[1];
6
}

Wie komm ich von A nach B? (Ich will nicht die ganze hehre Mathematik 
dahinter verstehen, ein "kochrezept" reicht mir)

Danke, Michi

: Verschoben durch Moderator
von Daniel A. (daniel-a)


Lesenswert?

Schön, was genau willst du in c nun berechnen, und was hat das mit 
oktave zutun? Ich sehe keine übereinstimmung zwichen einer der 
Funktionssignaturen in c und oktave. Wenn du mir die eingabe-, 
ausgabeparameter und formel mit all diesen gibst kann ich die c funktion 
schreiben. Die momentane macht keinen sinn: eine ungenutzte variable x 
und ein return wert der von der unbekannten variable v abhängt?!?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Daniel A. schrieb:
> Schön, was genau willst du in c nun berechnen, und was hat das mit
> oktave zutun? Ich sehe keine übereinstimmung zwichen einer der
> Funktionssignaturen in c und oktave. Wenn du mir die eingabe-,
> ausgabeparameter und formel mit all diesen gibst kann ich die c funktion
> schreiben. Die momentane macht keinen sinn: eine ungenutzte variable x
> und ein return wert der von der unbekannten variable v abhängt?!?

Danke für deine Antwort; aber ich befürchte mit IIR bist du nicht 
wirklich vertraut, oder?

von Dirk K. (d-k)


Lesenswert?

Die zweite Formel hier 
http://octave.sourceforge.net/octave/function/filter.html zeigt wie die 
von octave berechneten Koeffizienten für die Filterung angewendet werden 
müssen.

In deinem Fall sind N=M=1, c=a und d=b, damit kannst du die Formel ein 
bisschen einfacher (konkreter) schreiben.

: Bearbeitet durch User
von Guest (Gast)


Lesenswert?

Das Problem ist, dass die einfache Implementierung (Direktform) nicht 
unbedingt die beste ist. Falls du das SNR deines Filters optimieren 
willst wirst du dich doch ein wenig in die Mathematik einarbeiten 
müssen.

von derguteweka (Gast)


Lesenswert?

Moin,

Kochrezept:
1
double iir(double rein)
2
{
3
  const double a0=1.0;
4
  const double a1=-0.72654;
5
  const double a2=0.0;
6
  const double b0=0.13673;
7
  const double b1=0.13673;
8
  const double b2=0.0;
9
10
  double raus;
11
  double mem;
12
  static double mem0,mem1;
13
14
15
  mem =  a0 * rein - a1 * mem0 - a2 * mem1;
16
  raus = b0 * mem  + b1 * mem0 + b2 * mem1;
17
18
  mem1=mem0;
19
  mem0=mem;
20
21
  return raus;
22
}

Gruss
WK

von Akademiker der 2te (Gast)


Lesenswert?

>Guest (Gast)
>Das Problem ist, dass die einfache Implementierung (Direktform) nicht
>unbedingt die beste ist. Falls du das SNR deines Filters optimieren
>willst wirst du dich doch ein wenig in die Mathematik einarbeiten
>müssen.

Thema verfehlt..

von Guest (Gast)


Lesenswert?

Akademiker der 2te schrieb:
>>Guest (Gast)
>>Das Problem ist, dass die einfache Implementierung (Direktform) nicht
>>unbedingt die beste ist. Falls du das SNR deines Filters optimieren
>>willst wirst du dich doch ein wenig in die Mathematik einarbeiten
>>müssen.
>
> Thema verfehlt..

Das Thema ist doch eh schon beendet nachdem die entsprechende Formel 
gepostet wurde.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Danke euch! ich hätte ja gar nicht erwartet, dass es so einfach ist 
;-)

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Für IIR-Filter bis zur 2.Ordnung stimmt das, für höherer Ordnungen 
sollte man sie in Teile 2.Ordnung zerlegen. Dazu gibt es in Octave die 
Funktion "tf2sos".
https://www.mikrocontroller.net/articles/Digitalfilter_mit_ATmega#Octave_und_Scilab

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Christoph Kessler (db1uq) schrieb:
> Für IIR-Filter bis zur 2.Ordnung stimmt das,

sorry, worauf beziehst du dich? stimmt was?

Christoph Kessler (db1uq) schrieb:
> für höherer Ordnungen sollte man sie in Teile 2.Ordnung zerlegen.

Aha? ich rate mal: Die Polstellen kommen dem Rand des Einheitskreises 
gefährlich nahe, wenn die durch Ungenauigkeiten/Rundungsfehler 
rausspringen, schwingt das Ding?

Visualisieren tu ich das mit zplane(b,a)?

Christoph Kessler (db1uq) schrieb:
> Dazu gibt es in Octave die Funktion "tf2sos".

Super, danke!

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.