Преобразуйте одну интерполяционную таблицу точности в половину точности

В этом примере показано, как преобразовать интерполяционную таблицу с одной точностью для использования половинной точности. Половинная точность - это тип склада; расчеты интерполяционной таблицы продолжают выполняться с использованием одинарной точности. После преобразования примеры вдвое сокращают размер памяти блоков Интерполяционной таблицы, сохраняя при этом желаемую производительность системы.

Задача 1: Моделирование и получение базовой линии

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 и используйте выходы этого запуска в качестве базовой линии.

Задача 2: Анализ и преобразование данных в половину

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

Задача 3: Моделирование и сравнение

1. Симулируйте преобразованную модель с таблицей половинной точности и точками останова.

2. Сравните сигналы 'fuel', 'air _ fuel _ ratio' и т.д. с базовой линией в блоке Scope и в Simulation Data Inspector. Обратите внимание, что требуемая эффективность все еще достигается.

3. Сохраните модель с другим именем в папке с возможностью записи.

Задача 4: Сгенерируйте код и проверьте оптимизацию памяти

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);