2

私は最近、いくつかの固定小数点コーディングに取り組んでいます。

ADC から 16 ビットのサンプルを大量に取得し、16 ビットのフィルター係数で乗算すると、結果は 32 ビットの固定小数点数になる可能性があります。32 ビットの固定小数点 DSP をターゲットにしているので、これで問題ありません。しかし、それを別の 16 ビット固定小数点係数などで乗算したい場合は、オーバーフローが発生しますか? つまり、中間の切り捨てを行う必要があるということですか? 最終的には、結果を 16 ビット DAC に送信する必要があるため、切り捨てます。

MATLABでこれを行った経験のある人はいますか?

編集私は固定小数点ツールボックスを持っています。私が理解していないのは、16ビットワード長の数値を設定し、最大積長を16に設定し、それを別の16ビットワードで乗算すると、エラーが発生するということです? エラーを防ぐためにすべての切り捨てを実行する必要がある場合、固定小数点ツールボックスはどのように役立つのでしょうか? 入力が 16 ビットで 32 ビットのレジスタがある場合に、固定小数点ツールボックスを使用して可能な限り最適な丸め/オーバーフロー条件を確保する方法の例を探していると思います。

ありがとう

4

1 に答える 1

4

ご指摘のとおり、16 ビットの乗算は 32 ビットの結果になる可能性があります。続けるにあたり、あなたの固定小数点表記は 16.16 であると仮定しています。

2 番目の乗算を実行するには、最初の mul の結果を 16 ビット下にシフトする必要があります。結果が目的の 16.16 形式に戻ったので、2 番目の mul に進むことができます (「...これを別の 16 ビット固定小数点係数で乗算したい場合...」)。この 2 回目の乗算の後、結果を 16 ビット下にシフトして、16.16 表記を復元します。

DAC から値を出荷する前に、固定小数点表記を残して整数形式に戻す必要があると思います。これを行うには、値を 16 ビット下にシフトするだけです。固定小数点表記を終了する前に、結果を丸めることを検討してください。固定小数点数が正であると仮定すると、これは、最終的な右シフトの前に結果に 0.5f を追加することで実現できます。(16.16 では、0.5f は 2^15 です。)

いつものように、シーケンシャルな固定小数点算術演算は、左辺のオーバーフローを避けるために綿密に調査する必要があります。演算は、オーバーフローを防ぐために並べ替えたり、因数分解したりすることができます。Web には、チュートリアルに役立つ優れたチュートリアルが多数あります。

matlab で固定小数点演算を実行する場合、bitshift 関数は簡単に使用できます。もちろん、固定小数点ツールボックスを使用すると、これがさらに簡単になります。

于 2011-06-22T15:52:22.793 に答える