生成コードをより効率的にするためのヒント
効率的なコードの fimath 設定
fimath
オブジェクトの既定の設定は、丸め誤差を最小にし、オーバーフローを防ぎます。ただし、生成されたコード内で余分なロジックが発生する場合があります。既定の設定は次のとおりです。
RoundingMethod: Nearest
OverflowAction: Saturate
ProductMode: FullPrecision
SumMode: FullPrecision
効率的なコードでは、fimath
の設定と使用するプロセッサの設定を一致させることをお勧めします。
ProductMode
およびSumMode
のKeepLSB
設定は C 言語の整数演算の動作をモデル化します。ProductMode
のKeepMSB
は多数の DSP デバイスの動作をモデル化します。丸め手法の種類によって、必要なオーバーヘッド コードの量が異なります。
RoundingMethod
プロパティをFloor
に設定 (2 の補数切り捨てと同等の設定) すると、多くの演算での丸めの実装が最も効率的になります。除算関数については、最も効率的なRoundingMethod
はZero
です。オーバーフローを処理する標準的な方法として、モジュロ演算を使用してラップします。他のオーバーフローの処理方法は過剰なロジックを作成します。可能な場合は、
OverflowAction
プロパティをWrap
に設定することをお勧めします。
関数のより効率的な固定小数点の実装への置換
CORDIC
CORDIC ベースのアルゴリズムは反復的なシフト加算演算のみを必要とするので、ハードウェアとの親和性が最も高いアルゴリズムの 1 つです。関数を CORDIC 実装のいずれかと置き換えると、生成されたコードをより効率的にすることができます。CORDIC 関数の一覧およびそれらの実装の例は、CORDIC アルゴリズムを参照してください。
ルックアップ テーブル
ルックアップ テーブルによるアプローチを使用することで、一部の関数をより効率的に実装できます。例については、ルックアップ テーブルを使用した固定小数点 Log2 の実装を参照してください。
除算
除算はハードウェアでサポートされていない場合もあります。可能な場合は、除算演算の使用を避けることをお勧めします。
分母が 2 のべき数である場合、除算をビット シフト演算に書き換えることができます。
x/8
この除算は以下のように書き換えができます。
bitsra(x,3)
場合によっては、除算を逆数の乗算として実装するとより効率的になります。
x/5
この除算は以下のように書き換えができます。
x*0.2