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

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

Задача 1: симулируйте и получите базовую линию

1. Откройте airflow_calc подсистема sldemo_fuelsys модель в качестве примера. Это содержит блоки Интерполяционной таблицы с таблицей одинарной точности и данными о точке останова, которые будут преобразованы в половину точности.

load_system('sldemo_fuelsys');
open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');

2. В MATLAB®, изменение ваша текущая папка к перезаписываемой папке.

3. Проверяйте, что таблица и точки останова, Качающие Постоянный и Уровень Пандуса типы данных блока Lookup Table Ки, установлены как одни.

4. Выберите выходные сигналы для обоих блоков Интерполяционной таблицы. Отметьте их для логгирования. Симулируйте модель в режиме normal mode и используйте выходные параметры этого запуска как базовая линия.

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

1. Получите таблицу и установите точки останова переменные данные из рабочего пространства модели для заданного блока Lookup Table. Например, с помощью блока 'Pumping Constant':

mdlWks = get_param('sldemo_fuelsys','ModelWorkspace');
currentBlk = 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant';

2. Анализируйте табличные данные и преобразуйте их в половину точности, если они могут поместиться в область значений половины типа точности [-65504, 65504]. В Инспекторе Данных моделирования симулируйте модель и сравните регистрируемый выход текущего блока с базовой линией. Проверьте, что выход в заданной абсолютной погрешности и относительной погрешности. Например, это кодовые наборы оба допуска к | 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. Сравните 'топливо', 'air_fuel_ratio', и т.д. сигналы с базовой линией в блоке Scope и в Инспекторе Данных моделирования. Заметьте, что желаемая эффективность все еще достигается.

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

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

1. Щелкните правой кнопкой по fuel_rate_control подсистеме и выберите C/C ++ Code> Build This Subsystem. Чтобы сгенерировать код, нажмите Build в коде Сборки для диалогового окна 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);

Похожие темы