www.mikrocontroller.net

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


Autor: Tom (Gast)
Datum:

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

Autor: Xenu (Gast)
Datum:

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

Autor: Christian K. (christiank)
Datum:

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

Autor: Tom (Gast)
Datum:

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

Autor: Xenu (Gast)
Datum:

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

Autor: Detlef A (Gast)
Datum:

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

}

Autor: Tom (Gast)
Datum:

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

Autor: Detlef A (Gast)
Datum:

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

Autor: Tom (Gast)
Datum:

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

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.