Guten Morgen, ein ADC gibt einen Messwert im 16 Bit Format aus. Habt ihr Empfehlungen für mich, wie ich diese 16 Bit am geeignetsten auf 10 Bit reduzieren kann? Der Verlust an Genauigkeit ist mir bewusst und in Ordnung. Reicht es aus, wenn ich die 16 Bit um 6 Bits nach rechts schiebe? Bzw. die 6 LSB sozusagen verwerfe? Die verworfenen 6 Bit könnt ich dann noch runden und dann das 7 LSB dementsprechend anpassen. Vielen Dank.
51a schrieb: > Reicht es aus, wenn ich die 16 Bit um 6 Bits nach rechts schiebe? Ob das deinen Anforderungen genügt kannst nur du wissen. Aber warum willst du 16Bit auf 10Bit abschneiden? Funktionieren tut es auf jeden Fall, ich würde aber lieber durch 64 teilen
:
Bearbeitet durch User
51a schrieb: > Reicht es aus, wenn ich die 16 Bit um 6 Bits nach rechts schiebe? Kommt darauf an, ob das Ergebnis des Wandlers vorzeichenbehaftet ist...
Nein, das Ergebnis ist nicht vorzeichenbehaftet. Alles unsigned. Ich werde mich für die Variante mit der Teilung durch 64 entscheiden. Vielen Dank für die Antworten.
51a schrieb: > Der Verlust an Genauigkeit ist mir bewusst und in Ordnung. Die Genauigkeit bleibt dieselbe, nur die Auflösung verringert sich. Normaleweise schneidet man die nicht benötigten Bits einfach ab bzw. maskiert sie aus.
:
Bearbeitet durch User
51a schrieb: > um 6 Bits nach rechts schiebe Ingo L. schrieb: > Aber warum willst du 16Bit auf 10Bit abschneiden? > ich würde aber lieber durch 64 teilen Das ist doch alles das Selbe!
Stefanus F. schrieb: > Ingo L. schrieb: >> Aber warum willst du 16Bit auf 10Bit abschneiden? >> ich würde aber lieber durch 64 teilen > > Das ist doch beides das Selbe! Das denken viele beim rechten und beim linken Twix auch :-) SCNR, WK
Wenn du vor dem Abschneiden noch 32 dazu addierst, ist dein Ergebnis zumindest gerundet statt abgerundet (round statt floor).
Ingo L. schrieb: > Funktionieren tut es auf jeden > Fall, ich würde aber lieber durch 64 teilen Könntest du erklären, warum du lieber durch 64 teilst anstatt zu schieben - zumindest bei 'unsigned' fehlt mir momentan der Unterschied / Vorteil.
HildeK schrieb: > Könntest du erklären, warum du lieber durch 64 teilst anstatt zu > schieben - zumindest bei 'unsigned' fehlt mir momentan der Unterschied / > Vorteil. Ist auch kein Vorteil, aber wenn man sich eine Division statt eines Shifts angewöhnt, stellt sich die Vorzeichenfrage garnicht erst ;)
Wenn der AD-Wandler die Daten schon linksbündig zur Verfügung stellt, könnte man das Programm auch einfach so schreiben, als hätte der AD-Wandler 16 Bit. Wozu schieben? Es spart die Schieberei ein und hätte außerdem den Vorteil, daß man das Programm nicht groß anpassen muss, wenn man es mal auf eine andere Hardware mit einem genaueren ADC portiert.
Philipp M. schrieb: > Wenn du vor dem Abschneiden noch 32 dazu addierst, ist dein Ergebnis > zumindest gerundet statt abgerundet (round statt floor). Und was soll das bringen, außer einer zusätzlichen und völlig unnötigen Rechenoperation?
:
Bearbeitet durch User
Ich kenne ADCs die könne wahlweise das Ergebnis linksbündig, rechtsbündig oder um ein Nippel nach rechts verschoben bereitstellen. Bei sehr vielen kann man auch die Auflösung einstellen. Wenn man den ADC richtig konfiguriert muss man in SW gar nicht mehr viel machen.
Volle schrieb: > um ein Nippel nach rechts verschoben Abgesehen von dem falsch geschriebenen Nibble ist in der Aufzählung nichts dabei, was annähernd an die gewünschten 6 Bits rankommt. > Bei sehr vielen kann man auch die Auflösung einstellen. Zeig mal schnell 5 Stück von unterschiedlichen Herstellern (und das sind bei weitem nicht "sehr viele"). Fazit: es gibt nicht "viele", die das können, weil di allermeisten sowiso an einem Prozessor hängen, der sowieso eine Skalierung muss/wird. 51a schrieb: > Habt ihr Empfehlungen für mich, wie ich diese 16 Bit am geeignetsten auf > 10 Bit reduzieren kann? Bist du dann mit diesem Wert auf diesem Prozessor fertig, oder wird anschließend noch mehr damit gemacht? Falls zweiteres: warum den Messwert überhaupt zusammenstutzen? Das passiert doch sowieso bei einer späteren Rechnung/Skalierung...
>> 51a schrieb: >> Habt ihr Empfehlungen für mich, wie ich diese 16 Bit am >> geeignetsten auf 10 Bit reduzieren kann? > Lothar M. schrieb: > Bist du dann mit diesem Wert auf diesem Prozessor fertig, oder wird > anschließend noch mehr damit gemacht? Falls zweiteres: warum den > Messwert überhaupt zusammenstutzen? Vielleicht hat er eine CPU, die 10bit schneller berechnen kann, als 16bit. Duck und weg... Nachtrag: Möglicherweise will er große Datenmengen speichern und braucht ein paar Bits für andere Zwecke (z.B. Zeitstempel oder Kanal-Nummer).
Thomas E. schrieb: > Und was soll das bringen, außer einer zusätzlichen und völlig unnötigen > Rechenoperation? Je nach (nicht genannter Anwendung) bringt das einen geringeren Fehler durchs Abschneiden und erzeugt, im Gegensatz zum Abschneiden, kein DC-Offset.
Philipp M. schrieb: > Je nach (nicht genannter Anwendung) bringt das einen geringeren Fehler > durchs Abschneiden und erzeugt, im Gegensatz zum Abschneiden, kein > DC-Offset. Kapiere ich nicht - gib mal bitte ein konkretes Zahlenbeispiel, wo das addieren eines halben ADC-LSBs, was dann eh wieder abgeschnitten wird, das Ergebnis näher an den realen Messwert bringt.
Thomas E. schrieb: > Kapiere ich nicht - gib mal bitte ein konkretes Zahlenbeispiel, wo das > addieren eines halben ADC-LSBs, was dann eh wieder abgeschnitten wird, > das Ergebnis näher an den realen Messwert bringt. Stichwort: "Aufrunden" Aber ob das was bringt, und was es bringt, das hängt doch sehr von der entsprechenden Anwendung ab. Ich könnte mir z.B. auch gut vorstellen, dass man nicht einfach ein halbes MSB aufaddiert, sondern die führenden 6 Bits. Dann wird umso mehr "abgerundet", je näher man bei 0 ist. Und umso mehr "aufgerundet", je näher man am Maximalwert ist. Letztlich wird dadurch die Steigung der Übertragungsgeraden steiler gemacht...
Lothar M. schrieb: > Stichwort: "Aufrunden" Ich weiss schon, was "Aufrunden" bedeutet. Angenommen, man hat ein Digitalvoltmeter, das die Spannung mit Nachkommastellen anzeigt. Um nun mit der Spannung in Volt ohne Nachkommastellen als Integer weiter zu arbeiten, würde ich einsehen, daß man erstmal zum korrekten Runden 0,5V addiert, bevor man die Nachkommastelle abschneidet. Aber bei einem DVM, das ohnehin nur ganze Volt anzeigt (evtl. auch mit permanent "x,0" auf der Anzeige), erschließt sich mir der Sinn dieser Rundung nicht so ganz.
Thomas E. schrieb: > Aber bei einem DVM, das ohnehin nur ganze Volt anzeigt (evtl. auch mit > permanent "x,0" auf der Anzeige), erschließt sich mir der Sinn dieser > Rundung nicht so ganz. Das beispielhafte ganzzahlige Multimeter zeigt bei purem Abschneiden eben auch bei 0,99V am Eingang noch 0,0V an. Hier wäre es "gefühlt" schöner, wenn es ab 0,5V dann schon 1,0V anzeigt...
:
Bearbeitet durch Moderator
Thomas E. schrieb: > Aber bei einem DVM, das ohnehin nur ganze Volt anzeigt (evtl. auch mit > permanent "x,0" auf der Anzeige) Meinst du nicht, dass dieses beispiel ziemlich absurd ist? Das hast du Dir doch gerade ausgedacht!
Hallo, vielen Dank für die vielen Antworten. Um mich kurz zu fassen: Die ADC Messung erfolgt immer zu festen Zeitpunkten. Da der Bus für die Datenübertragung extrem langsam ist, müssen mehrere Samples zunächst gespeichert und anschließend in Datenblöcken gesendet werden. Um alle Daten in das Protokoll zu packen, müssen die 16 Bit auf 10 Bit reduziert werden. Sonst geht es zeitlich nicht. Die 16 Bit ADC Messwerte sind aber nicht notwendig. 10 Bit sind völlig ausreichend. Um weiteren Diskussionen entgegenzuwirken: Das ganze wird nur für einen kleinen Test benötigt. Andere Schnittstellen oder ein anderer ADC würde sich für Testzweck nicht lohnen, da vorhandenes für den kleinen Test genutzt werden kann.
51a schrieb: > Um alle > Daten in das Protokoll zu packen, müssen die 16 Bit auf 10 Bit reduziert > werden. Sonst geht es zeitlich nicht. Das Datenprotokoll kenne ich jetzt nicht aber welches Protokoll überträgt denn nur halbe Bytes denn nur so hättest du ja einen Vorteil davon? Die Systeme, die mir jetzt so in den Sinn kommen, übertragen nur ganze Bytes und da ists dann egal ob man 10 oder 16 Bit hat.
:
Bearbeitet durch User
M. K. schrieb: > welches Protokoll überträgt denn nur halbe Bytes Zum Beispiel das allgegenwärtige GSM Netz. Zum Beispiel werden SMS als 7 bit um 160 Zeichen in 140 Bytes zu quetschen. Das ist nicht die einzige Stelle, wo im GSM Netz Bits abgeschnitten und Bytes zerstückelt und verschoben übertragen werden.
Es werden auch ganze Bytes übertragen aber im Protokoll befinden sich außer dem Sample noch weitere Informationen. Ich kann noch 10 weitere Bits hinzufügen aber eben keine 16. Die Datenrate zu erhöhen oder das Protokoll zu ändern ist nicht nötigt, da für den Test 10 Bit ausreichend sind und sich der Aufwand nicht lohnt.
M. K. schrieb: > Die Systeme, die mir jetzt so in den Sinn kommen, übertragen nur ganze > Bytes und da ists dann egal ob man 10 oder 16 Bit hat. Ich denke, er packt drei 10Bit-Werte in ein 32Bit-Wort und überträgt das. 51a schrieb: > Da der Bus für die > Datenübertragung extrem langsam ist, müssen mehrere Samples zunächst > gespeichert und anschließend in Datenblöcken gesendet werden.
51a schrieb: > Es werden auch ganze Bytes übertragen aber im Protokoll befinden > sich > außer dem Sample noch weitere Informationen. > Ich kann noch 10 weitere Bits hinzufügen aber eben keine 16. > Die Datenrate zu erhöhen oder das Protokoll zu ändern ist nicht nötigt, > da für den Test 10 Bit ausreichend sind und sich der Aufwand nicht > lohnt. Bzw. 10 Bits sind ungenutzt und stehen noch zur freien Verfügung
Da will ich mitdiskutieren. Du könntest dann ja noch schneller sampeln. Da du nicht warten brauchst, bis die letzten 6 Bit gesattelt sind, kannst DU das Ergebnis auch schon vorher abfragen, hehe. Somit hast Du - ja richtig - eine Erhöhung der Sampelrate. Inwiefern das sachdienlich ist, muss der TO selbst entscheiden. Und tschüss.
Lothar M. schrieb: > Ich könnte mir z.B. auch gut vorstellen, dass man nicht einfach ein > halbes MSB aufaddiert, sondern die führenden 6 Bits. Dann wird umso mehr > "abgerundet", je näher man bei 0 ist. Und umso mehr "aufgerundet", je > näher man am Maximalwert ist. > Letztlich wird dadurch die Steigung der Übertragungsgeraden steiler > gemacht... Whow, kannte ich nicht, so einfach, hätte ich oftmals einsetzen sollen, ... mir war das halbe Bit bisher egal ;-)
Aaaahhh - sorry, ich war da gedanklich völlig auf dem falschen Dampfer! Dachte, der TO hätte einen 10-Bit Wandler, der seine Daten als 16-Bit Wort "left aligned" ausgibt. Klar, wenn der Wandler mehr als 10 Bit zur Verfügung stellt, macht eine Rundung bei der Reduzierung auf 10 Bit für die Übertragung natürlich absolut Sinn!
:
Bearbeitet durch User
Thomas E. schrieb: > Aaaahhh - sorry, ich war da gedanklich völlig auf dem falschen Dampfer! > Dachte, der TO hätte einen 10-Bit Wandler, der seine Daten als 16-Bit > Wort "left aligned" ausgibt. > Klar, wenn der Wandler mehr als 10 Bit zur Verfügung stellt, macht eine > Rundung bei der Reduzierung auf 10 Bit für die Übertragung natürlich > absolut Sinn! In diesem Fall hättest du natürlich recht - auf aufgefüllte Nullen ein halbes LSB addieren und wieder abschneiden ist tatsächlich sinnlos.
soso schrieb: > Da will ich mitdiskutieren. > > Du könntest dann ja noch schneller sampeln. Da du nicht warten brauchst, > bis die letzten 6 Bit gesattelt sind, kannst DU das Ergebnis auch schon > vorher abfragen, hehe. Somit hast Du - ja richtig - eine Erhöhung der > Sampelrate. Inwiefern das sachdienlich ist, muss der TO selbst > entscheiden. > > Und tschüss. Dann müsste der ADC aber auch unterstützen, dass man eine Wandlung abbrechen kann. Da wir nicht den konkreten Wandler kennen wäre ich mit so einer Aussage erstmal vorsichtig.
Thomas E. schrieb: > Wenn der AD-Wandler die Daten schon linksbündig zur Verfügung stellt, > könnte man das Programm auch einfach so schreiben, als hätte der > AD-Wandler 16 Bit. Wozu schieben? Spätestens, wenn man für Mittelung o.ä. ein paar Werte addieren will, merkt man den Unterschied.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.