Forum: FPGA, VHDL & Co. Digitale Frequenzweiche


von Sven K. (mueslifresser)


Lesenswert?

Hi,

mal eine kurze Frage, bevor ich mich ins Unglück stoße und erst am ende 
sehe, dass das alles nichts wird.

Realisieren möchte ich eine Digitale Frequenzweiche mittels FIR-Filter 
mit vielleicht 100 Koeffizienten pro Filterzweig.

Ich würde euch bitten mir eine kurze bestätigung zu geben ob ich das 
jetzt alles richtig verstanden habe und das so funktionieren könnte. 
Speziel die Programmierung eines FPGA.

- Die Koeffizienten berechne ich mir aus den Messdaten meines 
Lautsprechers (SciLab ist mein Freund)
- Mit VHDL beschreibe ich mein FIR-Filter. Simuliere und anschließend 
synthetisiere ich dieses mit einer frei verfügbaren Software.
- Schreibe die daraus entstandenen Daten in ein EEPROM um diese dann mit 
einem Atmel bei jedem neustart in den FPGA zu laden 
(http://www.mikrocontroller.net/articles/Low_Cost_FPGA_Konfiguration)

Klar sind da noch bestimmt viele ecken die noch nicht gesehen habe. Aber 
kann ich das grundsätzlich so realisieren ohne noch teure (>50€) Soft- 
und Hardware zu kaufen (benötigte Hardware für den Atmel ist vorhanden)?

Grüße,
Sven

von Rene B. (themason) Benutzerseite


Lesenswert?

@sven

im Prinzip geht das so. Vllt erst Testhalber die VHDL-Software schreiben 
und simulieren und dann die Koeffizienten berechnen (diese lassen sich 
ja durch das EEProm jederzeit ändern, von daher ist der Schritt 
hardware-technisch gesehen eher zweitrangig).

Es ist halt die frage wie du die AD/DA Seite machen willst. Egal ob du 
selbst einen 1-Bit-DAC baust und die analoge Eingangsseite über einen 
AD-Wandler machst (z.b. I2S) oder ob du auch die Ausgangsseite per I2S 
machst (wäre zu empfehlen).

Aber vom Prinzip her ist es richtig.

Ich weiß nicht wie du das preislich meinst, aber wenn du sagst das die 
Hardware schon vorhanden ist (Atmel), benutzt du dann einen FPLSIC als 
FPGA ?!

von Sven K. (mueslifresser)


Lesenswert?

Hallo Rene,

danke erstmal für deine bestätigende Antwort!

Rene Böllhoff schrieb:
> Es ist halt die frage wie du die AD/DA Seite machen willst. Egal ob du
> selbst einen 1-Bit-DAC baust und die analoge Eingangsseite über einen
> AD-Wandler machst (z.b. I2S) oder ob du auch die Ausgangsseite per I2S
> machst (wäre zu empfehlen).

Ich würde mir aus dem großen Angebot der AD- sowie DA Umsetzer jeweils 
einen passenden herraussuchen (Analog Devices klingt nicht verkehrt). 
Wie ich die Daten dann genau zu dem FPGA bekomme weiß ich noch nicht. 
Wahrscheinlich werde ich diesem I²C oder SPI beibringen müssen.


Rene Böllhoff schrieb:
> Ich weiß nicht wie du das preislich meinst, aber wenn du sagst das die
> Hardware schon vorhanden ist (Atmel), benutzt du dann einen FPLSIC als
> FPGA ?!

Eigentlich habe ich mich damit auf die low-cost Variante beziehen wollen
http://www.mikrocontroller.net/articles/Low_Cost_FPGA_Konfiguration

Insbesondere interessiert mich, ob nicht doch noch ein nicht frei 
erhältliches Softwarepakett oder ähnliches nötig ist. Aber so wie ich es 
verstanden habe, wohl nicht...

Vielleicht hast du dazu nochmal ein paar Worte.

Grüße,
Sven

von Rene B. (themason) Benutzerseite


Lesenswert?

>Ich würde mir aus dem großen Angebot der AD- sowie DA Umsetzer jeweils
>einen passenden herraussuchen (Analog Devices klingt nicht verkehrt).

Für die ersten Test reicht z.b. ein TLV320AIC23B. Der hat einen AD ud DA 
Wandler drin (Codec). Damit kann man erstmal ausprobieren und 
optimieren. Die Konfiguration des Codecs kann man auch recht einfach in 
VHDL umsetzen. Wenn nachher alles funktioniert kann man sich über einen 
richtigen High-Quality Wandler Gedanken machen, bzw aufbauen (dann 
Analog Devices, Burr Brown, usw ...) mit symmetrischer Versorgung, guten 
Operationsverstärkern usw ...

>Wie ich die Daten dann genau zu dem FPGA bekomme weiß ich noch nicht.
>Wahrscheinlich werde ich diesem I²C oder SPI beibringen müssen.

64-Bit Schieberegister (davon werden dann nur 2x24Bit genutzt) für 
Eingang und Ausgang, Einsynchronisation der Clocks (am einfachsten ist 
es den Codec bzw AD/DA Wandler als Master laufen zu lassen und die 
Bitclock bzw Wordclock im FPGA auf den Systemtakt einzusynchronisieren 
sodaß der FPGA als Slave läuft und fertig).

>Eigentlich habe ich mich damit auf die low-cost Variante beziehen wollen

Die Konfiguration ist nicht der ausschlaggebende Presifaktor.
Es kommt ja darauf an welchen FPGA du verwenden willst. Das bestimmt ja 
maßgeblich den Preis deines Systems. Wenn du schon ein FPGA Board hast 
du meist das Platform-Flash schon mit drauf, somit bräuchtest du dann 
keine Low-Cost-Konfiguration. Wenn du es selberbauen willst dann wärs 
natürlich ne Alternative, wobei das halt etwas frickelig ist mit den 3 
Versorgungsspannungen, die Konfiguration des FPGA's ist da eher ne 
"Fingerübung".

>Insbesondere interessiert mich, ob nicht doch noch ein nicht frei
>erhältliches Softwarepakett oder ähnliches nötig ist.

Wenn du Xilinx oder Altera FPGA's verwendest ist die 
Entwicklungsumgebung (Xilinx ISE oder Altera Quartus) umsonst. Wie es 
bei Atmel, Lattice oder Actel FPGA's aussieht weiß ich nicht.

Ich selbst verwende in meinem Audio-Projekt hier im Forum einen Xilinx, 
und das läuft ganz gut. Allerdings ist die ISE von Xilinx stellenweise 
echt ne Zumutung. Aber nem geschenkten Gaul ...

Vllt kannst du ja auch das ein oder andere aus dem Audio-Projekt 
brauchen. Ich verwende allerdings IIR-Filter. Aber ansonsten wäre alles 
da was man braucht für eine Frequenzweiche bzw für ein solches vorhaben.

von Alex P. (drdatensalat)


Lesenswert?

Hallo Sven,

wenn du von Analogsignalen ausgehst, und diese zuerst AD-wandeln musst,
dann ist das anspruchsvoll. Wenn du schon so einen Aufwand machst, 
solltest du eine Tonqualität und Rauschabstand hinbekommen, dass es sich 
lohnt.
Dann solltest du zuerst den AD-Wandler heraussuchen (Anzahl Bit, 
Abtastrate,
Sigma-Delta oder SAR?), denn danach bestimmt sich das FPGA-Interface und 
der Filter.
Für den Wandler brauchst du eine (Semi-)professionelle Platine (=> 
PCB-POOL, etc.).
Mit "Lochrasterplatine" gehts nicht (vernünftig).
Zusätzlich brauchst du auch noch den Anti-Alias-Tiefpassfilter vor dem 
ADC.
Dieser bestimmt die Tonqualität und den Frequenzgang mit.
Nach dem Digitalfilter kommt der DAC, danach brauchst nochmal ein 
Tiefpassfilter...
-----
Wenn es nicht unbedingt eine FPGA sein muss, gäbe es noch die 
Möglichkeit
die Weiche mit digitalen Analogfiltern "switched-cap oder so" zu 
realisieren.
Das signal bleibt dabei analog.

Alex

von Rene B. (themason) Benutzerseite


Lesenswert?

>wenn du von Analogsignalen ausgehst, und diese zuerst AD-wandeln musst,
>dann ist das anspruchsvoll.

Es geht. Vom Beschaltungsaufwand des Wandlers her vllt (je nach Anspruch 
der Qualität), aber das in VHDL umzusetzen ist nicht soo schwierig. Man 
muß ja lediglich die Clock-Signale einsynchronisieren und über eine 
Statemachine das Schieberegister befüllen/entleeren. Dann hat man 
digital das Audio-Signal im FPGA.

>Für den Wandler brauchst du eine (Semi-)professionelle Platine (=>
>PCB-POOL, etc.).
>Mit "Lochrasterplatine" gehts nicht (vernünftig).

Nicht zwangsweise. Man erreicht vllt keine 96-100dB Rauschabstand per 
Lochraster, aber ich denke wenn man ca 75-80dB erreicht hat man schon 
vernünftig gearbeitet. Und fürs erste kann man damit wunderbar arbeiten 
bzw. sein Vorhaben umsetzen. Wenns dann nachher gut funktioniert kann 
man ja immer noch Aufwand treiben um den Wandler zu verbessern. Aber das 
ändert ja nichts an der grundsätzlichen Funktionalität.

von Alex P. (drdatensalat)


Lesenswert?

Hi Rene,

natürlich könnte man die prinzipielle Funktion des ADC einfacher testen.
Aber was ist dann getestet?
Was nützt ihm ein funktionierender Digitalfilter wenn er die analoge AD 
und DA nicht gut hinbekommt (-> Mixed Signal!).

Normalerweise fängt man sowas damit an, Frequenzgang, Rauschabstand, 
Klirrfaktor usw. festzulegen. Danach bemisst sich der ganze Rest.
Der ADC muss vor der Realisierung des Filters feststehen.
Für Audiosignale werden meist Sigma-Delta-Wandler eingesetzt, habe aber 
keine Erfahrung mit denen.

Alex

von Rene B. (themason) Benutzerseite


Lesenswert?

@Alex

Ich weiß was du meinst. Es wäre/ist die normale Vorgehensweise erst alle 
Parameter zu sammeln und dann zu entscheiden was man braucht bzw wie man 
es realisiert. Aber da die Realisation schon feststeht (FIR, FPGA, 
Koeffizienten per SciLab im EEProm gespeichert) würde mich persönlich 
erstmal interessieren ob das ganze auch so funktioniert (selbst wenn die 
Audio-Qualität nicht 100%, sondern nur 97% ist), da zwischen Simulation 
und realer Hardware meist ja doch ein Unterschied besteht :-)
Und ich denke das der TO nicht die absicht hat einen Wandler zu designen 
der 110 oder gar 120dB Rauschabstand hat (da sitzt man recht lange 
dran), sondern eben den FIR-Filter als zentralen Projektbestandteil.
Ich kann nur aus meiner Erfahrung mit meinem 
(never-ending)-Audio-Projekt sprechen das die Qualität der einfachen 
Codecs (hier TLV320AIC23B) doch sehr gut ist. Und dafür das ich 
essentielle Dinge bei meinem Wandler falsch gemacht hab (einfache 
SMD-Kondensatoren, keine Spule vor AVCC, keine separate Massefläche, 
alles auf Daumennagelgröße zusammengequetscht) hab ich doch recht 
akzeptable Werte (so um die 80dB).
Und ich denke wenn der FIR-Filter erstmal läuft ist ein besserer Wandler 
nicht das Thema, zumal man ja den FIR-Filter ohne weiteres auch von 
beispielsweise 16 auf 24 Bit aufbohren kann, was dann den Wandler 
letztenendes in den Hintergrund rücken lässt (zumindest was die 
Parameter wie 16/20/24 Bit angeht, da der FPGA ja einfach nur vor sich 
hinrechnet).
Aber wie man es realisiert (ob erst Wandler und dann FPGA oder 
umgekehrt) ist eig. zweitrangig. Hauptsache der Lerneffekt ist da, und 
man ist zufrieden mit dem was man gebaut hat. Geht mir mit meinem 
never-ending-Audio-Projekt ja nicht anders :-)
War vllt alles auch nur aus meiner Warte gesehen, da bei mir der 
Hauptbestandteil eben der Audio-Prozessor und nicht die Audio-Quali ist, 
die ich ja jederzeit durch nen anderen Wandler verschlimmbessern oder 
wirklich verbessern kann (was ich auch in einem nächsten Design machen 
werde, Stichwort : anderer Wandler, Spule vor AVCC, vernünftige 
Kondensatoren, usw ...).

