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
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.
51a schrieb:> um 6 Bits nach rechts schiebeIngo 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
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?
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...
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.
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!
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.