5

我正在开发一个 DSP 处理器,以在 Linux 系统上使用 C 实现 BFSK 跳频机制。在程序的接收器部分,我得到一组样本的输入,我使用 Goertzel 算法对其进行解调,以确定接收到的位是 0 还是 1。

现在,我能够单独检测这些位。但是我必须以浮点数组的形式返回数据进行处理。因此,我需要将接收到的每组 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 的数组的值。例如:如果output[i]=12345`outData[i]=12345.0000'。

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

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

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

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

考虑一下:

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表示必须相同,而且字节序也必须相同。如果它们不同,您的代码可能必须对位进行重新排序并通过提取指数和尾数来计算浮点等效项中的一项或两项。因此,您需要确保位的传输顺序与您重新组装它们的顺序相同。有很多机会会出错。

于 2012-07-24T13:59:29.540 回答