/ / Données en virgule flottante - c ++, virgule flottante, codec, virgule fixe, adc

Point fixe vers des données à virgule flottante - c ++, virgule flottante, codec, virgule fixe, adc

Je reçois des données en virgule fixe de 24 bits d’un CODEC (ADC) par transmission TDM. Les données sont ensuite stockées dans un tampon int (32 bits). Je veux convertir ceci en données flottantes.

J'ai essayé:

g_analog_input_chL_mean = (((float)(*rx_block_pointer[buffer_cntr] << 8)) * (1.0/2147483648.0));

Quelle est la meilleure façon de faire cette conversion?

Merci, Costi

Réponses:

1 pour la réponse № 1

Cela dépend de la mise à l'échelle de votre point fixedonnées et aussi, si les données sont signées ou non. Lorsque vous utilisez float pour représenter des données à point fixe 32 bits, vous perdez certains chiffres, car certains bits sont utilisés pour stocker l'exposant. Je ne comprends pas vraiment pourquoi vous effectuez cette conversion 32 bits puisque vous pouvez sauter cette étape et écrire

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr])/(float)(0x7FFFFF);

Si vous insistez sur cette conversion 32 bits, utilisez

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr] << 8)/(float)(0x7FFFFFFF);

Notez que j’utiliserais toujours l’échelle hexadécimale qui est plus sûre en écriture que l’écriture du nombre décimal. Le vôtre est en effet faux, puisque le nombre entier maximum signé est 2147483647 et non 2147483648.

Si la valeur ADC a un format non signé, vous pouvez utiliser les mêmes expressions, mais avec le bit de signature inclus:

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr])/(float)(0xFFFFFF);

ou

g_analog_input_chL_mean = (float)(*rx_block_pointer[buffer_cntr] << 8)/(float)(0xFFFFFFFF);

Dernier point: la valeur ADC peut ne pas être réduite à un. Il peut donc être nécessaire de multiplier toute l'expression par votre valeur de virgule flottante maximale.

MODIFIER

Je vois maintenant la nécessité de passer en 32 bits. Le compilateur pourra alors interpréter correctement le signe lors de la conversion en float. Merci pour la correction.