Forum: FPGA, VHDL & Co. Filter mit variabler Grenzfrequenz


von Stefan (Gast)


Lesenswert?

Hallo Leute,

ich moechte fuer ein kleines Projekt einen Tiefpass und einen Hochpass 
FIR-Filter in einem FPGA realisieren. Die Grenzfrequenzen der beiden 
Filter sollen unabhaengig veraenderbar sein (zw. 0.1 und 150 Hz), ohne 
dass die Filterform veraendert wird. Beide Filter sollen in Reihe 
geschaltet werden und somit einen variablen Bandpass darstellen.
Die Eingangsdaten kommen mit einer Samplingrate von 2kHz in den FPGA.

Liege ich richtig, dass ich "einfach" durch unterschiedlicher 
Samplingfrequenzen der FIR-Filter die Grenzfrequenzen aendern kann?
Muessen die unterschiedlichen Samplingraten aufeinander angepasst 
werden?

Gibt es vielleicht noch eine besser Realisierungsform, bei der die 
Grenzfrequenzen ohne grossen overhead geaendert werden koennen?

Vielen Dank fuer ein paar Anregungen.
Stefan

von TheMason (Gast)


Lesenswert?

>Filter sollen unabhaengig veraenderbar sein (zw. 0.1 und 150 Hz), ohne
>dass die Filterform veraendert wird.

die filterform wirst du auch nicht ändern müssen. höchstens die 
fir-koeffizienten. die kannst du dir evtl. aus einem extern 
angeschlossenen speicher holen (ist sicherlich am einfachsten, die 
berechnung ist sehr aufwendig für nen fpga)


>Liege ich richtig, dass ich "einfach" durch unterschiedlicher
>Samplingfrequenzen der FIR-Filter die Grenzfrequenzen aendern kann?

mit dem thema kenn ich mich nicht aus, es ist aber nicht gerade trivial. 
vor allem wenn du das 2 mal hintereinander machen willst.

gruß
rene

von Stefan (Gast)


Lesenswert?

Hi,

danke fuer deine Antwort.

Beim FIR Filterdesign werden die Grenzfrequenzen fc doch auf die 
Samplingfrequens fs normiert Qc=fc/fs und damit die Koeffizienten 
berechnet. Wenn sich bei gleichen Koeffizienten die Samplingfrequenz 
aendert, ergibt sich  meiner Meinung nach eine andere Grenzfrequens des 
Filters, oder doch nicht?

Die Koeffizienten wollte ich eigentlich nicht auf dem FPGA berechnen.

Stefan

von Klaus F. (kfalser)


Lesenswert?

Deine Sampling-Frequenz ist doch fix, diese hast Du mit 2 KHz angegeben 
!
Außerdem willst Du die beiden Grenzfrequenzen ja getrennt einstellen, 
dazu würdest Du also 2 verschiedene Sampling-Frequenzen benötigen.

Kann es sein, dass dir der Begriff Sampling-Frequenz nicht ganz klar 
ist?

von Stefan (Gast)


Lesenswert?

Hi Klaus,

ja das ist der Knackpunkt.

Zitat: "Muessen die unterschiedlichen Samplingraten aufeinander 
angepasst
werden?"

Es muesste also die Samplingrate zwischen den einzelnen Stufen angepasst 
werden, was auch nicht ganz trivial ist!?

Stefan

von Nami (Gast)


Lesenswert?

Es gibt Multiraten Filter. Da wird schrittweise mit verringerter 
Abtastrate gearbeitet um effizient digitale Filter zu realisieren. Dabei 
muß aber auf einiges geachtet werden, damit das Signal am Ende korrekt 
gefiltert ist. Stichworte Antialiasing, Antiimaging.

Das hat aber mit Deinen Anforderungen bzgl. einstellbarer 
Hochpaß/Tiefpaß nichts zu tun. Ausgangspunkt ist in der Regel immer ein 
digitales Signal, welches mit einer konstanten Rate abgetastet wurde.

Du kannst - wie bereits geschrieben - einfach nur vorberechnete 
Koeffizienten in einer Tabelle ablegen und dann entsprechend abrufen.
Oder aber z.B. mittels fft/ifft einen Filter realisieren.

von Falk B. (falk)


Lesenswert?

@ Nami (Gast)

>Du kannst - wie bereits geschrieben - einfach nur vorberechnete
>Koeffizienten in einer Tabelle ablegen und dann entsprechend abrufen.

Eben. Und wenn die FPGA internen RAMs zu klein sind, dann kann man auf 
einen exteren seriellen EEPROM zugreifen. Entweder per State Machine 
oder Softcore uC (Picoblaze & Co).

