不韋 呂
/
CQ_FixedPointSinCos
CQ出版社インターフェース誌の2017年10月号で解説している二相発振器のプログラム
SinCosFixed.hpp@0:97d46bd73383, 2017-08-02 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Aug 02 11:50:17 2017 +0000
- Revision:
- 0:97d46bd73383
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:97d46bd73383 | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:97d46bd73383 | 2 | // ミニマックス近似式で sin 関数,cos 関数の値を求める |
MikamiUitOpen | 0:97d46bd73383 | 3 | // (π/2)x に対する sin, cos を求める |
MikamiUitOpen | 0:97d46bd73383 | 4 | // 小数点以下のビット数: 14 ビット |
MikamiUitOpen | 0:97d46bd73383 | 5 | // 実際の数値と,引数および戻り値の対応関係 |
MikamiUitOpen | 0:97d46bd73383 | 6 | // 0 → 0 |
MikamiUitOpen | 0:97d46bd73383 | 7 | // 16384 → 1 |
MikamiUitOpen | 0:97d46bd73383 | 8 | // 2017/03/04, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 0:97d46bd73383 | 9 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:97d46bd73383 | 10 | |
MikamiUitOpen | 0:97d46bd73383 | 11 | #include "mbed.h" |
MikamiUitOpen | 0:97d46bd73383 | 12 | #include "FixedFloat.hpp" |
MikamiUitOpen | 0:97d46bd73383 | 13 | |
MikamiUitOpen | 0:97d46bd73383 | 14 | #ifndef SIN_FIXED_INT16T_HPP |
MikamiUitOpen | 0:97d46bd73383 | 15 | #define SIN_FIXED_INT16T_HPP |
MikamiUitOpen | 0:97d46bd73383 | 16 | |
MikamiUitOpen | 0:97d46bd73383 | 17 | const int32_t SIN_A1_ = ToFixed29( 0.57079101); // a1 - 1 |
MikamiUitOpen | 0:97d46bd73383 | 18 | const int32_t SIN_A3_ = ToFixed29(-0.64589285); // a3 |
MikamiUitOpen | 0:97d46bd73383 | 19 | const int32_t SIN_A5_ = ToFixed29( 0.07943434); // a5 |
MikamiUitOpen | 0:97d46bd73383 | 20 | const int16_t SIN_A7_ = ToFixed15(-0.00433310); // a7 |
MikamiUitOpen | 0:97d46bd73383 | 21 | |
MikamiUitOpen | 0:97d46bd73383 | 22 | inline int16_t Sin16(int16_t x) |
MikamiUitOpen | 0:97d46bd73383 | 23 | { |
MikamiUitOpen | 0:97d46bd73383 | 24 | if (abs(x) > 0x4000) x = 0x8000 - x; // x ← 2 - x |
MikamiUitOpen | 0:97d46bd73383 | 25 | |
MikamiUitOpen | 0:97d46bd73383 | 26 | int16_t x2 = Round14(x*x); |
MikamiUitOpen | 0:97d46bd73383 | 27 | int32_t acc = Round14(Round14(Round14 |
MikamiUitOpen | 0:97d46bd73383 | 28 | (SIN_A7_*x2 + SIN_A5_)*x2 |
MikamiUitOpen | 0:97d46bd73383 | 29 | + SIN_A3_)*x2 |
MikamiUitOpen | 0:97d46bd73383 | 30 | + SIN_A1_)*x; |
MikamiUitOpen | 0:97d46bd73383 | 31 | return Round15(acc) + x; |
MikamiUitOpen | 0:97d46bd73383 | 32 | } |
MikamiUitOpen | 0:97d46bd73383 | 33 | |
MikamiUitOpen | 0:97d46bd73383 | 34 | inline int16_t Cos16(int16_t x) { return Sin16(16384 - x); } |
MikamiUitOpen | 0:97d46bd73383 | 35 | |
MikamiUitOpen | 0:97d46bd73383 | 36 | #endif // SIN_FIXED_INT16T_HPP |