Für meine Bachelor-Arbeit implementiere ich eine Huffman-Dekodierung für
MP3s in VHDL. Dabei sind als Nebenprodukt angepasste Huffman-Tabellen
für den Helix MP3 Dekoder abgefallen.
Ich habe mir den Dekoder genommen um meine berechneten Tabellen zu
prüfen.
Das Prinzip der Dekodierung ist im Grunde das gleiche geblieben wie beim
original Code.
Folgende Dateien habe ich im Dekoder geändert:
hufftabs.c - Neue Huffman-Tabellen
huffman.c - Anpassung der Big-Value Dekodierung (DecodeHuffmanPairs)
coder.h - HuffTabLookup-Typ und Definitionen für hufftabs.c geändert
In der Funktion DecodeHuffman habe ich noch eine ganz kleine Optimierung
bei der Berechnung der Region-Grenzen gemacht, aber macht eigtl. keinen
Unterschied.
Im Anhang ist das komplette Projekt in Visual C++ 2010 Express.
Die EXE öffnet test.mp3 und spielt sie ab. Zum Kompilieren wird SDL für
die Sound-Ausgabe benötigt.
Der Helix-Dekoder benötigt für die Huffman-Tabellen 4242 16-Bit Wörter
(8484 Bytes).
Dafür werden viele Codes aber bereits mit einem Look-Up in der Tabelle
dekodiert (vor allem für die kleineren Huffman-Tabellen).
Aus irgend einen Grund unterscheidet der Dekoder allerdings zwischen
Loop-Tabellen (mehrere Look-Ups) und One-Shot (ein Look-Up). Das erhöht
wiederum die Code-Größe.
Die kleinere von meinen beiden Tabellen benötigt 1874 16-Bit Wörter
(3748 Bytes) und jeder Code wird in maximal 4 Look-Ups dekodiert.
Die etwas größere Tabelle benötigt 2108 16-Bit Wörter (4216 Bytes) und
jeder Code wird in maximal 3 Look-Ups dekodiert.
Also in jeden Fall spart man sich ca. 4 kByte. Wenn man den Dekoder für
einen Controller mit wenig ROM kompiliert kann das schon etwas helfen.
Wenn jemand das mit den angepassten Tabellen mal auf einem
Mikrocontroller ausprobieren könnte und hier eine Rückmeldung geben
könnte wäre das super.
Würde mich mal interessieren, ob es ein wirklicher Performance-Verlust
ist.
Die Huffman-Kodierung ist eigentlich nicht das rechenintensivste bei der
MP3 Dekodierung, von daher sollte der Performance-Verlust sich in
Grenzen halten.
Die Daten für meine Tabellen passen auch in 12-Bit - damit spare ich auf
dem FPGA Resourcen, für den Helix-Dekoder bringt das natürlich nix.
Das Programm, welches die Tabellen erzeugt, ermittelt die optimale Größe
der Tabellen und Unter-Tabellen für eine beschränkte Look-Up-Tiefe. Dazu
gehe ich im Programm stumpf alle Möglichen Kombinationen durch (ein
besserer Algorithmus ist mir nicht eingefallen :)).
Das Programm will ich aber noch nicht hier rein stellen, für den Code
schäme ich mich etwas :)