Forum: Projekte & Code [AVR ASM] Huffman (de)kompression


von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ein dekompressions Algorithmus für Daten, benuzt wird ein Huffmanbaum.
Nützlich z.B. für die komprimierung von statischen Bildern bei 
Grafikdisplays. (bis zu 70% Kompression je nach Eingangsdaten)

Die Funktion benötigt im Y-Pointer einen Zeiger auf den SRAM wohin die 
Daten entpackt werden sollen, und im Z-Pointer auf den Flash wo die 
komprimierten Daten liegen.
Dies kann aber durch #defines angepaßt werden, sodass theoretisch gleich 
auf das DisplayRam geschrieben wird, oder aus dem EEProm/externem 
Speicher gelesen wird.
Beispiel:
1
.include "m32def.inc"
2
3
.dseg
4
  buffer:
5
  .org 0x60
6
  .byte 12
7
.cseg
8
9
//Feldpointer initialisieren für Huffman
10
ldi YL, LOW(buffer)
11
ldi YH, HIGH(buffer)
12
//Datenpointer initialisieren
13
ldi ZL, LOW(daten*2)
14
ldi ZH, HIGH(daten*2)
15
call huffman
16
call <FlushSRAM2Display>
17
18
loop:
19
rjmp loop
20
.include "Huffman.asm"
21
daten:
22
.include "daten.txt"

Einstellmöglichkeiten: (jeweil über #defines)
- Von wo gelesen werden soll
- Wohin soll geschriben werden
- Sollen die verwendeten Register gerettet werden
- soll der 4bit Modus unterstüzt werden

Komprimiert werden können Daten mittels des Javaprogramms im Anhang 
(nächstes Posting), gelesen werden Binärdaten (Ich erzeuge die mit 
meinem GrafikKonverter bspw: Beitrag "Grafikkonverter Tool für AVR/Mikrocontroller (BMP2C, BMP2ASM, BMP2BASCOM)" 
), geschrieben wird eine TXT Datei im AVR Studio ASM Format die einfach 
per include eingebunden werden kann.

Wenn Interese besteht kann ich natürlich noch ne kleine Doku zum 
Dateiformat veröffentlichen, z.B. wenn jemand Lust hat einen 
(kompatiblen) dekompressor in C oder Basic zu verfassen.

Zur Geschwindigkeit:
bei 16MHZ dauert es eine 240x64 Pixel Grafik zu dekodieren mit 24% 
kompressionsrate im 8bit Modus etwa 15ms
bei 4bit (30% gleiche Datei) etwa 19,5ms

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

Wenn Java installiert ist kann das JAR File meist per Doppelklick direkt 
ausgeführ werden, oder aus der Konsole heraus mittels:
java -jar Huffman_Kompressor_V1.jar
Zusätzlich kann der 4-BitModu mittels:
java -jar Huffman_Kompressor_V1.jar 4
gewählt werden, dies bringt manchmal höhhere Kompressionsraten durch den 
kleineren Huffmanbaum der entsteht.

von avr (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Läubi

Ich habe versucht eine Binärdatei mit dem Kompressor zu komprimieren. Er 
zeigt eine Kompression von 22KB zu 16KB an, aber erzeugt eine 100KB 
Datei? Die Test-Datei habe ich angehängt.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

avr schrieb:
> Er zeigt eine Kompression von 22KB zu 16KB an, aber erzeugt eine 100KB
Die Datei welche erzeugt wird ist eine für den AVR Assembler gedachte 
Textdatei, enthält also sehr viel redundanz durch die ASCII Codierung 
(in HEX) sowie ein paar Kommentare.
Nach dem assemblieren werden daraus aber wieder die "binären" 16KB.

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.