将32位转换为浮点值

时间:2012-07-23 11:38:23

标签: c linux embedded

我正在研究DSP处理器,以便在Linux系统上使用C实现BFSK跳频机制。在程序的接收器部分,我得到一组样本的输入,我使用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;

现在,output数组的值只是outData数组的值,小数点后面有0。 例如:if output[i]=12345`outData [i] = 12345.0000'。

但是在测试程序时,我正在使用float数组生成位的样本测试数据 float data[] ={123.12456,45.789,297.0956};

因此,在解调之后,我期望浮点数组output具有与data数组相同的值。 是否有其他方法可以将32位数据转换为浮点数。我应该将收到的位存储到char数组,然后将其转换为浮点数。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:4)

您需要逐字复制位模式而不调用任何隐式转换。最简单的方法是获取数据的地址,并在解除引用之前将其重新解释为指向中间“载波”类型的指针。

考虑一下:

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

transport_bits中的中间结果是依赖于目标的,在我对x86的测试中,它是0x449a522b,这是该平台上单精度浮点的位表示(浮点表示和字节顺序相关)。

无论哪种方式,destination_float中的结果都与通过source_float uint32_t传输的transport_bits相同。

然而,这确实要求始发者的浮点表示与接收者的浮点表示相同,这可能不是给定的。它有点不可移植,你的代码不起作用的事实表明,发送者和接收者之间的表示确实不同。 FP表示不仅必须相同,而且字节顺序也必须相同。如果它们不同,您的代码可能必须执行一个或两个重新排序,并通过提取指数和尾数计算浮点等效值。所有这些都是为了确保位的传输顺序与您重新组装它们的顺序相同。有很多机会弄错了。