So,
dann machen wir uns mal daran wie man mit Matlab FIR Filterkoeffizenten bestimmt. Zuerst müsst ihr verstehen, dass man bei einem FIR Filter nicht genau definieren kann, was man gerne hätte. Man muss solangen an den Parametern drehen, bis man dort ist, wo man hin will. Das ist ansich die hohe Kunst beim Design von FIR Filtern. IIR Filter, wie zum Beispiel das darauf basierende Biquad-Filter sind da anders, mann sucht sich aus was man will und fertig.
Genug geredet, los geht es. Zunächst öffnet man Matlab, hier sieht man eine Übersicht mit dem Command Window in der Mitte. Hier könnte man ansich alle Befehle eintippen, aber das wird irgendwann sehr übersichtlich. Daher legen wir uns mit Strg+n ein Script an. Hier geben wir nun unsere Befehle ein. Mit einem Druck auf F5 können wir das Script ausführen. Matlab wird beim erstenmal fordern, dass wir das Script speichern. Eventuell taucht danach noch eine Meldung auf, dass die Pfade nicht korrekt sind, also sagen wir Matlab, dass es dies für uns hinzufügen soll. Alles weitere müssen wir dann den Script Ausgaben entnehmen.
Für das erste Script greifen wir auf die Fir1 Methode zurück, um die Filterkoeffizenten zu bestimmen. Diese führt schnell zu ersten Ergebnissen und benötigt nur wenige Parameter an denen man drehen kann. Das macht es für den Anfang leichter. Für uns sind interessant Zeile 7, wo wir die Grenzfrequenz des Filters in kHz angeben können (Achtung Matlab rechnet mit . nicht mit , in Zahlen) und Zeile 15, wo wir Entscheiden können, ob wir einen Hoch- oder Tiefpass berechnen wollen. Dann ist Zeile 5 noch wichtig. Diese bestimmt die Anzahl der verwendeten Taps und damit aufgrund der Fir1 Methode indirekt auch die Flankensteilheit des Filters. Da der DSP nur vielzahlige von 16 als Taps anzahl zulässt, die Fir1 Methode aber mit n+1 rechnet, nehmen wir hier eine Zahl entsprechend (n*16)-1
Mit F5 erzeugt das Script dann einige Fenster, in den wir uns das Filter angucken können. Zunächst währe da der wohl wichtige Amplitundengang. Um den -3dB Punkt besser finden zu können, kann man sich unter Tools einen Datacursor einblenden lassen. Der Frequenzgang ist nur so zur Info da, spannend ist noch die Gruppenlaufzeit, diese sollte bis zur Grenzfrequenz immer konstant sein, was das Filter danach macht, ist eigentlich egal. Zu guter letzt, kann man noch ins Command Window schauen, dort werden die Filterkoeffizenten angezeigt, die man in den DSP 1 zu 1 übertragen muss. Wie man sieht, spiegeln sich die Werte aber der Mitte.
Und nun zum Script
clear; %Alte Speicherückstände löschen
%Filterspezifikation
n = 15; %Anzahl Taps entspricht ungefähr der Filterordnung
ftast = 48; %Arbeitsfrequenz des DSP in kHz
fd = 5; %Ungefähre Grenzfrequenz des Filters in kHz
%FIR Filter mit Hanning-Fenster berechnen
fsh=ftast/2; %Shannon-Frequenz bestimmen
%Hier high oder low eintragen für Art des Filters
b = fir1(n,fd/fsh,'low',Hanning(n+1)); %Koeffizenten b0...bn bestimmen;
a = 1; %Amplitundengang für DC-Fall korregieren
%Berechnung Amplitundengang
w = 0:0.001
i; %Schrittweite 0 bis fmax
h = freqz(b,a,w);
graph=20*log10(abs(h)); %Amplitudengang in dB umrechnen
%Berechnung Phasengang
phi = unwrap(angle(h));
%Berechnung Gruppenlaufzeit
tgr = -diff(phi)./diff(w)*(1/(2*fsh));
%Amplitudengang zeichnen
figure(1);
plot(w*fsh/pi,graph);
grid;
title(['Amplitudengang FIR-Filter mit ', num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Amplitudengang [dB]');
%Gruppenlaufzeit zeichnen
figure(2);
plot(w(1:length(w)-1)*(fsh/pi),abs(tgr));
axis([0 fsh 0 5]);
grid;
title(['Gruppenlaufzeit FIR-Filter mit ',num2str(n+1),' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Gruppenlaufzeit [ms]');
%Phasengang zeichnen
figure(3);
plot(w*fsh/pi,phi);
grid;
title(['Phasengang FIR-Filter mit ', num2str(n+1), ' Taps']);
xlabel('Frequenz [kHz]');
ylabel('Phasengang [Grad]');
%Filterkoeffizenten in Command Window ausgeben
clc; %Command Window leeren
fprintf('%f\n',b); %Koeffizenten für FIR Filter aus Vektor b ausgeben
So, damit könnt ihr jetzt erstmal spielen. Morgen gibt es dann mehr und MillenChi sorg doch bitte mal dafür, dass man in das Antwortfenster auch lange texte eingeben kann, ohne das ab einer bestimmten Länge der Cursor immer nach oben springt, ist ja mega nervig.