Forum: FPGA, VHDL & Co. Signal mit 48kHz in 44,1kHz umwandeln


von PC-Verbinder (Gast)


Lesenswert?

Ich bekomme aus einem AC97 encoder chip ein digitales Signal mit 48kHz, 
das ich 44,1kHz umwandeln möchte. Mit einem FPGA sollte das machbar 
sein, ich frage mich aber, wie ich das am Besten angehe.

Was mir bewusst ist, ist dass ich gfs etwas Bandbegrenzung einsetzen 
muss, was aber kein Problem darstellen sollte. Ich dachte an ein 20kHz 
Filter. So etwas habe ich schon implementiert.

Mir geht es aber um eine geschickte Erzeugung des 44,1 Taktes.

Im Grunde brauche ich eine PLL, die von 48kHz mit 441 auf 21,1 MHz 
übersetzt und einen Teiler 48. Mit dieser Datenradte liesse sich dann 
ein CIC Filter treiben, dass mit 480 zu 441 übersetzt.

Lässt sich das in einem FPGA bauen?

von Bernd G. (Gast)


Lesenswert?

Was du suchst, steht in der Xilinx Application Note XAPP514
http://www.xilinx.com/support/documentation/application_notes/xapp514.pdf
und nennt sich Sample Rate Converter

Chapter 22 ff, wenn ich mich jetzt nicht irre.

Im schlimmsten Falle von außen einen Multiclock Generator 
PLL1700/1705/1706
(TI) oder etwas moderneres anbinden.

von PC-Verbinder (Gast)


Lesenswert?

Die Prinzipien sind mir natürlich geläufig, aber es scheint 
komplizierter zu werden, als ich dachte. Wenn ich z.B. die asynchronous 
rate conversion verwende, müsste ich éinmal von der externen 48kHz auf 
meine interne Rate Konvertieren und dann nochmals auf die 44,1.

Ich meine, es müsste wohl möglich sein, die interne domain so zu wählen, 
dass direkt 44,1 auszugeben sind, damit die Ratenkonversion nur einmal 
zu geschehen hat. Oder wäre es passender, die domain auf die externe zu 
synchronisieren?

von J. S. (engineer) Benutzerseite


Lesenswert?

Du brauchst beides, weil Dein Datentak ja von extern kommt. Ich würde zu 
einer stabilen Taktfrequenz des FPGAs raten, aus der die 44,1 zu 
erzeugen sind, oder falls nötig umschaltbar gehandhabt wird.

Um eine echte Ratenkonversion wirst Du nur herumkommen, wenn Du die 44,1 
hart an der 48 ausrichten kannst und darfst. Dann solltest Du die 44,1 
auf den externen Takt synchen. Da kann man komplett im FPGA machen und 
auch für unterschiedliche Frequenzen einstellbar machen. Ich hatte mal 
dies hier realisiert:

http://www.96khz.org/oldpages/frequencyconversion444896.htm

Die Schaltung synchronisiert sich auf jeweils den Datentakt und stellt 
den digitalen Bittakt für s/PDIF passend in Frequenz und Phase ein.

Es ist aber fraglich, ob das bei Dir geht bzw sinnvoll ist, weil der 
FPGA sicher noch andere aufgaben haben wird. Falls es gar kein FPGA sein 
muss, weil der nur dafür benötigt wird, gibt es heute auch Chips, die 
das direkt lösen und dies sehr gut, weil sie intern auf eine viel höhere 
Oszillatorfrequenz kommen und damit das Resampling über Taktdomämen 
hinweg genauer wird.

Ferner gäbe es noch die klassische Studiolösung: Man wandelt das Signal 
der 48kHz auf analog und redigitalisiert es wieder. Das umgeht einige 
Probleme des Resampling und des Jitters. Kommt drauf an, was von vorne 
kommt.

Wenn es ein AC97-Typ ist, hat der ja seine Bitclock, an die Du Dich 
dranhängen kannst. Mit etwas Gebiege kann man einen 25 MHz-Quarz so 
ziehen, dass eine nachgeschaltete PLL mit 29/59 genau den 12.8MHz 
Bittakt repräsentiert.

von Bernd G. (Gast)


Lesenswert?

> Falls es gar kein FPGA sein
> muss, weil der nur dafür benötigt wird, gibt es heute auch Chips, die
> das direkt lösen und dies sehr gut,

Das würde ich auch empfehlen: schnell realisiert, sehr preiswert, sehr 
hohe Funktionalität, erprobte Sache, garantiert fehlerfreie Funktion, 
z.B. SRC 4382, um nur mal eine Hausnummer zu nennen.
Ich würde mir hier nicht das Leben schwerer machen, als es notwendig ist 
-
außer dein Chef will es unbedingt. Der Zeitaufwand zur Realisierung 
unter Berücksichtigung der erforderlichen Designverikation dürfte sich 
wie 1 zu mindestens 1k verhalten.

von J. S. (engineer) Benutzerseite


Lesenswert?

Oder aber es ist, wie so oft und es muss was nachgerüstet werden, ohne 
ein redesign der Platine zu machen :-)

Außerdem gibt es jaauch Quellen, wo man solche feinen Audio-VHDL-Sachen 
preisgünstig einkaufen kann :-D

von PC-Verbinder (Gast)


Lesenswert?

Danke schon einmal für Eure Tipps. Wenn es einen Chip gibt, der das 
leistet, wäre das eine Alternative. Derzeit besteht aber die Intention, 
es im FPGA zu lösen. Ich habe aber nun noch ein anderes Problem:

Ich musst / müsste auch die Umwandlung des codierten Datenstroms des 
AC97 coders leisten. Dieser liefert mir das Signal aber nur seriell im 
SPDIF Format. Das zu dekodieren sollte eigentlich einfach sein, dachte 
ich, aber ein Blick auf das Datenformat macht mich unschlüssig, wie ich 
da sicher einen Anfang erkennen kann.

