Forum: Mikrocontroller und Digitale Elektronik Daten im MC komprimieren


von Grübler (Gast)


Lesenswert?

Hallo zusammen.

Ich möchte einen Datenlogger mit einem
Atmel-MC bauen. Eingelesen werden mehrere
Analogkanäle also 10Bit-Werte.
Damit ich möglichst viele Daten im
"begrenzten" Speicher (RAM o. EEPROM)
unterbringen kann, habe ich mir folgende
Strategie überlegt:

Von der ersten Messung speichere ich den
vollen 10Bit-Wert. Von den nachfolgenden
Messungen, werde ich nur den Differenzwert
zur Messung davor speichern. Der Sinn liegt
darin, dass die Differenzwerte kleiner als
10Bit sind. (Im Mittel rechne ich mit 4-5Bit + Vorzeichen).

Diese "kleinen" Zahlen möchte ich nun in
int- oder long-Variablen so zusammenfassen
"zippen", dass der Speicher des MC möglichst
optimal genutzt wird.

Das Suchen im Netz bringt unzählige
Links zum komprimieren von PC-Daten und so.

Ich suche aber nach einem Rechenverfahren
für mein oben beschriebenes Problem.

Wer kann mir ein Stichwort, Prozedur oder
anders Hilfreiche nennen?

Danke schon mal im Voraus.

von me (Gast)


Lesenswert?

Ich würde mir eher überlegen ob du die vollen 10bit brauchst.
Für Langzeitaufzeichnungen und Auswertung dürfte eine SD-Karte sinvoller 
sein.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Erstmal würde ich nicht 10Bit in shorts (16bit) Speichern, sondern immer 
schön zusammenschieben. Also 16 Werte in 160Byte. Oder 8 Werte in 
80Byte, ...
So bekommst du in einen 24c512 i2c eeprom schonmal 52428 Werte rein, 
8bit bleiben übrig.
Mit deiner Differenzrechnung kommst du bei 10Bit erstwert, dann 6Bit 
Differenz inkl. Vorzeichen auf 87379 Werte, die reinpassen...

Wenn das nicht reicht such dir z.B. eine einfach ZIP Implementierung, 
die dir alle 25000 Werte oder so den Inhalt des eeproms komprimiert. Das 
dürfte in ca. 15-20k Code passen und in ca. 3-5 Minuten durchgelaufen 
sein.

Wenn das nicht reicht würd ich eine 2GB SD Karte für <5 Euro reinpacken.

von Purzel H. (hacky)


Lesenswert?

Zwischen einem RAM/EEPROM und einer SD Karte liegen die Atmel 
Datenflash. zB ein AT45DB161B mit 2MegaBytes fuer 1.70 Euro.

von (prx) A. K. (prx)


Lesenswert?

Huffman-Codierung der Differenzen: kleine kurz, grosse lang codieren.

Einfachbeispiel:
  0 = 0
  10xxxx = 4 Bit
  110xxxxxxx = 7 Bit
  111xxxxxxxxxx = 10 Bit

Welche solche Variante optimal ist kannst du aus der 
Wahrscheinlichkeitsverteilung einer Probemessung ermitteln und fest ins 
Programm einbauen.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

>die Atmel Datenflash
Dafür gibt es sogar ein schickes "Referenzdesign" mit Quellcodes dazu, 
der AT90USBKey, bei dem könnte man abgucken.

Zweimal 8MB auf dem Board (AT45DB642D).

von Martin S. (sirnails)


Lesenswert?

Oh weh A.K. Wenn doch Huffman nur so einfach wäre. Alleine das 
Aufstellen des Baumes fordert einen sehr rechenintensiven und vor allem 
durchdachten Algorithmus.

von avr (Gast)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

Martin Schwaikert schrieb:

> Oh weh A.K. Wenn doch Huffman nur so einfach wäre. Alleine das
> Aufstellen des Baumes fordert einen sehr rechenintensiven und vor allem
> durchdachten Algorithmus.

Oh weh Martin: Das kann man vorher auf dem PC machen und fest ins 
Programm einbauen. Ist dann nicht für jedes Signal optimal, aber dafür 
sehr einfach im Controller.

Für geringere Ansprüche peilt man über den Daumen.

von Matthias K. (mkeller)


Lesenswert?

nimm eine SD-Card, wenn du so unter Platzmangel leidest ...

von Grübler (Gast)


Lesenswert?

Matthias Keller schrieb:
> nimm eine SD-Card, wenn du so unter Platzmangel leidest ...

Darauf wir es wohl hinauslaufen
Danke für die Tipps

von Dussel (Gast)


Lesenswert?

Verändern sich die Werte langsam ? Ab einem Trippel hilft bereits RLE.

von Anja (Gast)


Lesenswert?

Grübler schrieb:
> Wer kann mir ein Stichwort, Prozedur oder
> anders Hilfreiche nennen?

Hallo,

schau mal nach ADPCM-Codierung damit hast du etwa 50% Speichereinsparung 
wenn das Signal sich nicht allzu stark ändert.

Gruß Anja

von M. Schwaikert (Gast)


Lesenswert?

