2012年7月13日金曜日

固定小数点演算信号処理の極意シリーズ (その8) bit削減方法

前回は符号付き固定小数点の加算を説明しました.今回は、前回で説明がしりきれになってしまった「膨らんだbitを削減する方法」を説明します.

設定はこのような場面です.前回説明した加算回路出力Dが18bitであるが、RAMは16bitしかないので、bit削減してからRAMに書かなくちゃイケナイという場面.

Dの信号がフルbit振幅の正弦波だと仮定して波形を描いたのが下図です.
グリーンが加算回路出力である符号付き18bitです.小数点は無視して(1.17.0)としてプロットしてあるので、最大/最小値は±131071になっていて、どう考えても16bit RAMにはストアできっこありません.さて、どうしましょうか? 2通りのbit削減方法があります.
bit削減方法その1は赤いラインのように、下2bitを捨ててしまう方法があります.つまりverilogでは、
     wire [15:0] E = D[17:2];
このように表記します.D[1:0]を消滅させます.分解能が悪化する副作用があります.

bit削減方法その2は青いラインのように、16bit2進数の表現範囲±32767を超えたエリアをクリップさせる方法です.すなわち18'h07FFFを超えさせなくする、かつ18'h38001を下回らせなくするという対処をしたいわけです.
   :
18'h08001     7FFFにclip
18'h08000     7FFFにclip
18'h07FFF    スルー
18'h07FFE    スルー
   :
18'h38001     スルー
18'h38000     8001にclip       ←なんで8001なのかはこちらの「不便なこと1」を参照
18'h37FFF    8001にclip
18'h37FFe    8001にclip
   :
これをverilogで書くと、
     wire [15:0] E = (D[17]==0 && D[16:0]>17'h7FFF) ? 16'h7FFF :  // +clip
                            (D[17]==1 && D[16:0]<17'h18001) ? 16'h8001 : // -clip
                             D[15:0];    // through
このclipping処理は、目がチカチカするのでわたしはcodingするたびになにかしらバグってしまい、simulationで気づくというヘタレなことをやってしまいます.上のcodeもバグっているやもしれぬ...固定小数点信号処理のめんどくさいところの一つです.

もしも、分解能低下も嫌だし、clippingも嫌ならば、RAMを18bitに拡張するしかないってことになります.

では今回はこのへんで、                   つぎへ             前へ

人気ブログランキングへ

0 件のコメント:

コメントを投稿