CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.

Dependencies:   mbed

Committer:
MikamiUitOpen
Date:
Wed Aug 02 12:01:51 2017 +0000
Revision:
0:9b1d4712f862
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:9b1d4712f862 1 //--------------------------------------------------------------
MikamiUitOpen 0:9b1d4712f862 2 // ミニマックス近似式で sin 関数,cos 関数の値を求める
MikamiUitOpen 0:9b1d4712f862 3 // (π/2)x に対する sin, cos を求める
MikamiUitOpen 0:9b1d4712f862 4 // 小数点以下のビット数: 14 ビット
MikamiUitOpen 0:9b1d4712f862 5 // 実際の数値と,引数および戻り値の対応関係
MikamiUitOpen 0:9b1d4712f862 6 // 0 → 0
MikamiUitOpen 0:9b1d4712f862 7 // 16384 → 1
MikamiUitOpen 0:9b1d4712f862 8 // 2017/03/04, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:9b1d4712f862 9 //--------------------------------------------------------------
MikamiUitOpen 0:9b1d4712f862 10
MikamiUitOpen 0:9b1d4712f862 11 #include "mbed.h"
MikamiUitOpen 0:9b1d4712f862 12 #include "FixedFloat.hpp"
MikamiUitOpen 0:9b1d4712f862 13
MikamiUitOpen 0:9b1d4712f862 14 #ifndef SIN_FIXED_INT16T_HPP
MikamiUitOpen 0:9b1d4712f862 15 #define SIN_FIXED_INT16T_HPP
MikamiUitOpen 0:9b1d4712f862 16
MikamiUitOpen 0:9b1d4712f862 17 const int32_t SIN_A1_ = ToFixed29( 0.57079101); // a1 - 1
MikamiUitOpen 0:9b1d4712f862 18 const int32_t SIN_A3_ = ToFixed29(-0.64589285); // a3
MikamiUitOpen 0:9b1d4712f862 19 const int32_t SIN_A5_ = ToFixed29( 0.07943434); // a5
MikamiUitOpen 0:9b1d4712f862 20 const int16_t SIN_A7_ = ToFixed15(-0.00433310); // a7
MikamiUitOpen 0:9b1d4712f862 21
MikamiUitOpen 0:9b1d4712f862 22 inline int16_t Sin16(int16_t x)
MikamiUitOpen 0:9b1d4712f862 23 {
MikamiUitOpen 0:9b1d4712f862 24 if (abs(x) > 0x4000) x = 0x8000 - x; // x ← 2 - x
MikamiUitOpen 0:9b1d4712f862 25
MikamiUitOpen 0:9b1d4712f862 26 int16_t x2 = Round14(x*x);
MikamiUitOpen 0:9b1d4712f862 27 int32_t acc = Round14(Round14(Round14
MikamiUitOpen 0:9b1d4712f862 28 (SIN_A7_*x2 + SIN_A5_)*x2
MikamiUitOpen 0:9b1d4712f862 29 + SIN_A3_)*x2
MikamiUitOpen 0:9b1d4712f862 30 + SIN_A1_)*x;
MikamiUitOpen 0:9b1d4712f862 31 return Round15(acc) + x;
MikamiUitOpen 0:9b1d4712f862 32 }
MikamiUitOpen 0:9b1d4712f862 33
MikamiUitOpen 0:9b1d4712f862 34 inline int16_t Cos16(int16_t x) { return Sin16(16384 - x); }
MikamiUitOpen 0:9b1d4712f862 35
MikamiUitOpen 0:9b1d4712f862 36 #endif // SIN_FIXED_INT16T_HPP