MATLAB: преобразование значения uint32 (4 байта) в соответствующую форму IEEE с плавающей запятой одинарной точности - PullRequest
4 голосов
/ 15 февраля 2011

В MATLAB (r2009b) у меня есть переменная uint32, содержащая значение 2147484101.

Это число (его 4 байта) было извлечено из цифровой камеры машинного зрения в процессе захвата.В соответствии с тем, что я понимаю, он содержит форму выдержки камеры с одинарной точностью (должна быть близка к 1/260 с = 3,8 мс).

Как преобразовать это 32-разрядное число в егоIEEE представление с плавающей точкой одинарной точности - используя то, что доступно в MATLAB?

С упомянутым значением в переменной n я попытался использовать комбинацию nn = dec2hex (n,16) , а затем hex2num (nn) .Но, похоже, что hex2num ожидает, что шестнадцатеричное кодирование будет двойной точности, а не единичным, как здесь.По крайней мере, я получаю странные числа с этим методом.

Любые идеи?

Редактировать: Tried @ Matt ответ ниже:

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

Что дает:

ans =

  -6.3478820e-043

ans =

  -2.0640313e+003

Я попробовал конвертер IEEE 754 (апплет JAVA) в http://www.h -schmidt.net / FloatApplet / IEEE754.html .

Использование:

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

дает

ans =

   c5   01   00   80

ans =

   80   00   01   c5

Ввод этих байтов в апплет (шестнадцатеричный) дает мне те же числа, что и MATLAB.

Ответы [ 2 ]

8 голосов
/ 15 февраля 2011

Я думаю, что вы говорите, что базовые биты представляют число с плавающей запятой, но вы храните его как uint32.

Если это так, вы можете привести его (т.е.переинтерпретировать биты) как число с плавающей точкой одинарной точности, используя функцию typecast ().

b = typecast(a, 'single')

где a - ваша переменная.

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

Отредактировано:не функция приведения, функция преобразования типа ... Мои извинения!

2 голосов
/ 15 февраля 2011

Вы можете выполнять приведение, когда читаете данные с помощью fread ().

Посмотрите на аргумент точности, вы можете прочитать его как число int32 и сохранить его как один, выполнив

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