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
>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.
Natürlich lässt sich a-law/µ-law in VHDL implementieren. Das ist reine integer tabellen algorithmik. Bestimmt sehr gut geeignet zum Einarbeiten...
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?!?
>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.
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; }
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.