【发布时间】:2012-07-23 11:38:22
【问题描述】:
我正在开发一个 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 数组中,然后将其转换为浮点数。
【问题讨论】:
-
方法应该是正确的——一点一点,不管你如何使用它。检查转换前后的实际位,这部分应该有。
-
@keltar,我已经匹配了我在发送器部分使用的比特和解调的比特序列。它们相互匹配。因此,我对转换为浮点数组表示怀疑。
-
你的数组有什么类型完全没有关系(嗯,从技术上讲——只要它是无符号整数类型之一)。它是什么类型的 CPU? (想知道右移 - 大尾数?)。你得到什么样的“不正确”的价值观?不管是什么问题,我不认为它在上面发布的代码中 - 你能制作一个紧凑的工作示例来代表你的问题吗?
-
我得到的浮点形式的输出是
output={17142.000000,16951.000000,17300.000000},与unsigned int array outData={17142,16951,17300}相同。但是,我期望的输出是data[] ={123.12456,45.789,297.0956},因为我用作测试程序输入的位序列是从data[]数组生成的,并且在基本解调步骤之后得到的位序列是相同的作为测试序列。 -
如果您试图为 float 和 int 获得相同的数值(或接近),您将需要非常不同的位模式——查看 IEEE 754 标准。如果你想要 32 位精度,你需要使用双精度,而不是浮点数。