Konvertiert eine 32-bit-float-Wert
Arbeite ich an einem DSP-Prozessor zum implementieren einer BFSK-Frequenz-hopping-Mechanismus mit C auf einem Linux-system. Auf der Empfänger-Teil des Programms, erhalte ich eine input von einer Reihe von samples, die ich de-modulieren, mit Goertzel-Algorithmus, um zu bestimmen, ob das empfangene bit war eine 0 oder 1.
Gerade jetzt, ich bin in der Lage zu erkennen, die bits einzeln. Aber ich muss die Daten zurück, die für die Verarbeitung in form eines float-Arrays. So, ich pack jeden Satz von 32 bits empfangen, um die form eines float-Wert. Rechts bin ich etwas wie :
uint32_t i,j,curBit,curBlk;
unint32_t *outData; //this is intiallized to address of some pre-defined location in DSP memory
float *output;
for(i=0; i<num_os_bits; i++) //Loop for number of data bits
{
//Demodulate the data and set curBit=0x0000 or 0x8000
curBlk=curBlk>>1;
curBlk=curBlk|curBit;
bitsCounter+=1;
if(i!=0 && (bitsCounter%32)==0) //32-bits processed, save the data in array
{
*(outData+j)=curBlk;
j+=1;
curBlk=0;
}
}
output=(float *)outData;
Nun, die Werte der output
array sind nur die Werte von outData
array mit 0EN nach dem Komma.
Beispiel: wenn output[i]=12345
die `outData[i]=12345.0000'.
Aber beim testen das Programm, das ich bin die Generierung der Testdaten von bits mit einem array von float
float data[] ={123.12456,45.789,297.0956};
Also nach der demodulation ich nehme an, dass die float-array output
haben eine gleichen Werte wie data
array.
Gibt es eine andere Methode zum konvertieren von 32-bit-Daten in einen float. Sollte ich Speichere die empfangene bits zu einem char
- array konvertieren und dann Sie zu schweben.
- Methode sollte korrekt sein - bit ist bit, nomatter, wie Sie es verwenden. Überprüfen Sie die tatsächlichen bits vor und nach der transformation, es sollte etwas sein, das auf diesem Teil.
- Ich habe abgestimmt, die bits, dass ich in der Sender-Teil und dem demodulierten Sequenz von bits. Sie sind passend miteinander. Daher meine Zweifel mit der Konvertierung in das float-array.
- Es völlig egal, welchen Typ das array haben (gut, technisch so lange wie es ist ein unsigned integer-Typen). Welche Art von CPU ist es? (Fragen über Rechte shift - big endinan?). Welche Art von 'falschen' Werte sind, die Sie bekommen? Was auch immer das problem, ich glaube nicht, dass es in den code oben gepostet - könnte man kompakter Beispiel arbeiten, das Ihrem problem?
- Die Ausgabe im float-form, bin ich immer
output={17142.000000,16951.000000,17300.000000}
, die die gleiche wie dieunsigned int array outData={17142,16951,17300}
. Aber die Ausgabe, die ich erwarte istdata[] ={123.12456,45.789,297.0956}
als die bit-Sequenz, die ich als input in das Programm für die Tests generiert sich ausdata[]
array, und die bit-Sequenz, die ich nach dem basuc de-modulation Schritt ist der gleiche wie der test-Sequenz. - Wenn Sie versuchen, um den gleichen numerischen Wert (oder schließen) für float-und int -, Sie werden müssen sehr verschiedene bit-Muster-look-up-der IEEE-Norm 754. Wenn Sie möchten, dass 32 bit Genauigkeit, benötigen Sie Doppel -, nicht-Schwimmer.
- Agh... So bekommen Sie diese hin-und Herbewegungen von int bits, mit den gleichen Werten wie int war? Was die Hölle der hardware ist das? Was ist float bit-layout auf dieser hardware? Was die erste float-layout und wie Sie ihn verarbeiten? Wenn Sie sicher über Ihre Transformationen (was auch immer es ist - ich habe keine Ideen), warum nicht einfach Umdeuten ersten Schwimmer an uint32, dann zurück zu schwimmen? Und ja, ich bin mir nicht mehr sicher, wir reden über die gleichen Dinge...
- Sie müssen klären, Ihre Frage. Sie haben erwähnt
outData[i]=12345.0000
im text aberoutData
ist einunit32_t
(oder wäre, aber für die Tippfehler im code!).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie kopieren die bit-Muster-wörtlich, ohne Berufung auf eine implizite Konvertierungen. Der einfachste Weg das zu tun ist, nehmen Sie die Adresse der Daten und interpretieren es als ein Zeiger für die Mittelstufe "Träger" geben, bevor die Dereferenzierung es.
Bedenken Sie:
Zwischenergebnis in
transport_bits
ist Gegner abhängig, in meinem test auf x86, es ist 0x449a522b, die bit-Darstellung von single-precision-float auf, dass die Plattform (floating-point-Darstellung und endianness abhängig).Entweder Weise das Ergebnis in
destination_float
ist identisch mitsource_float
verbracht wurde über dieuint32_t
transport_bits
.Aber dies erfordert, dass die floating-point-Darstellung der Urheber ist identisch mit der der Empfänger, der kann nicht gegeben sein. Es ist alles ein bisschen nicht-portable, Die Tatsache, dass dein code funktioniert nicht, schlägt vielleicht, dass die Darstellung tatsächlich unterscheiden sich zwischen sender und Empfänger. Nicht nur, dass das FP-Darstellung identisch sein, sondern auch die endianness. Wenn Sie sich Ihren code zu tun haben mag, eine oder beide der die Reihenfolge der bits und berechnen Sie die floating-point-äquivalent durch Extraktion von exponent und Mantisse. Alle, so Sie nee um sicher zu sein, dass die übertragungs-Reihenfolge der bits ist, ist die gleiche Reihenfolge, in der Sie Wiederanbringen Ihnen. Es gibt eine Reihe von Möglichkeiten, um das falsch.
char
array und warf seinen Zeiger auf einefloat*
(strict-aliasing-Regeln haben eine ausdrückliche Ausnahme fürchar
Arten), oder 2. mitmemcpy()
.Nicht sicher, ob ich Ihre Stelle - Sie sequentialy erhalten, bits und, wenn du hast 32 bit, die Sie wollen, um einen float von Ihnen?
was:
Die verwendet werden können, wie diese in-line:
Oder mit einem Helfer variable:
union
ruft zu undefiniertem Verhalten.