16 Bit zu 12 Bit Umwandeln

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,


    Ich bin auf der suche bzw. Möglichkeit einen 16Bit Wert (Zahlen) in einen 12Bit Wert zu Konventieren.


    Habe schon in Google usw. gesucht habe aber nichts Passendes gefunden, kennt einer von euch eine Möglichkeit wie ich das in Python Realisieren kann?


    LG
    Sven

  • Ähm... Was heißt "Zahlen"? Ganzzahlen oder Kommazahlen? Bei Ganzzahlen: In der Theorie kannst du einfach die 4 least significant bits abschneiden. In der Praxis weiß ich nicht, wie du deinen 12 Bit Integer abspeichern willst, also wirst du die letzten 4 Bits auf 0 setzen müssen und hast wieder eine 16Bit lange Zahl. Bei Gleitkommazahlen wird es noch ein bisschen komplizierter.
    Aber was erhoffst du dir denn überhaupt davon? 12Bit Zahlen sind kein gängiges Datenformat. Du wirst die Zahl dann im Endeffekt trotzdem als int8 oder int16 abspeichern müssen. Gängige Datentypen findest du hier: http://docs.scipy.org/doc/numpy/user/basics.types.html

  • 16 bit >>4

    um 4bit einfach nach rechts schieben oder den 16-bit Wert durch 16 teilen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo Sven,


    Ich bin auf der suche bzw. Möglichkeit einen 16Bit Wert (Zahlen) in einen 12Bit Wert zu Konventieren.


    Wo kommt der 16Bit-Werz her, wenn Dir 12 Bits reichen würden? Etwa aus einem A/D-Wandler? Dann kannst Du bei der Abfrage / dem Auslesen auch gleich die Bittiefe angeben und musst nicht die volle Datenbreite abfragen. Einfach nach Auslesen von Bit 12 aufhören. Das Reduziert dann die Auslesezeit auf 3/4.

    Willst Du eine Reduktion auf 12 Bit, indem Du - wie hier schon angedeutet - die niederwertigsten (LSB = low significant bits) abschneidest, und damit den Ganzzahlenwert durch 16 dividierst (MOD 16, also Abrunden mit Informationsverlust).

    Im letzteren Fall hättest Du für Ganzzahlen etwas wie das hier

    Code
    BIT12 := BIT16 >> 4
    BIT16 := BIT12 << 4


    oder

    Code
    BIT12 := ishift(BIT16, -4)
    BIT16 := ishift(BIT12, 4)

    Und wie Bit-Verschieben in Python geht, sagt Dir eine beherzte Suche.

    Oder willst Du eine Ganzzahl ermitteln, die mit 12 Bits Dateninhalt dem 16-Bit-Wert am nächsten kommt (ggf. mit Aufrunden?)

    Oder handelt es sich um Fließpunktzahlen? Dann hängt es von der internen Darstellung der Fließunktzahl ab. Dann darfst Du Dich mit der Mantisse beschäftigen.

    Was willst Du jetzt eigentlich erreichen?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (21. August 2016 um 11:24)

  • Unter Konvertierung versteht man eigentlich eine Umwandlung in ein anderes Zahlensystem (oktal, hex, dezimal, ..) unter Beibehaltung des Zahlenwertes. Du willst genaugenommen den Zahlenraum verkleinern von 16 auf 12 Bits. Solange die höchsten 4 Bits immer 0 sind wird der Zahlenraum nicht verkleinert. D.h. Du musst Dir bewusst sein u.U. falsche Werte zu erhalten wenn Du die vorhergehenden Hinweise befolgst.


  • ....D.h. Du musst Dir bewusst sein u.U. falsche Werte zu erhalten wenn Du die vorhergehenden Hinweise befolgst.

    unter welchen Umständen denn?
    mir fällt nur einer ein,
    https://de.wikipedia.org/wiki/Byte-Reihenfolge
    Big-Endian oder Little-Endian

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi Jar,

    unter welchen Umständen denn?
    mir fällt nur einer ein,
    https://de.wikipedia.org/wiki/Byte-Reihenfolge
    Big-Endian oder Little-Endian

    eben - sehe ich auch so. Ich unterstelle auch mal, dass Sven die Bits seiner Daten in die richtige Reihenfolge bringt, dass er nach den oben beschriebenen Ideen seine 4 unwichtigsten Bits abschneidet / dividiert / rundet. Alles andere führt zu total verblüffenden - aber fehlerhaften - Ergebnissen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Ich vermute mal, framp meinte mit falsch ungenau.

    Jein, es ist eigentlich beides. Hängt von den jeweiligen Umständen ab. Dazu läßt uns der TE ja bislang im Dunkeln.

    Wenn die High Bits truncated werden wird der Werteraum eingeschraenkt von möglichen positiven Zahlen bis zu 2^16 vs 2^12. Wenn die HighBits != 0 sind werden die Zahlen falsch da sie nicht mehr korrekt dargestellt werden können wg fehlender Bits. Wenn ich z.B. im Dezimalsystem bei der Zahl 1000, die 4 Dezimalstellen hat, die vorderen 2 Dezimalstellen truncate kommt 00 raus und das ist nicht ungenau sondern schlichtweg falsch.

    Wenn die Low Bits truncated werden wird es ungenau. Auf das Dezimalsystem übertragen wird dabei aus 1042 1000 da die letzten beiden Dezimalstellen auf 0 gesetzt werden. D.h. die Zahl wird ungenau.

    Wenn jetzt die 16 Bits aber Gleitkommazahlen sind wird es noch mal eine Ecke komplizierter.

  • Morgen :lol:

    Also hier etwas genauer erklärt.


    Ich benutze IP-Symcon und dort werden DMX Signale im 16Bit Format verarbeitet und zwar mit 2 x 8 Bit = 16 Bit (65536 Schritte).

    Das heißt ich möchte mit Python einen DMX String auswerten der dann an einem PCA9685 12Bit PWM verarbeitet werden soll.


    Ich brauche im Prinzip eine Möglichkeit aus 0 - 65536 eine 0 - 4096 zu machen :s


    Hoffe das war so weit verständlich :thumbs1:


    LG
    Sven

  • du meintest doch: 65535? (2^16-1)

    dann gilt wieder >>4 oder /16

    der alte höchste Wert war 65535
    der neue höchste Wert ist 4095 (2^12-1)

    kleinere Werte als 0 kannst du dann halt nicht

    map aus Arduino könnte auch helfen
    p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());

    https://www.arduino.cc/en/Reference/Map
    long map(long x, long in_min, long in_max, long out_min, long out_max)
    {
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (21. August 2016 um 15:11)

  • Also das die Lösung so einfach ist hätte ich jetzt gedacht.

    Manchmal hat man einfach ein Brett vor dem Kopf :-/

    Und dafür habe ich die halbe Nacht gegoogelt :D


    Ich danke euch allen für eure Unterstützung
    :thumbs1:


  • Also das die Lösung so einfach ist hätte ich jetzt gedacht.

    welche, du hast mehr als eine Lösung bekommen!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ein Forum lebt von Rückmeldungen welches bei dir mit genau deinem Ausgangswert optimal funktioniert

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!