Ich sollte in der Lage sein, dies ziemlich genau zu kommentieren. Früher habe ich DSP-Verarbeitung gemacht, bei der wir Code "integerisieren" würden, was bedeutet, dass wir einen Signal/Audio/Video-Algorithmus verwenden und die gesamte Gleitkommalogik durch Festkommaarithmetik ersetzen (zB: Q_mn notation, etc).
Auf den meisten modernen Systemen erhalten Sie normalerweise eine bessere Leistung mit Integer-Arithmetik im Vergleich zur Fließkomma-Arithmetik, auf Kosten von komplizierterem Code, den Sie schreiben müssen.
Der Chip, den Sie verwenden (Cortex M3), hat keine a dedicated hardware-based FPU: er emuliert nur Fließkommaoperationen, so dass Gleitkommaoperationen teuer werden (nehmen Sie sich viel Zeit).
In Ihrem Fall könnten Sie einfach den 16-Bit-Wert über read_u16()
lesen und den Wert 4 Mal nach rechts verschieben, und schon sind Sie fertig. Wenn Sie mit Audiodaten arbeiten, könnten Sie looking into companding algorithms (a-law, u-law) in Erwägung ziehen, was eine bessere subjektive Leistung ergibt, als einfach die 4 LSBs abzubrechen, um eine 12-Bit-Nummer von einer 16-Bit-Nummer zu erhalten.
Yes, a float on that system is 32bit, und ist wahrscheinlich in IEEE754 format vertreten. Die Multiplikation eines Paars von 32-Bit-Werten mit einem Paar von 16-Bit-Werten kann sehr wohl die gleiche Zeit erfordern, abhängig von dem verwendeten Chip und dem Vorhandensein einer FPU und einer ALU. Auf Ihrem Chip wird die Multiplikation von zwei Floats in Bezug auf die Zeit horrend teuer sein. Wenn Sie zwei 32-Bit-Ganzzahlen multiplizieren, könnten sie möglicherweise auch überlaufen, daher gibt es einen möglichen Grund, die Gleitkommalogik zu verwenden, wenn Sie keinen Festkommalgorithmus implementieren möchten.
Sind Sie sicher, dass Sie dieses Recht lesen? Was ich sehe, ist "Lies die Eingangsspannung, dargestellt als unsigned short im Bereich [0x0, 0xFFFF]", was ziemlich klar erscheint. –
'read()' gibt einen Gleitkomma zurück, aber 'read_u16()' gibt eine 16-Bit-Ganzzahl zurück, Sie können wählen, welche Sie verwenden möchten. – Unimportant
Also gibt Read() eine 32-Bit-Gleitkommazahl zurück und read_u16() gibt 16-Bit-Ganzzahl zurück und die 16-Bit-Ganzzahl wird schneller/höher? – JamesDonnelly