Forum: Digitale Signalverarbeitung / DSP / Machine Learning Helix MP3 Dekoder mit kleineren Huffman-Tabellen


von Marius S. (lupin) Benutzerseite


Angehängte Dateien:

Lesenswert?

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 :)

: Verschoben durch Admin
von Marius S. (lupin) Benutzerseite


Angehängte Dateien:

Lesenswert?

Den Code für die Einbindung des Helix-Dekoders habe ich mir von hier 
geklaut und ein wenig ausgedünnt/angepasst:
Beitrag "STM32F4 Discovery MP3 Player - komplett mit Code"

In der Tabelle mit 3 Ebenen hat sich noch ein Fehler eingeschlichen.
Die Quad-Values sind auch in der Tabelle gelandet, da ich die auf dem 
FPGA auch mit der Tabelle dekodieren will.

Hier die Tabelle ohne die Quad-Values (werden im Code nicht genutzt, da 
ich die Original Funktion vom Helix-Dekoder für die Quads nutze).

: Bearbeitet durch User
von Marius S. (lupin) Benutzerseite


Lesenswert?

Noch zur Info:
Es sind insgesamt 1393 Huffman-Codes im Standard definiert.

Der Helix-Dekoder hat also eine Redundanz von 3,045
Die 3-Ebenen Tabelle hat eine Redundanz von 1,513
Die 4-Ebenen Tabelle hat eine Redundanz von 1,345

Die minimal mögliche Größe sind 1820 Tabellen-Einträge bei 8 Ebenen.
Ich glaube besser geht nicht - das wäre eine Redundanz von 1,307 und 
lohnt sich nicht wirklich im Vergleich zur 4-Ebenen-Tabelle.

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.