MfG
Falk

von Copen Hagen (Gast)


Lesenswert?

Hallo Stefan,

ich habe sowas mal mit IIR-Filtern 2.Ordnung gemacht, die per 
Koeffizienten frei konfigurierbar waren. Bei IIR-Filtern ist der 
Vorteil, dass Du nur
sehr wenige Ressourcen brauchst - im Vergleich zu FIR.
Wenn das Verhältnis von Abtast- zu Cutoff-Frequenz sehr groß wird
(wie bei Dir z.B. 2000Hz / 0.1Hz = 20000) dann benötigt man allerdings
hohe Bitbreiten um die benötigte Genauigkeit zu erreichen.
Du solltest Dich erstmal mit einem DSP-Profi unterhalten um das Konzept
zu erstellen.
Vielleicht wäre eine Möglichkeit noch das Signal mit einem NCO 
hochzumischen
und dann mit fester Cutoff-Frequenz zu filtern, danach wieder 
runtermischen.
Durch Änderung der NCO Mischfrequenz wäre der Frequenzgang veränderbar. 
Ist aber vermutlich auch zu kompliziert.

von Stefan (Gast)


Lesenswert?

Hallo Leute,

Danke!

die Idee mit dem NCO und Mischer ist gar nicht so schlecht. Aber da die 
Grenzfrequenzen nicht taeglich geandert werden muessen ist es vielleicht 
doch am Einfchsten mit verschiedenen Sets von Koeffizienten zu arbeiten 
und ein einfaches Interface fuer den Download zur Verfuegung zu stellen.

Gibt es irgendwo brauchbare Informationen fuer einen Loesungsansatz 
wegen dem grossen Verhältnis von Abtast- zu Cutoff-Frequenzwegen?

Einen DSP-Profi habe ich leiter nicht zur Hand :-(

Stefan

von Copen Hagen (Gast)


Lesenswert?

Hallo Stefan,

der Lösungsansatz heisst MATLAB oder SIMULINK oder Octave ....
wenn Du Dich entschieden hast, welchen Filtertyp Du verwendest
und z.B. wieviele Taps das FIR-Filter haben soll oder wieviele
IIR-Filter kaskadiert werden sollen dann schreibst Du Dir ein Modell
dazu und generierst je einen Satz Koeffizienten für die niedrigste
und höchste Cutoff-Freq.
Mit den Koeffizienten gehst Du in Dein Modell und simulierst den
Frequenzgang. Erstmal mit Fließkomma. Dann auf Festkommaformat
wechseln und die Bitbreite solange anpassen, bis Deine Filter-
Anforderungen erfüllt sind.
Bei IIR ist die Optimierung recht schwierig, zwischendrin könnten
z.B. an einem Addierer 52 Bit nötig sein, während an anderer Stelle
16 Bit reichen. Ich hoffe Du bist sattelfest in der 
Fixkomma-Darstellung?

von Günter -. (guenter)


Lesenswert?

> der Lösungsansatz heisst MATLAB oder SIMULINK oder Octave ....

Eine weitere Möglichkeit ist Python mit den Paketen scipy und zum 
Plotten matplotlib zu nehmen.

http://www.scipy.org/
http://matplotlib.sourceforge.net/

Dann gibt es einen Fixed-Point Datentypen auf sourceforge:

http://fixedpoint.sourceforge.net/

und einen auf der Seite von Dillon Engineering:

http://www.dilloneng.com/documents/downloads/demodel/

Damit ist es möglich eine Fixed-Point Modellierung von dem Algorithmus 
durchzuführen.

Gruß,

Günter

von Jonathan S. (psihodelia)


Lesenswert?

Günter .. wrote:
> Eine weitere Möglichkeit ist Python mit den Paketen scipy und zum
> Plotten matplotlib zu nehmen.

jo, ich benutze auch gerne Python mit Pylab für DSP-Aufgaben.

Ausserdem gibts noch Pygame und PyOpenGL die ich auch gerne für 
Real-Time Visualization benutze.

von Unbekannter (Gast)


Lesenswert?

Die Dillonseite scheint nicht mehr zu existieren. (?)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Unbekannter schrieb:
> Die Dillonseite scheint nicht mehr zu existieren. (?)
Und für einen Dead-Link habe ich jetzt einen 4 Jahre alten Thread 
gelesen?
Toll... :-/

BTW:
Meinst du die:
http://www.dilloneng.com/documents/downloads/demodel/
Bei mir geht sie noch.

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.