5

LinuxシステムでCを使用してBFSK周波数ホッピングメカニズムを実装するためにDSPプロセッサに取り組んでいます。プログラムのレシーバー部分で、Goertzelアルゴリズムを使用してデコードし、受信したビットが0か1かを判断するサンプルのセットの入力を取得しています。

現在、ビットを個別に検出することができます。ただし、処理用のデータをfloat配列の形式で返す必要があります。したがって、浮動小数点値を形成するために、受信した32ビットのすべてのセットをパックする必要があります。右私は次のようなことをしています:

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;

これで、配列の値は、小数点以下0outputの配列の値になります。outData例:output[i]=12345`outData [i] =12345.0000'の場合。

しかし、プログラムをテストしている間、私はfloatの配列を使用してビットのサンプルテストデータを生成しています float data[] ={123.12456,45.789,297.0956};

したがって、復調後、float配列はarrayoutputと同じ値になると予想していますdata。32ビットのデータをfloatに変換する他の方法はありますか?受信したビットをchar配列に格納してから、floatに変換する必要があります。

4

2 に答える 2

6

私があなたの主張を理解しているかどうかわかりません-あなたは連続してビットを取得し、32ビットを取得した場合、それらからフロートを作成したいですか?

どうですか:

union conv32
{
    uint32_t u32; // here_write_bits
    float    f32; // here_read_float
};

インラインで次のように使用できます。

float f = ((union conv32){.u32 = my_uint}).f32;

またはヘルパー変数を使用:

union conv32 x = {.u32 = my_uint};
float f = x.f32;
于 2012-07-23T11:56:41.383 に答える
5

You need to copy the bit pattern verbatim without invoking any implicit conversions. The simplest way to do that is to take the address of the data and reinterpret it as a pointer to the intermediate "carrier" type before dereferencing it.

Consider this:

float source_float = 1234.5678f ;
uint32_t transport_bits = *((uint32_t*)&source_float);
float destination_float = *((float*)&transport_bits);

The intermediate result in transport_bits is target dependent, in my test on x86, it is 0x449a522b, this being the bit representation of single precision float on that platform (floating point representation and endianness dependent).

Either way the result in destination_float is identical to source_float having been transported via the uint32_t transport_bits.

However this does require that the floating point representation of the originator is identical to that of the receiver which may not be a given. It is all a bit non-portable, The fact that your code does not work suggests perhaps that the representation does indeed differ between sender and receiver. Not only must the FP representation be identical but also the endianness. If they differ your code may have to do one or both of reorder the bits and calculate the floating point equivalent by extraction of exponent and mantissa. All so you nee to be sure that the transmission order of the bits is is the same order in which you are reassembling them. There are a number of opportunities to get this wrong.

于 2012-07-24T13:59:29.540 に答える