Huffman-Kompression auf dem AVR

OP #1446799
Hallo,
Ich möchte hier meine Implementierung der Huffman-Kompression für den 
AVR vorstellen.
Der Vorteil gegenüber der früher in diesem Forum geposteten Software ist 
die Einhaltung der avr-gcc ABI, so dass dieser Code einfach in 
C-Programmen zu verwenden ist.
Im "host"-Verzeichnis liegen die host-tools zum komprimieren und 
dekomprimieren (geschrieben in portablem C, sollten sich eigentlich 
überall compiliere lassen). Im "test"-Verzeichnis liegt eine 
Test-Applikation die auch noch ein paar andere nette Dinge enthält 
(uart, kommandointerface, dump utility, ...).
Das ganze steht unter der GPLv3 Lizenz.
Updates gibt es im svn unter 
http://das-labor.org/svn/microcontroller-2/lib/avr-huffman.

Der AVR kann allerdings nur dekomprimieren, der Assembler Code dafür 
brauch nur 572 Bytes an Flash-Speicher.

Ein wenig Doku findet sich im Labor wiki unter 
http://www.das-labor.org/wiki/AVR-Huffman

Viel Spaß damit,
  nerilex
Angehängte Dateien:
Gast
Mal eine Frage ...


unkomprimiert:
> 00000000  61 62 63 61 61 61 62 0a

komprimiert:
> 00000000  c0 de 05 01 61 00 04 63  0a 62 ff 68 35 e0

Ist im komprimierten auch gleich schon der Huffmann-Baum gespeichert, 
oder nur die komprimierten Daten?

Normalerweise sollte aus der oben genannten Sequenz sowas rauskommen:

Generiertes Alphabet:
a: 0
b: 10
c: 110
0x0a: 111

Ergebnis (binär): 0,10,110,0,0,0,111 = 0x587

aber selbst mit gespeichertem Alphabet ...
0x00 0x61 0x02 0x62 0x06 0x63 0x07 0x0a | 0x05 0x87

Aber das ist immer noch weniger als die Sequenz oben ...
OP
In dem gewählten Beispiel werden die komprimierten Daten von dem Baum 
dominiert.

Die Daten lassen sich wie folgt aufteilen:

Header: c0 de
Baum:   05 01 61 00 04 63  0a 62 ff
Daten:  68 35 e0

Es gibt mehrere Möglichkeiten einen entsprechenden Huffmanbaum zu 
konstruieren. Daher ist es wichtig den Baum so zu speichern, das er 
exakt wieder hergestellt werden kann.
Ich verwende eine spezielle Technik um den Baum zu speichern. Dazu wird 
der Baum so verändert, dass von links nach rechts der Baum immer tiefer 
wird. Dann werden die Ebenen aufsteigend gespeichert. D.h. Es muss nur 
die Anzahl der Blätter je Ebene gespeichert werden gefolgt von den 
Werten der Blätter.

mfg
  nerilex

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.