von Sven K. (mueslifresser)


Lesenswert?

Nabend,

Ersteinmal danke für die rege Beteiligung!

Um mal die ersten Bedenken aus dem Weg zu räumen. Ich bin auf dem Gebiet 
des Platinendesigns kein Neuling. Sicher habe ich noch eine Menge dazu 
zu lernen, aber Eagle und Co sind für mich keine fremden Werkzeuge. 
Ähnlich das Herstellen von Platinen. Ich sehe auch kein Problem eine 
Mehrlagige Platine (mehr als zwei Layer) herzustellen. Was hindert mich 
daran mehere Platinen übereinander zu kleben :-).

Aber trotzdem Danke für die gutgemeinten Tips! Wenn man sich nicht 
sicher ist, wer da auf der anderen seite der Tastartur sitzt, sollte man 
ihn immer vor dem bösen Erwachen des totalversagens der Elektronik 
warnen

Der switched-cap kommt nicht in betracht. Er bringt mir nicht die 
Vorteile eines FIR-Filters.

Ich denke ich werde mich an Renes vorschlag halten und ersteinmal einen 
Versuch mit dem TLV320AIC23B aufbauen. Wenn ich darauf die FPGA mit 
einem FIR-Filter zum laufen gebracht habe, dann denke ich über eine 
HIGH-END version nach.

