Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR Filter Betragsfunktion


von TM (Gast)


Lesenswert?

Hallo,

Ich möchte die Betragsfunktion eines FIR Filters mittels C++ berechnen.

Dazu möchte ich die Betragsfunktion so bilden das ich keine Imaginären 
Zahlen brauche, da dies in C nicht ohne weiteres möglich ist.

Dazu will ich nun zuerst die Übertragungsfunktion umformen
Dann fuer
 einsetzen.

Und jetzt steck ich irgendwie fest alles beim e^ sollte doch der Winkel 
sein und bn sozusagen der Betrag.
Aber der haengt nun ja gar nicht von der Frequenz ab.

Irgendwas mache ich grad falsch komm aber einfach nicht drauf. Ist 
bestimmt nen simpler Fehler.
Kann mir mal jemand nen Hinweis geben?

von ADC (Gast)


Lesenswert?

Genau das was du willst habe ich erst gerade gemacht.

Das e^j... kannst du mit der Euler Formel verarbeiten.

Anschliessend kann man noch den Satz von de Moivre verwenden und die 
negative Potenz loswerden.

Was dann bleibt ist eigentlich nur eine Multiplikation..

von TM (Gast)


Lesenswert?

Dann komme ich doch auf das:
Und wenn ich nun den Betrag bilde komme ich immer auf 1.

Irgendwie seh ich grad den Wald vor lauter Baeumen nicht glaub ich.

von Andreas W. (andy_w)


Lesenswert?

Hallo,
ich versuche mal ein Stück C-Code:
1
#define PI 3.141562
2
...
3
float f; // frequenz 0...0.5 für max. halbe Abtastfrequenz
4
float re, im, omega;
5
int i;
6
7
omega = 2*PI*f;
8
re = 0;
9
im = 0;
10
for (i = 0; i <= M; i++)
11
{
12
  re += b[i] * cos(-omega * i);
13
  im += b[i] * sin(-omega * i); // ich bin nicht sicher, ob "-" stimmt
14
}

in re und im steht danach das komplexe Ergebnis für die Frequenz. Der 
Betrag sqrt(re*re+im*im) ist die Verstärkung des Filters bei der 
Frequenz (<1 bedeutet Abschwächung), der Winkel atan2(im, re) gibt die 
Phasenverschiebung an. Da FIR-Filter vor allem als phasenlineare Filter 
verwendet werden, sind die Koeffizienten symmetrisch zum mittleren. 
Definiert man die Koeffizienten um in b[-M+1]...b[0]...b[M-1] (jetzt hat 
das Filter 2*M-1 Koeffizienten!), gilt b[i] = b[-i].

Den Frequenzgang kann man dann so berechnen:
1
#define PI 3.141562
2
...
3
float f; // frequenz 0...0.5 für max. halbe Abtastfrequenz
4
float re, omega;
5
int i;
6
7
omega = 2*PI*f;
8
re = b[0];
9
for (i = 1; i < M; i++)
10
{
11
  re += 2 * b[i] * cos(omega * i);
12
}

Diese Funktion nutzt aus, daß exp(-j*omega*i) für positives und 
negatives i konjugiert komplex ist und sich daher dort die Imaginärteile 
aufheben. re enthält die Verstärkung des Filters, die Phasenverschiebung 
ist immer Null. Da das Filter kausal sein muß, wird das Signal um 
mindestens M-1 Abtastwerte zusätzlich verzögert. Diese zweite Funktion 
benutze isch selbst und die hat sich auch als richtig herausgestellt.

Gruß
Andy_W

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.