Умножение с плавающей точкой для обработки коррекции сетевого наклона

Этот пример показывает, как использовать умножение с плавающей точкой для обработки коррекции наклона сети. При преобразовании типов данных с плавающей точкой в типы данных с фиксированной точкой в сгенерированном коде коррекция наклона сети является одним из методов масштабирования типов данных с фиксированной точкой. Масштабирование типов данных с фиксированной точкой избегает условий переполнения и минимизирует ошибки квантования.

Для процессоров, которые поддерживают эффективное умножение, использование умножения с плавающей точкой для обработки коррекции наклона сети улучшает эффективность кода. Если коррекция наклона сети имеет значение, которое не является степенью двойки, использование деления улучшает точность.

Примечание.Для этого примера требуется лицензия 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));
}

Включите оптимизацию

  1. Откройте диалоговое окно Параметры конфигурации.

  2. На панели Математические и типы данных выберите Использовать умножение с плавающей точкой, чтобы обработать коррекции уклона сети. Эта оптимизация включена по умолчанию.

Также можно использовать 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)

См. также

Похожие темы