Forum: Digitale Signalverarbeitung / DSP / Machine Learning Messdaten Kompression


von Simon P. (bitteeinbit)


Lesenswert?

Hallo @all:

Ich möchte AD-Daten(3-Achsen Gyro) über Funk an einen zentralen Hub 
senden. Da mehrere Knoten an den selben Hub senden und ich die Anzahl 
der "angeschlossenen" Hubs maximieren möchte, wollte ich die Messdaten 
VERLUSTFREI komprimiert übertragen. Ich weiß, dass durch das Rauschen 
nur ein Kompressionsfaktor von ugf. 2 realistisch ist.
Es gibt ja nun mehrere Verfahren (Huffmann, Shannon, ....), aber nachdem 
was ich so gelesen habe ist das Schätzverfahren wohl das Optimalste.
Kennt eine/r von euch zufälligerweise einen fertigen Code für solche 
Komprssionsverfahren? Das ganze kommt in einem MSP430 zum Einsatz und 
der Code sollte in C geschrieben sein. Achja, falls es bei den 
Überlegungen hilft, der Gyro liefert 3 x 500bps x 16 Bit Auflösung = 
24kbps. Ein Funkchip schafft 250kbps und bei dem uC handelt es sich um 
ein MSP430F2618

Danke schon mal für eure Antworten

von Peter (Gast)


Lesenswert?

Wichtig zu wissen wäre wie die Daten sich ändern können. Oder ob es auch 
sein kann das ein Sensor ewig lang keine bewegung hat und damit nur das 
rauschen übertragen wird.

von Simon P. (bitteeinbit)


Lesenswert?

Kann ich leider nicht sagen. Die Gyros werden für die Messung von 
Maschinen-Vibrationen eingesetzt. Ich vermute daher mal, dass sich die 
Biester nicht sehr oft im "Leerlauf" befinden.

hab grad noch oben einen kleinen Schreibfehler gefunden: ich meinte 
natürlich "angeschlossene" Knoten und nicht Hubs, den Data-Hub gibs ja 
nur einmal :)

von Peter (Gast)


Lesenswert?

dann wird dir vermutlich hier kaum jemand weiter helfen könnnen.

Schreib die Daten doch mal ein eine Datei und lass winzip drüber laufen. 
(aber nicht als text sonder binär sonst ist es für WinZip zu einfach, am 
besten wie bei deiner übertragung)

Einen passenden Kompression kann man nur festlegen wenn man sich den 
Datenstrom anschaut. Pauschal wird man da nichts festlegen können

von Gast (Gast)


Lesenswert?

Vl. solltest du dir auch mal die FSP oder noch besser PSK anschauen und 
fertige Modulationsbausteine verwenden. Sind dann wesentlich effektiver 
und du brauchst keine Sofwaremässige kompression zu realisiseren.

von Gast (Gast)


Lesenswert?

Meine oben nactürlich FSK und nicht FSP ;)

FSK- Frequenz Shift keying
PSK- Phase Shift keying

von Simon P. (bitteeinbit)


Lesenswert?

@Gast:

Die genannten Modulationsverfahren sind doch nur Art und Weisen wie 
Funkchips ihre Daten durch die Luft schicken, oder etwa nicht? Klar ich 
könnte einfach Chips verwenden, die zb 1Mbps schaffen und somit mehr 
Knoten aufnehmen können.

@Peter:

ich hab leider keine Testdaten oder so zur Hand. Ich entwickle hier 
vollkommen ins Blaue mit Worst-Case, Best-Case Unterscheidungen :)
Es gibt ja eben dieses Schätzverfahren, dass nur die Unterschiede zur 
Schätzung und dem gemessenen Wert überträgt -> weniger Daten also. Auf 
dieses Prinzip bin ich schon vielerorts gestossen, aber nirgends war der 
Code dabei. Ich wollte halt nicht das Rad neu erfinden...

von Peter (Gast)


Lesenswert?

Das kann aber auch zu problemen führen, was ist wenn mal der sender 
nichts empfängt. Dann kommt du mit den Differenzen nicht viel weiter. Du 
musst also regelmässig den Ist-Wert übertragen. Auch wenn die Änderung 
von einer Messung zur nächsten sich über den ganzen wertebereich 
erstecken machst du mit der Differenzübertragung kein gewinn.

Die Differenzübertragung geht also bloss wenn du die maximale größe der 
Differnenz zwischen 2 messungen kennst, wenn wird es schwer. Dann müsste 
in das Protkoll eine größenangeabe mit rein wie "lang" die Differenz ist 
das sind dann aber erstmal zusatz info die du übertragen musst. Im 
schlimmsten fall hast du damit eine negative Kompression.

Ohne echte Daten würde ich mich nicht auf eine Kompression einlassen.

von Horst (Gast)


Lesenswert?

Hallo,

3 x 500sps x 16 bit und dein Baustein rennt mit 16Mhz.
Dann bleiben etwa 10000 Takte (16e6/(3x500)) pro 16-bit Wert.

Aber warum versendest Du nicht einfach jede x Sekunden gesammelte Daten, 
was bei 8 kByte Ram wohl auch geht.
Du legst Dir einen zirkularen Speicher an und versendest dann immer an 
einem Stück. 3x 1000 Byte entsprächen einer Sekunde.
Also könntest Du etwa 2 Sekunden zwischenspeichern, falls es viele 
Kollisionen beim Funken gibt.Denn für jedes Messwert Tripel eine 
Übertragung zu starten lässt wahrscheinlich nicht mehr als 3 Knoten zu.
Wenn Die Paketgröße beschränkt ist kannst Du ja darauf optimieren.

Gruß Horst

von BinGast (Gast)


Lesenswert?

Kommt u.a. auf die Dynamik der Signale an. Wenn diese klein ist reicht 
es vielleicht nur die Differenzwerte zum vorherigen Signal zu 
übertragen.

Evtl. Sigma-Delta Modulation (s. z.B  Wikipedia). Ist bekannt und es 
gibt fertige Chips. Da ein Funkkanal nur ein Bit zur Zeit überträgt kann 
das geeignet sein.

von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

>Es gibt ja eben dieses Schätzverfahren, dass nur die Unterschiede zur
>Schätzung und dem gemessenen Wert überträgt -> weniger Daten also. Auf
>dieses Prinzip bin ich schon vielerorts gestossen, aber nirgends war der
>Code dabei. Ich wollte halt nicht das Rad neu erfinden..

Nennt sich ADPCM -> Adaptive Differential Pulse Code Modulation, siehe 
Anhang

Gruß Hagen

von Martin L. (Gast)


Lesenswert?

Guck Dich mal bei den verlustlosen Audiocodecs um. Je nach Messwerten 
passt das ganz gut ins Profil. Und wenn es um so eine Art Körperschall 
geht ....

Viele Grüße,
 Martin L.

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.