В этом примере показано, как преобразовать интерполяционную таблицу с одной точностью для использования половинной точности. Половинная точность - это тип склада; расчеты интерполяционной таблицы продолжают выполняться с использованием одинарной точности. После преобразования примеры вдвое сокращают размер памяти блоков Интерполяционной таблицы, сохраняя при этом желаемую производительность системы.
1. Откройте airflow_calc
подсистема sldemo_fuelsys
пример модели. Он содержит блоки Интерполяционная таблица с одной таблицей точности и данными точек по оси Х, которые будут преобразованы в половинную точность.
load_system('sldemo_fuelsys'); open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');
2. В MATLAB ® смените текущую папку на папку с возможностью записи.
3. Проверяйте, что значения таблиц и точек остановки «Постоянная перекачки» и «Интерполяционная таблица Ki» заданы блоком одинарных типах данных.
4. Выберите выходные сигналы для обоих блоков Интерполяционной таблицы. Отметьте их для логгирования. Симулируйте модель в режим normal mode и используйте выходы этого запуска в качестве базовой линии.
1. Получите данные переменных таблицы и точки по оси Х из рабочего пространства модели для указанного блока Интерполяционная таблица. Для примера использование блока 'Pumping Constant':
mdlWks = get_param('sldemo_fuelsys','ModelWorkspace'); currentBlk = 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant';
2. Проанализируйте данные таблицы и преобразуйте ее в половину точности, если она может помещаться в области значений половинного типа точности [-65504, 65504]. В Данные Моделирования Inspector симулируйте модель и сравните записанный выход текущего блока с базовой линией. Проверьте, что выход находится в пределах заданной абсолютной погрешности и относительной погрешности. Для примера этот код устанавливает оба допуска на | 0.01
|.
expath = fullfile(matlabroot,'examples','fixedpoint','main'); addpath(expath); % Add the folder containing the supporting file to the path numBytesSaved(1) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'Table');
3. Повторите шаг 2 задачи 2 для данных каждой из точек останова текущего блока. Данные точек по оси Х должны оставаться монотонно увеличивающимися после преобразования с одной точности в половину.
numBytesSaved(2) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension1'); numBytesSaved(3) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension2'); totalBytesSaved = sum(numBytesSaved(1:3));
4. Повторите шаги 2 и 3 задачи 2 для остальных блоков Интерполяционной таблицы в той же подсистеме. Затем исследуйте количество байтов, сохраненных для таблицы, и точек останова блоков Интерполяционной таблицы n-D.
currentBlk = 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Ramp Rate Ki'; numBytesSaved(4) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'Table'); numBytesSaved(5) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension1'); numBytesSaved(6) = analyzeDataConvertToHalf(mdlWks, currentBlk, 'BreakpointsForDimension2'),
numBytesSaved = 684 36 38 72 12 12
totalBytesSaved = totalBytesSaved + sum(numBytesSaved(4:6)),
totalBytesSaved = 854
1. Симулируйте преобразованную модель с таблицей половинной точности и точками останова.
2. Сравните сигналы 'fuel', 'air _ fuel _ ratio' и т.д. с базовой линией в блоке Scope и в Simulation Data Inspector. Обратите внимание, что требуемая эффективность все еще достигается.
3. Сохраните модель с другим именем в папке с возможностью записи.
1. Щелкните правой кнопкой мыши подсистему fuel_rate_control и выберите C/C + + код > Build This Subsystem. Чтобы сгенерировать код, нажмите Build в диалоговом окне Build code for Subsystem.
2. Когда сборка завершает обработку, отображается отчет генерации кода.
3. Нажмите на half_type.h
и fuel_rate_control.c
файлы. Заметьте половинную точность (real16_T
) определение типа, real16_T
введите таблицу и указатели точек по оси Х в look2_ifbhlfthDfIf_linlca
интерфейс вызова функции.
4. Откройте fuel_rate_control.h
файл и заметьте, что 854 байта были сохранены при помощи половинной точности в качестве типа памяти для таблицы и точек останова.
rmpath(expath);
close_system('sldemo_fuelsys',0);