2012-11-15 2 views
4

Mes données ne sont pas totalement aléatoires. Je cherche à comprimer des mesures de télémétrie qui auront tendance à être dans la même plage (par exemple, les températures ne varieront pas beaucoup). Cependant, je cherche une solution pour de multiples applications, donc je pourrais transmettrai des températures un jour, des tensions suivant, etc.Compression sans perte la plus efficace pour les données numériques aléatoires?

Je veux envoyer des mesures sur une liaison satellite à faible débit de données. SatCom est assez cher, donc je voudrais raser chaque centime que je peux. Cela ne me dérange pas de dépenser des ressources informatiques pour empaqueter les données & car rien n'est trop urgent (cela peut prendre jusqu'à 30 secondes pour transmettre 192 octets).

Quelqu'un peut-il conseiller d'une méthode de compression de données FOSS qui me donnera le plus de compression des données de télémétrie?

Est-il jamais la peine d'essayer? Quel genre de gains en pourcentage puis-je espérer?

Je vous présente mes excuses que je ne peux pas être plus précis sur la nature des données - seulement des mesures de télémétrie générales telles que la température, la position GPS lat/long, débit de liquides, etc.

Répondre

5

données réellement aléatoires est incompressible .

Puisque vous ne pouvez pas divulguer les détails de vos données, la meilleure chose à faire pour vous est de tester quelques algorithmes de compression sur des données d'échantillon.

Un bon point de départ est le DEFLATE algorithm, qui est la combinaison standard de la compression à glissière LZ77 et du codage Huffman. Il est mis en œuvre par de nombreux paquets de compression spécifiques, GZIP étant un exemple important.

4

Peut-être la meilleure solution serait d'utiliser une bibliothèque DEFLATE et l'exécuter sur de grands blocs de données et les paramètres de compression élevés. Si vous voulez lancer votre propre algorithme de compression de flux, vous pouvez appliquer le même algorithme qui fonctionne pour les fichiers son: Envoyez directement la première mesure, puis encodez la différence entre chaque échantillon et le précédent (codage delta).

Maintenant, le meilleur encodage diffère en fonction de la vitesse à laquelle les données sont en train de changer:

Si les données changent assez rapidement, utilisez un arbre Huffmann adaptatif. Si les différences ne sont pas corrélées (données + bruit), cela vous rapportera au plus un bit par échantillon de l'entropie.

Si plusieurs échantillons de données consécutifs sont susceptibles d'être égaux (les données ne changent pas très rapidement et qu'il n'y a pas de bruit HF), alors encoder chaque différence non nulle en utilisant un arbre de Huffmann et le nombre de zéros un deuxième arbre Huffmann. Cela vous obtiendra au plus deux bits par course.

Vous pouvez même encoder les différences comme un bit seulement (vers le haut ou vers le bas), mais vous devez être en mesure d'encoder pistes de longueur nulle. Ma suggestion: delta-encoder une ou deux fois pour obtenir des entrées non corrélées, puis DEFLATE en utilisant une librairie.

Questions connexes