12 Bit Daten in 16 Bit Wörtern: Wie speichern?



  • Liebe C Leute!

    Ich habe das folgende Problem:
    Meine Anwendung holt von einem Device Rohdaten, die in 12 Bit gepackt in 16 Bitwörtern (auf Intel, d.h. Big-Endian). Nun speichere ich derzeit diese Wörter in ein grosses File als Stream, was den gravierenden Nachteil hat, dass ich ja unnötige Daten, nämlich Bit 13-16 "mitschleppe". Gibt es da eine elegante Methode, diese Wörter so umzugruppieren, dass ich nur die reinen Datenbits speichere?

    D.h. bei 12 Bit müssten sich 3 Datenblöcke in einem 24 Bitwort ausgehen.

    Doch: Evtl. könnte sich das Datenformat in nächster Zukunft auf 13 oder 14 Bit ändern. D.h.: Wie stelle ich es an, dass der Mechanismus dahingehend flexibel bleibt?

    Derzeit verwende ich

    uint16_t
    

    Vielen lieben Dank,
    Johann



  • ^^warum willste es komprimieren? wie du's jetzt machst, ist es doch ok. gerade auch, weil du genug reserve zum erweitern hast und dir das auseinander- und zusammenbasteln erspart bleibt.
    🙂



  • Komprimieren deshalb, weil der Datenstrom an sich schon gross genug ist... In der Regel so um die 100GB... Und auch, weil das ganze ja auf Platte geschieben werden muss (Bandbreite). Wenn ich es komprimiere spare ich mir bei 12 Bit ein viertel der Bandbreite und des Speichers.

    Abgesehen davon, habe ich auch nich 10 Bit Ströme, da wirds dann echt grimmig 😉

    Danke
    Johann



  • Du packst einfach 2 12bit daten in 3 8bit bytes? und schon musst du nur mit bytes hantieren und hast nur am ende im worstcase 12bit verschenkt...



  • wenn du komprimieren und trotzdem kompatibel bleiben möchtest, wirst dir nix anders übrig bleiben einen Header mit Versionsnummer vor den Datenstrom zu schreiben.
    Sollte man beim schreiben von Binärfiles sowieso immer machen, falls sich das Format mal ändert.

    wenn du Bandbreitenprobleme hast, lohnt sich vielleicht eine richtige Kompression.
    Weiß, ja nicht was das für Daten sind, und wieviel Luft die CPU noch hat. aber wenn du nen Huffman mit dynamischen Baum vorm Streamen in die Datei machst, brauchst du dich auch nicht mehr um die ungenutzten Bits kümmern, das passiert dann automatisch, da den ungenutzten Zahlen (4096-65365) sehr lange Bitfolgen zugewiesen werden, die ja nie auftreten.

    Edit:
    ich vermute mal es sind Video oder Audisignale.
    Bei Videos kommt es natürlich stark auf die Kamera und die Scenerie an, wie gut die daten komprimierbar sind.
    Wenn du ne (pseudo)logarithmische Kennlinie verwendest und dazu noch Tagaufnahmen machst, kannst du mit ner Entropiecodierung fast nix (<2bit) raushohlen.
    Mit Audiokompression kenne ich mich nicht aus.


Anmelden zum Antworten