Block Kompremierung

OP #3588547
Hallo zusammen,

hat vielleicht jemand Erfahrung mit der Kompremierung und 
Dekompremierung von Datenblöcken?

Konkret folgender Fall:

µController tastet mit 8-Bit Auflösung und 11025hz Sprache über den 
internen Ad Wandler ab (Microfon).
Bei 250 Samples wird das Frame in einen TCP-UDP Rahmen kopiert und als 
Broadcast an andere Stationen gesendet.
Das funktioniert alles, und man kann die Sprache auch gut verstehen.

Allerdings nur, wenn auch mit der entsprechenden Lautstärke gesprochen 
wird.
Um die Tonqualität noch zu verbessern, wollte ich gerne auf 10 Bit 
Auflösung  gehen.
Das Problem, nu brauche ich 2Bytes pro Sample, und das bekomme ich mit 
dem Controller gerade nicht mehr übers Netzwerk weg.

Kennt jemand (möglichst freie) Algo's um so einen Block zu kompremieren, 
und am Empfänger wieder zu dekompremieren? das ganze halt in Echtzeit.

Ich erwarte nicht den Frame auf 10% zu packen, sondern vielleicht um 
10-20%. Das könnte dann gerade reichen.

Aber vielleicht bin ich auch auf dem Holzweg, und das Berechnen dauert 
viel zu lange?


Hardware ist ein 32Bit UC3 - Series ohne FPU




Gruß Ch.O
Gast
Differenzielle Kodierung, d.h. nur die Unterschiede zwischen 
benachbarten Sampels übertragen.
Aber 10 Bit wird dir nichts bringen. ISDN quantisiert mit 8 Bit und 8 
kHz und niemand beschwert sich. Das Geheimnis ist die nichtlineare 
Dynamik-Kompression.

Beste Grüße, Marek
@ Marek N. (bruderm)

>Aber 10 Bit wird dir nichts bringen. ISDN quantisiert mit 8 Bit und 8
>kHz und niemand beschwert sich.

Nicht ganz.

>Das Geheimnis ist die nichtlineare
>Dynamik-Kompression.

Genau. Dabei wird aber zuerst mit 12 Bit quatisiert und dann nichtlinear 
komprimiert. Im einfachste Fall mit einer passenden Tabelle mit 4096 
Einträgen a 8 Bit.

http://de.wikipedia.org/wiki/A-law
OP
Erstmal danke für die Antworten.

Bei der Differenz fehlt mir noch die Vorstellung der Organisation.

Beispiel:
Also erstes Byte im Frame sagen wir Wert 700, nächstes Sample ist auch 
700, also  Differenz 0. die nächsten 2 Samples unterscheiden sich 
angenommen auch nur minimal.

ergibt also z.B als Frame

1+2 Byte 700
3tes Byte 0

jetz muß irgendeine Kennung kommen um am Ziel zu wissen, dass das 
nächste Sample kommt, und kein 2 Byte Wert.
Wie soll ich da "sparen"?

ich kann natürlich auch die 10 Bit immer aufschieben, so dass ich nicht 
16 sondern 10 bit pro sample nehme.

Ich glaube aber nicht, dass das rumgeschiebe an jedem Sample schneller 
ist.
@ Christian O. (reflexx)

>jetz muß irgendeine Kennung kommen um am Ziel zu wissen, dass das
>nächste Sample kommt, und kein 2 Byte Wert.

Der 1. Wert ist immer 10 Bit, also 2 Byte
Die Differenz wird IMMER als 8 Bit vorzeichenbehaftet kodiert, fertig.

>ich kann natürlich auch die 10 Bit immer aufschieben, so dass ich nicht
>16 sondern 10 bit pro sample nehme.

Geht auch, wobei man eher nicht schiebt sonder clever zusammenkopiert. 
Z.B. 3:2, sprich 12 Bit / Sample, wobei 2 Samples je in 3 Bytes kopiert 
werden. Das ist recht einfach mit moderatem Rechenaufwand machber.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 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.