Этот пример показывает, как использовать умножение с плавающей точкой для обработки коррекции наклона сети. При преобразовании типов данных с плавающей точкой в типы данных с фиксированной точкой в сгенерированном коде коррекция наклона сети является одним из методов масштабирования типов данных с фиксированной точкой. Масштабирование типов данных с фиксированной точкой избегает условий переполнения и минимизирует ошибки квантования.
Для процессоров, которые поддерживают эффективное умножение, использование умножения с плавающей точкой для обработки коррекции наклона сети улучшает эффективность кода. Если коррекция наклона сети имеет значение, которое не является степенью двойки, использование деления улучшает точность.
Примечание.Для этого примера требуется лицензия Fixed-Point Designer™.
В rtwdemo_float_mul_for_net_slope_correction модели блок Convert преобразует входной сигнал из типа данных с плавающей точкой в тип данных с фиксированной точкой. Коррекция сетевого наклона имеет значение 3
.
model = 'rtwdemo_float_mul_for_net_slope_correction';
open_system(model);
Создайте временную папку для процесса сборки и проверки.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
slbuild(model)
### Starting build procedure for: rtwdemo_float_mul_for_net_slope_correction ### Successful completion of build procedure for: rtwdemo_float_mul_for_net_slope_correction Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================================================== rtwdemo_float_mul_for_net_slope_correction Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.186s
В этих линиях rtwdemo_float_mul_for_net_slope_correction.c
код, генератор кода делит входной сигнал на 3.0F
.
cfile = fullfile(cgDir,'rtwdemo_float_mul_for_net_slope_correction_ert_rtw',... 'rtwdemo_float_mul_for_net_slope_correction.c'); rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_float_mul_for_net_slope_correction_step(void) { /* Outport: '<Root>/Output' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' * Inport: '<Root>/Input' */ rtY.Output = (int16_T)(real32_T)floor((real_T)(rtU.Input / 3.0F)); }
Откройте диалоговое окно Параметры конфигурации.
На панели Математические и типы данных выберите Использовать умножение с плавающей точкой, чтобы обработать коррекции уклона сети. Эта оптимизация включена по умолчанию.
Также можно использовать API командной строки, чтобы включить оптимизацию.
set_param(model, 'UseFloatMulNetSlope', 'on');
slbuild(model)
### Starting build procedure for: rtwdemo_float_mul_for_net_slope_correction ### Successful completion of build procedure for: rtwdemo_float_mul_for_net_slope_correction Build Summary Top model targets built: Model Action Rebuild Reason ========================================================================================================== rtwdemo_float_mul_for_net_slope_correction Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 8.6393s
В оптимизированном коде генератор кода умножает входной сигнал на обратную 3.0F
, то есть 0.333333343F
.
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_float_mul_for_net_slope_correction_step(void) { /* Outport: '<Root>/Output' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' * Inport: '<Root>/Input' */ rtY.Output = (int16_T)(real32_T)floor((real_T)(rtU.Input * 0.333333343F)); }
Закройте модель и отчет о генерации кода.
bdclose(model) rtwdemoclean; cd(currentDir)
Используйте умножение с плавающей точкой, чтобы обработать коррекции наклона сети