さて、aki-H8 3664Fは、単精度浮動小数点演算ができますが
計算に時間が掛かり過ぎます。
例えば
単精度浮動小数点同士の加算1回で、268ステート要します。
(http://www.renesas.com/jpn/products/mpumcu/16bit/tiny/application_note/ADJ-502-127/ADJ-502-127.pdf)
1ステートとは、CPUのシステムクロックの立ち上がりから、次の立ち上がりまでを言いますから
H8/3664Fは、16MHz動作だと、
ですから、
これを、
例えば、60回繰り返すと
ですので、単純に考えて、1KHz以下の周波数の入力でないと、計算できないと思います。
小数点を、どこに打つかは、自分で決めるようです。
例1
8ビットの場合
X=127=(B'0111 111)
このXの7ビット目(MSB)と、6ビット目の間に小数点を打つとすれば
この行為は、Xを128(2^7)で割ることに等しい。
ですので
ですから
、
Q7だと
X(=127)は、と言う数字を表しています。
ですので、
FIRフィルタの係数H(3)が、Q0で表現して
と、表示されたら
これをQ7で表示しようとすれば
H(3)を
これを四捨五入して、整数で表すと、Q7では、H(3)=1となります。
Q8では2
Q8で、H(3)=1.
Q16では2
ですので
Q16で H(3)=305
です。
このように、整数同士の掛け算にするのです。
計算の結果が出た時に、それを、それぞれ掛けた数で割って置くと、
元の数H(3)を、掛けたのと、ほぼ、同じ数字になりますよね。
符号付16ビット乗算)
これを、さっきと同じで、60回繰り返すと
24
最後に2
合計
1440+32=1472ステート
1472ステート=1472
と、単精度浮動小数点計算に比べ、10倍以上のスピードアップになります。
積和だと59回足す訳ですから
和(32ビット足し算 ADD.L ERs,ERd =2ステート)も考慮すると
1472+2x59=1590ステート
1590ステート=1590
(*レジスタに、メモリーの内容をもって来る事は、今は、考慮していません)
H8(3664F)で、重い計算をさせて、これですから、
実際は(D/Aは8ビット出力ですから)、もっと、計算に要する時間は少ないはずですね。
原理が、なかなか、解りませんでした。
例によって、検索しまくり、よいサイトを発見しました。
この場にて、御礼申し上げます。
骨子は
X+Y=0
なら
マイナスY=X だ!
8ビットで考えます。
255+1=0
ですね。
だから
ほんまに、うまい! 拍手っ! ぱちぱちぱち。
254+2=0
以下
こんな風になりますから、
は、-128の事と、決めておけば
8ビットでは、負の数は、-1〜-128、正の数は 127〜0 (ゼロも入れました。)の範囲になりますよね。
そんで、
先ほどのQ7だと、
-128(B'10000000)を2
ですから、Q7では
の、関係になります。
ですので
8ビットの場合
小数点以下の部分は、0.0078125刻みです。
16ビットだと、もっと細かくできますね...
H.15.9.22
This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.