Da ich aber jetzt erstmal von euch die bestätigung habe, das es in etwa 
so funktionieren müsste. Begebe ich mich ersteinmal daran die 
Filterkoeffizienten zu bestimmen.

Das Richtige bearbeiten der Koeffizienten mit SciLab ist ja nochmal eine 
Kunst für sich, auch wenn man die Arbeit von Swen Müller zu seinem HUGO 
kennt :-).

Grüße,
Sven

von Rene B. (themason) Benutzerseite


Lesenswert?

>Begebe ich mich ersteinmal daran die Filterkoeffizienten zu bestimmen.

Ich würde vllt erstmal die grobe Struktur in VHDL programmieren und 
simulieren. Vor allem ist es wichtig zu wissen wieviele Taps du 
brauchst. Je mehr Taps du hast desto weiter kannst du mit der 
Grenzfrequenz deines Filters runtergehen, und das bestimmt auch 
maßgeblich die Programmierung in VHDL (selbst wenn man da sicherlich 
parametrieren kann, aber so hat man das "Herzstück" erstmal fertig). Die 
Koeffizienten sind erstmal nebensächlich (bis auf die Anzahl).

von Rene B. (themason) Benutzerseite


Lesenswert?

Vllt noch einen Tipp zur Vorgehensweise (nur exemplarisch) :

