www.mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nami (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Copen Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Copen Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonathan Swift (psihodelia)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Dillonseite scheint nicht mehr zu existieren. (?)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.