gpt4 book ai didi

c - 传输一个 "32bit float"变量

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:44 27 4
gpt4 key购买 nike

我需要通过 SPI 将许多“32 位 float ”变量从一个 DSP 传输到另一个 DSP。

但是,寄存器总是 16 位的,我需要将“32 位 float ”变量分成两部分。

我使用了 C 类型的 union 体

union mytype {
float a;
uint16_t b[2];
};

它运行良好,但我遇到了一个新问题,即在启动时很难知道接收到的 16 位数据是用于 b[0] 还是 b[1]。 (两个DSP可能上电时间不同,所以第一个数据不一定是b[0])。

我试过把32bit的float拆分成4个byte,在传输16bit的时候,在8bit的数据前加了一个tag。这也很完美。但是我的性能下降了一倍。

有什么办法可以将“32位 float ”用两个16位的数据来传递吗?我知道我的数字范围在“0.0000001 ~ 1000000”(+/-)内。或者有什么其他的建议吗?我还考虑了两个 DSP 之间的 SPI 握手,但这似乎使它变得复杂。我只想捕获启动数据是b[0],然后我可以按顺序接收所有内容。

谢谢

最佳答案

类似于@Cantfindname 的想法,但从指数中删除了 2 位。没有精度损失。

此外,拒绝任何乱序对,以防止从不属于一起的两半形成float

我看到@Patricia Shanahan 发表了评论。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void encode(float f, uint16_t *u16) {
volatile union {
float f;
uint32_t u;
} x;
x.f = f;
x.u -= 0x30000000u;
u16[0] = 0x0000u | ((x.u >> 0) & 0x7FFFu);
u16[1] = 0x8000u | ((x.u >> 17) & 0x4000u) | ((x.u >> 15) & 0x3FFFu);
}

int decode(const uint16_t *u16, float *f) {
volatile union {
float f;
uint32_t u;
} x;
if (((u16[0] & 0x8000u) != 0x0000u) || ((u16[1] & 0x8000u) != 0x8000u)) {
printf("Fail\n");
return 1; // fail
}
x.u = (u16[1] & 0x4000ul) << 17;
x.u |= (u16[1] & 0x3FFFul) << 15;
x.u |= (u16[0] & 0x7FFFu);
x.u += 0x30000000u;
*f = x.f;
return 0;
}

int test(float f) {
uint16_t u[2];
encode(f, u);
float f2;
decode(u, &f2);
if (f != f2) {
printf("%.8e %.8e\n", f, f2);
}
return f != f2;
}

#include <math.h>

int main(void) {
float f;
for (f= 0.0000001; f <= 1000000.0; f = nextafterf(f,2*f)) {
test(f);
test(-f);
}
return 0;
puts("Done");
}

给定范围“0.0000001 ~ 1000000”,binary32 float 的 MSBits始终是 s011s100s 是符号位。减去3,范围是s000 s001。这允许忽略中间的 2 位,然后只需要维护 32 位 float 的 30 位。发送 2 个 16 位消息,每个消息都有一个“相位”位和 30 位的 15 位部分,允许对原始float 进行完全重构。

如果接收端收到异相消息,它应该忽略消息,直到连续的 phase-0/phase-1 组合到达。


通过减去其他值,至少可以忽略 1 位,从而允许额外的序列位数,进一步确保正确的重新组合。毕竟它似乎只使用了 4,294,967,296 个 float 的 340,000,000 种组合。

关于c - 传输一个 "32bit float"变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26276683/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com