Q フォーマット

DSP 屋がよく使う用語(記法?)に、Q15 とか Q31 とかいうのがあります。浮動小数点処理を使わない(使えない)場合に、計算機(コンピュータ)のワード(語)で小数を表現するために必要なものです。金銭の勘定計算などで整数しか表現しない場合、16ビット語のレジスタや変数で -32768 から 32767 の値を表現できますが*1、信号処理の世界では整数だけでは困るので、16ビット語の途中に小数点を入れて表現する訳です。
一番簡単な例だと、最左のビットを符号として、そのすぐ右に小数点を置く表現で、この場合は -1 以上 1 未満の数値を 16ビットの量子化精度で表現できます。これを、Q15 とか Q.15 とか呼ぶわけです。これが Q フォーマットです。ここで「15」というのは、小数点の右に小数が 15ビット並ぶことから来ています。(詳しくは、ここ読んでください。)
昔、私が DSP のソフトを書いていた頃は、職場の中でも Q フォーマットに統一されておらず、表記方法がいろいろあって混乱しました。最近はインターネットの効果で情報交換がしやすくなったためか、Q フォーマットの表記に落ち着いているように思います。
さて。Q15 とか Q31 というのは、よく見聞きするため、多くの DSP 屋さんが迷わずに使っていると思いますが、例えば 16ビット語の中央に小数点を置く場合に、これを何と呼んだら良いものか、私はずっと分からずにいました*2。今日、調べたところ、ようやく明確になったので備忘録を書いておこうと思った次第です。(既に御存知の方は、なあんだと思われるでしょうけど、あしからず。)
16ビット語で、小数点が中央にある場合は、これを Q7.8 と表記するのだそうです。32ビット語で、小数点の右に小数ビットが一つだけある場合は、Q30.1 です。そんでもって、Q0.n のことは、Q.n とか Qn って略すのだそうです。Qn.0 と混同しそうな気もしますが、利用頻度は Q0.n のほうが高いので、それで良いのでしょう。Q.n と書くか、Qn と書くかは、流儀みたいです。Wikipedia では後者で説明されていますが、混同を抑えるために前者が好きな人もいるようです。
おしまい。

*1:2の補数表現の場合。

*2:というか、今まで勉強をさぼっていた。Q8 と書くと、元の語長が 8ビットなのか 16ビットなのか、分からない。