Zentraler Bestandteil eines FIRs ist ja die MAC-Einheit. Je nachdem ob 
du mit 16/24/32 Bit arbeiten willst schreib und simulier dir die 
MAC-Einheit als erstes (bei Pipelining bietet es sich an die MAC-Einheit 
als erstes zu schreiben). Dann die Verzögerungselemente sowie den 
Koeffizientenspeicher dazu (BlockRAMs bieten sich an, wenn man Xilinx 
verwendet) mit Test-Daten. Und als Top-Level Entity die I2S-Komponente 
mit der der Audio-Datenstrom eingelesen bzw ausgegeben wird. Wenn das 
alles passt kannst du dir das Interface zu einem uC (wenn ich das 
richtig verstanden habe und du das EEProm nicht direkt an den FPGA 
anklemmst) überlegen um die Koeffizienten zu schreiben. Da würde sich 
der einfachheit halber ein SPI-Interface anbieten. Zudem kann man dann 
noch unterschiedliche Koeffizientensätze auswählen (EQ-Presets) und/oder 
Lautstärkeeinstellung/Mute usw vom uC aus setzen. Aber das ist nur 
optional wenn du die Frequenzweiche noch etwas flexibler halten willst.

von Sven K. (mueslifresser)


Lesenswert?

Hallo Rene,

Ich danke dir erstmal für deine Mühe. Ich komme defenitiv nochmal darauf 
zurück. Aber das was mir wichtig war, ist geklärt : die Machbarkeit.
Jetzt muss ich mich den anderen Baustellen zuwenden, die auch alle mit 
diesem Projekt zu tun haben und schauen wie es da aussieht.

Grüße,
Sven

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.