Forum: FPGA, VHDL & Co. a-law / µ-law Converter


von Tom (Gast)


Lesenswert?

Hallo zusammen,

ich würde gerne einen linear/a-law, linear/µ-law Converter und vice
versa entwickeln...

Da ich mich gerade in VHDL intensiv einarbeite, bin ich für jeden Tipp
dankbar, wie ich diese Converter realisieren könnte.

Kann der Komprimieralgorithmus überhaupt in VHDL programmiert werden?
Soweit ich weiß, gibt es in VHDL kein Konstrukt für logarithmische
Berechnungen...

Wären die Abbildungsfunktionen bzw. -tabellen in eine Case-Verzweigung
sinnvoll? Wäre ja ein mächtiger Eingabeprozess....

Hat jemand hier schon mal so einen Converter entwickelt?!?

Fragen über Fragen....

Gruß
Tom

von Xenu (Gast)


Lesenswert?

>Kann der Komprimieralgorithmus überhaupt in VHDL programmiert werden?
>Soweit ich weiß, gibt es in VHDL kein Konstrukt für logarithmische
>Berechnungen...

Willst Du das wirklich mit Geitkommazahlen machen?

Ich nehme mal an, daß die Daten aus einem AD-Wandler kommen.
Wieviel Bit?

Am einfachsten wäre dann ein internes FPGA-RAM als Tabelle zu benutzen.

von Christian K. (christiank)


Lesenswert?

Natürlich lässt sich a-law/µ-law in VHDL implementieren. Das ist reine
integer tabellen algorithmik. Bestimmt sehr gut geeignet zum
Einarbeiten...

von Tom (Gast)


Lesenswert?

Hallo zusammen,

erstmal vielen Dank für die Tipps..!!

Habe gestern noch ein wenig nachgedacht und muss auch meine
Fragestellung diesbezüglich ein wenig korrigieren und spezifizeren.

Selbstverständlich kommt der 16 Bit Datenstrom nach einem A/D Wandler
und linearer Quantisierung. Kann ich einen Komprimieralgorithmus für
die Codierung der linearen 16 Bit Werte auf 8 Bit mit beiden
Codieralgorithmen bzw. die Decodierung beider Codierungen auf den 16
Bit linearen Datenstrom in VHDL programmieren, oder ist es sinnvoller,
eine Tabelle mit den den jeweiligen 256 Codierwerten als Funktion von
den linearen Werten (und umgekehrt) zu programmieren?!?

Es müßten smit dann 4 Tabellen erstellt werden. Mache ich das am Besten
mit einer Case-Verzweigung?!? Oder gibt es sinnvollere Ansätze?!?

von Xenu (Gast)


Lesenswert?

>Es müßten smit dann 4 Tabellen erstellt werden. Mache ich das am
Besten
>mit einer Case-Verzweigung?!? Oder gibt es sinnvollere Ansätze?!?


Xilinx-Bausteinen haben internes RAM ("Block RAM" ist die
Xilinx-Bezeichnung). Das kannst Du entweder direkt als Komponente
instanziieren oder Du schreibst Deinen VHDL-Code so, daß der
Synthesizer
daraus RAM generiert. Wie Du das machst, steht im "XST User Guide".

Mit Altera und Lattice habe ich persönlich kaum Erfahrung; da müsstest
Du aber auch passende Infos bei den Herstellern bekommen.

von Detlef A (Gast)


Lesenswert?

Hi,

die Kompression ist so gebaut, daß sich sich gut in hardware gießen
läßt. Ich kann zwar leider kein VHDL, glaube aber, daß sich folgende
C-Bitfummelei von PCM -> alaw gut in hardware machen läßt.

Cheers
Detlef

unsigned char pcm2ALaw_bit(__int16 iVal)
{
#define  EIN(x,_y_) ((  iVal >> (x_-_y))&(1<<_y_))
#define NEIN(x,_y_) (( ~iVal >> (x_-_y))&(1<<_y_))

unsigned char sign, seg, off;

    iVal >>= 3;
    seg  = ((~((iVal)>>12) )&(1<<3));
    iVal^= (-(iVal<0));
    seg |=
     (EIN(8,2)|EIN(9,2)|EIN(10,2)|EIN(11,2))|

(EIN(10,1)|EIN(11,1)|(EIN(6,1)&NEIN(8,1)&NEIN(9,1))|(EIN(7,1)&NEIN(8,1)& 
NEIN(9,1)))|
     (
EIN(11,0)|(EIN(9,0)&NEIN(10,0))|(EIN(7,0)&NEIN(8,0)&NEIN(10,0))
      |(EIN(5,0)&NEIN(6,0)&NEIN(8,0)&NEIN(10,0)));
    seg =((seg<<4)|((iVal>>((seg&7)+(!(seg&7))))&0xf))^0x55;

     return seg;

}

von Tom (Gast)


Lesenswert?

Hallo zusammen,

vielen Dank für die wertvollen Tipps.

@ Detlef: Deine Compression sieht so nach ADPCM aus. Irgendwie wird von
einem Wert der Folgewert abgezogen und dann codiert.... oder irre ich
mich da?!?
Ich suche eine Codierung von einem 16 Bit, linear qauntisierten
Datenstrom in 8 Bit a-law und µ-law Kompression....
Trotzdem ein Danke schön an den Codeschnippsel....

Ich werde sehr wahrscheinlich eine Look-up Tabelle in VHDL-Schreiben.
Scheint zwar etwas mühsam zu sein, aber irgendwie habe ich noch keinen
richtigen Algorithmus zur Codierung von 16 Bit linear quantisierten
Daten in die a-law/µ-law Codierung (Kompression) gefunden.

Es existieren nur die 13Bit linearen auf 8 Bit Codierungstabellen der
ITU im G.711 Standard, aber die kann ich auch nicht so richtig
interpretieren kann, da irgendwie kein richtiger
Konvertierungsalgorithmus angegeben ist.....

Für weitere Tipps wäre ich sehr dankbar....!!!

Viele Grüße
Thomas

von Detlef A (Gast)


Lesenswert?

Hi,

Du willst die 13 Bit entsprechend G.711 auf das Byte entsprechend a-law
abbilden?! Das genau macht das snippet, nix ADPCM (die Subtraktion in
dem Macro macht der Präprozessor zur Compilezeit), nix abziehen. Zwei
Bemerkungen dazu noch: Der Code geht von 16Bit input aus, für 13Bit
input  "iVal >>= 3;" rauskommentieren. Das "^0x55" dreht
entsprechend der Norm die 'even bits', zum testen das besser lassen.
Tabelle für 8Bit zu 12Bit ist ok, aber willst Du zum Codieren wirklich
8k Byte verbrennen? Das snippet schiebt nur Werte(für Dich als VHDLer
is das 'free lunch', ne Strippe), undet und odert. Das ist ne
handvoll 7400 und Konsorten.

Cheers
Detlef

von Tom (Gast)


Lesenswert?

Hi Detlef,

danke nochmals Deiner Tipps. Ich habe jetzt einen a-law
Kompressions-Algorithmus entwickelt, der in Berechnungen funktioniert.
Nun gilt es, diesen in VHDL umzusetzen.

Die Inversion der even Bits im Standard für die Decodierung habe ich
aber nicht so richtig geschnallt.


Gruß
Tom

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.