勾配設定を補正する浮動小数点の乗算
この例では、浮動小数点の乗算を使用して勾配設定を補正する方法を示します。生成されたコードで浮動小数点データ型を固定小数点データ型に変換する場合、固定小数点データ型をスケーリングする 1 つの方法として勾配設定の補正があります。固定小数点データ型のスケーリングにより、オーバーフロー状態を回避し、量子化誤差を最小に抑えます。
効率的な乗算をサポートするプロセッサの場合、勾配設定を補正する浮動小数点の乗算を使用して、コードの効率を向上します。勾配設定の補正に 2 のべき乗以外の値がある場合、除算を使用して精度を向上します。
メモ: この例には Fixed-Point Designer™ のライセンスが必要です。
例
モデル FloatMultiplicationNetSlope
の Convert ブロックは、入力信号を浮動小数点データ型から固定小数点データ型に変換します。勾配設定の補正には 3
の値があります。
model = 'FloatMultiplicationNetSlope';
open_system(model);
コードの生成
モデルを作成します。
slbuild(model)
### Starting build procedure for: FloatMultiplicationNetSlope ### Successful completion of build procedure for: FloatMultiplicationNetSlope Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================================= FloatMultiplicationNetSlope 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 13.373s
FloatMultiplicationNetSlope.c
コードの以下の行で、コード ジェネレーターは入力信号を 3.0F
で除算します。
cfile = fullfile('FloatMultiplicationNetSlope_grt_rtw',... 'FloatMultiplicationNetSlope.c'); coder.example.extractLines(cfile,'/* Model step', '/* Model initialize function */', 1, 0);
/* Model step function */ void FloatMultiplicationNetSlope_step(void) { /* Outport: '<Root>/Output' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' * Inport: '<Root>/Input' */ FloatMultiplicationNetSlope_Y.Output = (int16_T)(real32_T)floor (FloatMultiplicationNetSlope_U.Input / 3.0F); }
最適化の有効化
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
[数学とデータ型] ペインで、[浮動小数点の乗算を使用して勾配設定を補正] を選択します。既定の設定では、最適化はオンです。
代わりに、コマンド ライン API を使用して最適化を有効にできます。
set_param(model, 'UseFloatMulNetSlope', 'on');
最適化を使用したコードの生成
slbuild(model)
### Starting build procedure for: FloatMultiplicationNetSlope ### Successful completion of build procedure for: FloatMultiplicationNetSlope Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================ FloatMultiplicationNetSlope 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 9.4448s
最適化されたコードで、コード ジェネレーターは 3.0F
の逆数、つまり 0.333333343F
で入力信号を乗算します。
coder.example.extractLines(cfile,'/* Model step', '/* Model initialize function */', 1, 0);
/* Model step function */ void FloatMultiplicationNetSlope_step(void) { /* Outport: '<Root>/Output' incorporates: * DataTypeConversion: '<Root>/Data Type Conversion' * Inport: '<Root>/Input' */ FloatMultiplicationNetSlope_Y.Output = (int16_T)(real32_T)floor (FloatMultiplicationNetSlope_U.Input * 0.333333343F); }
モデルおよびコード生成レポートを閉じます。
bdclose(model)
参考
Use floating-point multiplication to handle net slope corrections