2011-02-15 2 views
4

dans Matlab (R2009b) I ont une variable de uint32 contenant la valeur 2147484101.MATLAB: Conversion d'un uint32 (4 octets) Valeur à la norme IEEE simple précision forme à virgule flottante correspondant

Ce nombre (sa 4- octets) a été extrait d'une caméra numérique de vision industrielle dans un processus de saisie. D'après ce que je comprends il tient la forme de précision de la vitesse d'obturation de la caméra (devrait être proche de 1/260s = 3.8ms). Comment puis-je convertir ce nombre de 32 bits en sa représentation à virgule flottante simple précision IEEE - en utilisant ce qui est disponible dans MATLAB?

avec la valeur mentionnée dans la variable n , j'ont essayé d'utiliser une combinaison de nn = DEC2HEX (n, 16) puis hex2num (nn). Mais il semble que hex2num s'attend à ce que le codage hexadécimal soit double précision et non unique comme c'est ici. Atleast je reçois des nombres étranges avec cette méthode.

Des idées?

Edit: Essayé @ réponse de Matt ci-dessous:

typecast(uint32(2147484101),'single') %# without swapbytes 
typecast(swapbytes(uint32(2147484101)),'single') %# with swapbytes 

Ce qui donne:

ans = 

    -6.3478820e-043 

ans = 

    -2.0640313e+003 

J'ai essayé le convertisseur IEEE 754 (applet JAVA) à http://www.h-schmidt.net/FloatApplet/IEEE754.html.

utilisant:

format hex 
typecast(uint32(2147484101),'uint8') %# without swapbytes 
typecast(swapbytes(uint32(2147484101)),'uint8') %# with swapbytes 

donne

ans = 

    c5 01 00 80 

ans = 

    80 00 01 c5 

La saisie de ces octets dans l'applet (hexadécimal) me donne les mêmes chiffres que Matlab.

Répondre

8

Je pense que ce que vous dites est que les bits sous-jacents représentent un nombre à virgule flottante, mais que vous l'avez stocké sous forme de uint32.

Si tel est le cas, vous pouvez le convertir (c'est-à-dire réinterpréter les bits) comme un flottant de précision simple à l'aide de la fonction typecast().

b = typecast(a, 'single') 

où a est votre variable.

Voir: http://www.mathworks.com/help/techdoc/ref/typecast.html

Modifié: pas la fonction de distribution, la fonction typecast ... Mes excuses!

+0

Oui, il doit être '' typecast' et non cast'. Mais je n'obtiens pas vraiment les valeurs que j'espérais. Vous voyez, je n'ai aucune connaissance préalable des nombres.Je ne suis même pas sûr que je les ai stockés correctement :) Je viens de vérifier à l'aide d'une applet Java. Donc, votre méthode est saine. +1 et accepté –

+0

@Ole Thomsen Buus: Il est difficile de suggérer ce que vous pourriez faire différemment sans connaître la méthode par laquelle vous êtes arrivé à votre uint32, ou la spécification du fichier/appareil que vous lisez. J'espère que vous comprendrez où ça va mal ... – Matt

2

Vous pouvez effectuer la conversion lorsque vous lisez les données avec fread().

Jetez un oeil à l'argument de précision, vous pouvez le lire comme le numéro de int32 et le stocker en un seul en faisant

shut_speed=fread(fid,1,'int32=>single'); 
+0

Oui c'est aussi une possibilité - n'avait pas pensé à celui-là. –

Questions connexes