不韋 呂
/
CQ_FixedPointSin_CMSIS
CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.
FixedFloat.hpp@0:9b1d4712f862, 2017-08-02 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Aug 02 12:01:51 2017 +0000
- Revision:
- 0:9b1d4712f862
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:9b1d4712f862 | 1 | //------------------------------------------------------------------- |
MikamiUitOpen | 0:9b1d4712f862 | 2 | // 固定小数点数の演算を扱う際に使うインライン関数 |
MikamiUitOpen | 0:9b1d4712f862 | 3 | // |
MikamiUitOpen | 0:9b1d4712f862 | 4 | // 2017/03/03, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 0:9b1d4712f862 | 5 | //------------------------------------------------------------------- |
MikamiUitOpen | 0:9b1d4712f862 | 6 | #include "mbed.h" |
MikamiUitOpen | 0:9b1d4712f862 | 7 | |
MikamiUitOpen | 0:9b1d4712f862 | 8 | #ifndef QN_INLINE_FUNCTIONS_HPP |
MikamiUitOpen | 0:9b1d4712f862 | 9 | #define QN_INLINE_FUNCTIONS_HPP |
MikamiUitOpen | 0:9b1d4712f862 | 10 | |
MikamiUitOpen | 0:9b1d4712f862 | 11 | // 丸めのために使う |
MikamiUitOpen | 0:9b1d4712f862 | 12 | inline float ForRound(float x) |
MikamiUitOpen | 0:9b1d4712f862 | 13 | { return (x > 0) ? 0.5f : -0.5f; } |
MikamiUitOpen | 0:9b1d4712f862 | 14 | |
MikamiUitOpen | 0:9b1d4712f862 | 15 | // float 型の引数を int16_t 型の Q14 に変換する |
MikamiUitOpen | 0:9b1d4712f862 | 16 | inline int16_t ToFixed14(float x) |
MikamiUitOpen | 0:9b1d4712f862 | 17 | { return (int16_t)(x*16384.0f + ForRound(x)); } |
MikamiUitOpen | 0:9b1d4712f862 | 18 | |
MikamiUitOpen | 0:9b1d4712f862 | 19 | // float 型の引数を int16_t 型の Q15 に変換する |
MikamiUitOpen | 0:9b1d4712f862 | 20 | inline int16_t ToFixed15(float x) |
MikamiUitOpen | 0:9b1d4712f862 | 21 | { return (int16_t)(x*32768.0f + ForRound(x)); } |
MikamiUitOpen | 0:9b1d4712f862 | 22 | |
MikamiUitOpen | 0:9b1d4712f862 | 23 | // float 型の引数を int16_t 型の Q29 に変換する |
MikamiUitOpen | 0:9b1d4712f862 | 24 | inline int32_t ToFixed29(float x) |
MikamiUitOpen | 0:9b1d4712f862 | 25 | { return (int32_t)(x*32768.0f*16384.0f); } |
MikamiUitOpen | 0:9b1d4712f862 | 26 | |
MikamiUitOpen | 0:9b1d4712f862 | 27 | // 下位ビットを丸めて右に 14 ビットシフトする |
MikamiUitOpen | 0:9b1d4712f862 | 28 | inline int32_t Round14(int32_t x) |
MikamiUitOpen | 0:9b1d4712f862 | 29 | { return (x + 0x2000) >> 14; } |
MikamiUitOpen | 0:9b1d4712f862 | 30 | |
MikamiUitOpen | 0:9b1d4712f862 | 31 | // 下位ビットを丸めて右に 154 ビットシフトする |
MikamiUitOpen | 0:9b1d4712f862 | 32 | inline int32_t Round15(int32_t x) |
MikamiUitOpen | 0:9b1d4712f862 | 33 | { return (x + 0x4000) >> 15; } |
MikamiUitOpen | 0:9b1d4712f862 | 34 | |
MikamiUitOpen | 0:9b1d4712f862 | 35 | #endif // QN_INLINE_FUNCTIONS_HPP |