我正在研究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
数组,然后将其转换为浮点数。
答案 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表示不仅必须相同,而且字节顺序也必须相同。如果它们不同,您的代码可能必须执行一个或两个重新排序,并通过提取指数和尾数计算浮点等效值。所有这些都是为了确保位的传输顺序与您重新组装它们的顺序相同。有很多机会弄错了。