Умножение с плавающей точкой, чтобы обработать сетевую наклонную коррекцию

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

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

Примечание: Этот пример требует лицензии 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. Откройте диалоговое окно Configuration Parameters.

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

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

Смотрите также

Похожие темы