Нравится? Делимся информацией!

вторник, 27 ноября 2012 г.

Конвертируем вещественные данные (float, single (MatLab)) из десятичной системы счисления в hex


ЗАДАЧА: перевести числа из десятичной системы счисления в шестнадцатеричную (hex).
Решение: используем скрипт MatLAB (m-файл) , т.к. основные данные для работы будут генерироваться в нем
Дано: *.dat файл с 1-D вектором-столбцом (отсчеты вещественных данных: в матлабе это соответствует типу single, в С++  - float )

 
Ход работы:
    В Матлабе есть функция num2hex(X) , которая вещественный ( single or double precision ) массив из n-элементов конвертирует в hex. Причем результат будет либо n-by-8 (в случает single), либо n-by-16 char (в случае double)  матрицей. Справка МатЛаб (En)
    Кратко познакомлю с сигналом для работы. Для простоты возьмем только огибающую, а не сам радиосигнал (огибающая с радиочастотным заполнением). Отсчеты сигнала следуют с частотой дискретизации 156250 S/s. Всего отсчетов будет 5386.



    Данный сигнал мы экспортируем в Excel, а оттуда в *.txt файл, в котором заменяем запятые на точки, и переименовываем его в *dat файл. В итоге получили файл: dspInputSamples3.dat
    Пишем скрипт. Он должен уметь:
1) загружать данные из файла
2) производить конвертацию
3) сохранять данные в файл

% Create scrip that convert float numbers to hexidecimal.
% This file is useful for example if we need to load *.dat file to Code
% Composer Studio. But this dat-file can understand only hexidecimal format
% of number types such as int, long, float.

% For start to work You must to set the input/output file name and path
%and data type working with
filename = 'dspInputSamples3.dat';
outFileName = 'dspInputSamples3HEX.dat';
dataType = 'single';   %data of this type we read from input file with
                      % "filename" name

%descriptor of the file that must be opened
%fid = fopen('my_file.dat', 'wb');     % открытие файла на запись
inputFID = fopen( filename, 'rb');
if inputFID == -1
    error('input File is not opened');
end

%descriptor of teh output file
outputFID = fopen(outFileName, 'wt');
if outputFID == -1
    error('output File is not opend');
end

%initialize the 1-D row vector. In this value we will save unput data
rowVec = 0;

%READ FROM FILE
%samplesCnt - the number of elements read
[rowVec, samplesCnt ] = fscanf( inputFID, '%f', inf );

%preallocate 1D column vector
rowVecHEX = zeros( 1, samplesCnt, dataType);

%CONVERTION
rowVecHEX = num2hex( single( rowVec ) );

%WRITE TO FILE
fprintf( outputFID, '0x%c%c%c%c%c%c%c%c\n', rowVecHEX' );

%display the row vector
disp( rowVecHEX );

fclose( inputFID );
fclose( outputFID );

    Все что от нас теперь требуется - задать имя входного файла с сэмплами и имя выходного, например, с суффиксом HEX. НУ, и пожалуй, еще тип данных single (для работы с float).
    Запускаем скрипт. В окне консоли Матлаба появится вектор столбец из hex значений, а в WorkSpace - переменная rowVecHEX <5386x8 char>. Все Ок. Теперь можем открыть переменную rowVecHEX  и наш dspInputSamples3HEX.dat и сравнить полученные результаты.

Комментариев нет:

Отправить комментарий