Naja, also Huffman setzt das Wissen über die 
Auftrittswahrscheinlichkeiten voraus. Klar kann man das auch grob 
peilen. Wenn's allerdings dumm läuft, werden die Daten größer, und nicht 
kleiner. Einfach abschätzen mag funktionieren, wenn man genau weiß, wie, 
aber nicht, wenn man aboslut keine Ahnung hat. Ich denke, der TO wird 
eher letzteres erfüllen.

@Dussel: Hilft RLE denn auch bei Nicht-magnetischen Speichern?

Es wäre im Allgemeinen sehr hilfreich, wenn wir wüssten, welche Daten zu 
erwarten sind. Wenn oftmals gleiche Werte auftauchen, dann wäre eine Art 
Huffman natürlich erste Wahl. Wenn die Werte eher Rauschen entsprechen, 
dann wohl nur ein großer Speicher.

von (prx) A. K. (prx)


Lesenswert?

Anja schrieb:

> schau mal nach ADPCM-Codierung damit hast du etwa 50% Speichereinsparung
> wenn das Signal sich nicht allzu stark ändert.

ADPCM ist m.W. verlustbehaftet. Gut für bestimmte Audio-Anwendungen - 
aber für eínen Datenlogger?

von Jobst M. (jobstens-de)


Lesenswert?

M. Schwaikert schrieb:
> Naja, also Huffman setzt das Wissen über die
> Auftrittswahrscheinlichkeiten voraus.

Das lässt sich doch herausfinden, sobald man genug Daten gesammelt hat.

http://de.wikipedia.org/wiki/Shannon-Fano-Kodierung#Huffman-Code

M. Schwaikert schrieb:
> Wenn's allerdings dumm läuft, werden die Daten größer, und nicht
> kleiner.

Dann kann man für den Datenblock ein Flag setzen und die Daten Roh 
speichern.

M. Schwaikert schrieb:
> Wenn die Werte eher Rauschen entsprechen,
> dann wohl nur ein großer Speicher.

Wenn sich die Differenzen in 5-Bit unterbringen lassen, dann gibt es 
(maximal) 32 Werte, die man bei Huffman codieren muß.

Ich würde mit 2 Blöcken im RAM arbeiten.
Während Block A mit 1024 Messwerten per IRQ gefüllt wird, wird Block B 
versucht kleiner zu machen.


Gruß

Jobst

von Chris (Gast)


Lesenswert?

Normalerweise macht man das so:

0sxx           = delta of 2 bit + sign.
10sx xxxx      = delta of 5 bit + sign.
11xx xxxx xxxx = 10 bit data

Sign bit, 0=positive 1=negative
0100 sowie 1010 0000 ist illegal für Daten und werden somit als Marker
verwendet. 1010 0000 schaltet zwichen komprimierten Daten un 
unkomprimierten
um, 0100 xxxx definiert irgendwas, z.B. könnte es sein dass 0100 fnnn
einen Kanal aktiviert oder deaktiviert. nnn = Kanal und f=flag, 
1=aktive.
Wenn ein Kanal inaktiv ist, dann behält er immer den letzten Wert und 
die
Logdaten werden übersprungen. Im Ram  sollten mindestens 4 
unkomprimierte Werte zwischengespeichert bevor sie geschrieben werden, 
also 44 bytes
inkl 4x Bitfelder welche den Status der Kanäle speichern, Aktiv oder 
nicht.

von Jobst M. (jobstens-de)


Lesenswert?

Chris schrieb:
> 0100 sowie 1010 0000 ist illegal für Daten und werden somit als Marker
> verwendet. 1010 0000 schaltet zwichen komprimierten Daten un
> unkomprimierten um

Hmmm, ich würde 0100 für -4 und 10100000 für -32 durchaus zulassen.

Allerdings benötigt man 10ssssxx nicht. Dafür reicht 0sxx. 10ssssxx kann 
also für andere Zwecke herhalten.

Wenn man nur Wertänderungen, jedoch keine zeitkontinuierliche Datenfolge 
benötigt, kann 0000 auch entfallen.


Gruß

Jobst

von Willi W. (Gast)


Lesenswert?

M. Schwaikert schrieb:
> Wenn die Werte eher Rauschen entsprechen,
> dann wohl nur ein großer Speicher

Es kommt drauf an, ob das Rauschen Information darstellt oder einfach 
per Vorverarbeitung in den Müll befördert werden kann.

von Martin S. (sirnails)


Lesenswert?

Willi W. schrieb:
> M. Schwaikert schrieb:
>> Wenn die Werte eher Rauschen entsprechen,
>> dann wohl nur ein großer Speicher
>
> Es kommt drauf an, ob das Rauschen Information darstellt oder einfach
> per Vorverarbeitung in den Müll befördert werden kann.

Ja, wie gesagt. Wenn die Daten gleichverteilt sind, wird es schwieriger. 
Es wäre daher einfach gut zu wissen, welche Daten zu erwarten sind. Das 
sollte der TO mal mitteilen.

von (prx) A. K. (prx)


Lesenswert?

Martin Schwaikert schrieb:

> Das sollte der TO mal mitteilen.

Hat er, wenn auch rudimentär: "Im Mittel rechne ich mit 4-5Bit + 
Vorzeichen". Gleichverteilung klingt anders.

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.