Das Datenformat ist so eine Art Manchester Code, falls das jemand kennt 
und hat im Wesentlichen 2 unterschiedliche Frequenzen, aber keinen Takt 
und keinen richtigen Anfang. Wahrscheinlich muss ich einfach etwas 
aufzeichnen und dekodieren um rauszubekommen, wo der Anfang ist?

von Clemens L. (c_l)


Lesenswert?

Den Anfang eines Frames erkennt man an den drei gleichen Bits. Den 
Anfang des ersten Frames im Datenblock erkennt man an der "B"-Präambel.
(Siehe http://www.hardwarebook.info/S/PDIF .)

Zur Umwandlung von S/PDIF in etwas 'normales' wie I²S gibt es natürlich 
auch fertige Chips wie z.B. CS8416 oder WM8805.

von PC-Verbinder (Gast)


Lesenswert?

So ganz bin ich da noch nicht durchgestiegen, aber auf den ersten Blick 
sind es einmal eine 000 und einmal eine 111 Folge. Die können aber doch 
in den Audiodaten ebenfals vorkommen?

von Clemens L. (c_l)


Lesenswert?

Ein Audio-Bit wird als zwei Bits kodiert, von denen das erste immer den 
vorherigen Zustand invertiert; im Zweiphasenmarkierungscode sind drei 
gleiche Bits eigentlich nicht erlaubt.

von 3162534373 .. (3162534373)


Lesenswert?

PC-Verbinder schrieb:
> Wenn es einen Chip gibt, der das
> leistet, wäre das eine Alternative.

SRC4192 von Ti oder ähnliche von Ti.
Geht voll simpel und sogar mit angemessener Audioqualität ;)

von PC-Verbinder (Gast)


Lesenswert?

Clemens L. schrieb:
> Ein Audio-Bit wird als zwei Bits kodiert, von denen das erste immer den
> vorherigen Zustand invertiert; im Zweiphasenmarkierungscode sind drei
> gleiche Bits eigentlich nicht erlaubt.

Das verstehe ich nicht. Ich dachte ich muesste erstmal die Bis 
dekodieren, dann fällt diese "Doppelfrequenzinformation" ja weg.

Ich habe dann doch nur wieder die ursprünglichen Datenbits und da 
könnten doch 3 in Folge vorkommen ???

von Clemens L. (c_l)


Lesenswert?

Der Frame-Anfang ist kein gülter Code und kann nicht dekodiert werden.

von Günter Lenz (Gast)


Lesenswert?

PC-Verbinder schrieb:
>Mir geht es aber um eine geschickte Erzeugung des 44,1 Taktes.

Mit einer PLL-Schaltung.
Einen VCO mit 44,1kHz aufbauen. Diese Frequenz durch 147 teilen = 300Hz.
Die 48kHz durch 160 teilen = 300Hz. Diese beiden 300Hz Frequenzen
mit einem Phasendetektor vergleichen. Die daraus entstandene Spannung
steuert den VCO. Der CD4046 enthält einen VCO und einen Phasendetektor.
Damit läßt sich das leicht realisieren. Man braucht dann nur noch
die Frequenzteiler.

von Hameg (Gast)


Lesenswert?

Interessante Sache. Aber wie sieht das mit den Kosten aus. Kann ein FPGA 
gegen ca. 20€ für SRC4392 + Oszillator antreten? Hatte nämlich auch 
schon mal mit deinem Lösungsweg geliebäugelt.

Und von einer PLL aka PLL17xx würde ich abraten. Das sind 
Jittergeneratoren. Damit machst du aus cd-Qualität fm-Radioqualität. Es 
sei denn, du reclockst das Signal wieder mit einem ASRC.

von Ralph T. (programinator)


Lesenswert?

Hameg schrieb:
> ca. 20€ für SRC4392 + Oszillator

Aus eigener Erfahrung: mit einem guten Einkauf und einigermaßen 
Stückzahlen bekommt man den SRC4392 für unter 7€. Wenn ein reiner SRC 
ausreicht würde ich mal auf den SRC4190 bzw. SRC4192 schauen. Ersteren 
beziehen wir für ca. 2,5€. Naja und den Oszillator gibt es für wenige 
Cents...

von PC-Verbinder (Gast)


Lesenswert?

Wenn  bräuchte ich erstmal nur einen und müsste das board umbauen. FPGA 
wäre die bessere Lösung, wenn es nicht zu aufwändig ist.

von J. S. (engineer) Benutzerseite


Lesenswert?

Hameg schrieb:
> Interessante Sache. Aber wie sieht das mit den Kosten aus. Kann ein FPGA
> gegen ca. 20€ für SRC4392 + Oszillator antreten? Hatte nämlich auch
> schon mal mit deinem Lösungsweg geliebäugelt.

Wenn der FPGA ohnehin da ist, zahlt man quasi nur die Chipfläche für den 
Interface-Core und das ist minimal. Ein S/PDIf Interface in zwei 
Richtungen kostet je nach Komplexität (ohne Wishbone oder Businterfaces) 
rund 2k LEs bei Altera. Das sind anteilig eher 3-4 Euro. Extra einbauen 
wird man einen FPGA aber nicht.

> Und von einer PLL aka PLL17xx würde ich abraten. Das sind
Jittergeneratoren.

Je nachdem, wie der FPGA eingesetzt wird, ist der Jitter ja ziemlich 
egal. Oder, man muss das Signal direkt treiben, dann muss sich der 
Jitter in Grenzen halten. Die SPEC nach S/PDIF einzuhalten ist bei einem 
aktuellen FPGA aber kein Thema.

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.