FFTを固定小数点化する(2)

大浦さんのFFTコードを固定小数点化する企画の第二回です。こういう企画は大事ですよ。自分がいつのたれ死にしても良い様に、知っていることはどんどん吐き出しておかねば。いや、すぐ死ぬ予定はないですが。
浮動小数点型とは何かと聞かれれば、答えはさほど難しくありません。IEEE浮動小数点フォーマットに沿った型、でカタが付きます。細かく言えば単精度と倍精度。拡張精度型も昔は良く使われましたが、SIMDと相性が悪いので最近は下火です。
では固定小数点型はとなると、これがたちの悪いことに国際標準がありません。固定小数点型ではビットパターンの中の小数点の位置が決まっていますが、実はどこに小数点を置くかは任意です。プログラマや設計者が勝手に決めていいのです。が、それでは自由度が高すぎます。そこで、比較的良く使われているのが、符号ビットのすぐ右に小数点を置く方式です。

s.fffffffffffffff

これは16bit固定小数点型の例です。sは符号ビット、fff..fと15個並ぶfが小数部をあらわします。このようなフォーマットを1.15フォーマットと呼ぶ事もあります*1。.の左右のビット数を表しています。参考までに16bit整数は

siiiiiiiiiiiiiii.

となります。iは整数部をあらわすビットです。同じく.の両側のビット数から16.0フォーマットと呼ぶこともあります。
さて、一般的な16bit固定小数点数型は1.15フォーマットを取ります。2の補数表示の場合、この型は[-1...+1)の範囲を取ります。この性質はADCやDACとなじみが良いため、DSPでは非常に広く使われています。
ところで、DSPで広く使われているのは結構ですがC言語ではどうしましょう。ANSI Cには固定小数点数型が…あるのはこの際置いておきましょう。C++じゃ使えないし。「普通の」C言語でどうするのか考えてみましょう。

*1:フォーマットの呼び方も流儀によって違う。要は名前じゃなくて概念を理解すること。