2016-04-16 12 views
1

Auf meinem Mbed LPC1768 habe ich einen ADC auf einem Pin, der bei der Abfrage eine 16-Bit-kurze Zahl auf einen Gleitkommawert zwischen 0-1 normalisiert. Document here.Konvertieren von 32-Bit-Zahl in 16 Bit oder weniger

Weil es es in eine Gleitkommazahl konvertiert bedeutet das seine 32-Bit? Weil die Zahl, die ich habe, eine Zahl bis sechs Dezimalstellen ist. Data Types here

Ich fahre Autokorrelation und möchte die Zeit reduzieren, die für die Analyse benötigt wird. Ist es richtig, dass die Fließkommazahlen 32 Bit lang sind, und wenn ja, ist es richtig, dass die Multiplikation von zwei 32-Bit-Fließkommazahlen viel länger dauert als die Multiplikation zweier 16-Bit-Kurzwertzahlen (nicht-demisch)?

Ich arbeite mit C, um das mbed zu programmieren.

Prost.

+0

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. –

+2

'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

+0

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

Antwort

2

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.

+1

Vielen Dank, dass Sie so viel in die Tiefe gegangen sind. Mein Verständnis ist, dass Bitverschiebung nach rechts die Zahlen kleiner macht, aber die Beziehung zwischen den Zahlen bleibt gleich (wenn sie alle etwas verschoben sind). Verbessert Bitshifting die Performance, weil die Zahlen kleiner oder vernachlässigbar sind, besonders wenn man bedenkt, wie viel Zeit man braucht, um die Zahlen anzupassen?Prost – JamesDonnelly

+2

@JamesDonnelly: Die Zeit, die von ganzzahligen Multiplikationen benötigt wird, hängt nicht von den Werten der Operanden ab. Aber du musst auf den Überlauf achten. –

+0

@JamesDonnelly Ich bin froh, dass es geholfen hat. Fühlen Sie sich frei, eine Diskussion in den Kommentaren zu öffnen, wenn Sie weitere Fragen haben. – DevNull

1

Es ist richtig anzunehmen, dass die Multiplikation von zwei 32-Bit-Fließkommazahlen länger dauert als die Multiplikation von zwei 16-Bit-Kurzwerten, wenn keine spezielle Hardware (Gleitkommaeinheit) im Prozessor vorhanden ist.

+1

Dies ist eine Cortex-m3 keine Fließkommaeinheit. Das M4 hat einige Float-Unterstützung. –

Verwandte Themen