不韋 呂
/
CQ_FixedPointSin_CMSIS
CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.
Embed:
(wiki syntax)
Show/hide line numbers
SinCosFixed.hpp
00001 //-------------------------------------------------------------- 00002 // ミニマックス近似式で sin 関数,cos 関数の値を求める 00003 // (π/2)x に対する sin, cos を求める 00004 // 小数点以下のビット数: 14 ビット 00005 // 実際の数値と,引数および戻り値の対応関係 00006 // 0 → 0 00007 // 16384 → 1 00008 // 2017/03/04, Copyright (c) 2017 MIKAMI, Naoki 00009 //-------------------------------------------------------------- 00010 00011 #include "mbed.h" 00012 #include "FixedFloat.hpp" 00013 00014 #ifndef SIN_FIXED_INT16T_HPP 00015 #define SIN_FIXED_INT16T_HPP 00016 00017 const int32_t SIN_A1_ = ToFixed29( 0.57079101); // a1 - 1 00018 const int32_t SIN_A3_ = ToFixed29(-0.64589285); // a3 00019 const int32_t SIN_A5_ = ToFixed29( 0.07943434); // a5 00020 const int16_t SIN_A7_ = ToFixed15(-0.00433310); // a7 00021 00022 inline int16_t Sin16(int16_t x) 00023 { 00024 if (abs(x) > 0x4000) x = 0x8000 - x; // x ← 2 - x 00025 00026 int16_t x2 = Round14(x*x); 00027 int32_t acc = Round14(Round14(Round14 00028 (SIN_A7_*x2 + SIN_A5_)*x2 00029 + SIN_A3_)*x2 00030 + SIN_A1_)*x; 00031 return Round15(acc) + x; 00032 } 00033 00034 inline int16_t Cos16(int16_t x) { return Sin16(16384 - x); } 00035 00036 #endif // SIN_FIXED_INT16T_HPP
Generated on Wed Jul 27 2022 14:32:11 by 1.7.2