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