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