不韋 呂
/
CQ_FixedPointSin_CMSIS
CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.
CMSISmain.cpp@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 | // 自作 Sin16() と ARM の arm_sin_q15() の実行時間の比較 |
MikamiUitOpen | 0:9b1d4712f862 | 3 | // arm_sin_q15.c は自分でインポートする必要がある |
MikamiUitOpen | 0:9b1d4712f862 | 4 | // 2017/03/01, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 0:9b1d4712f862 | 5 | //---------------------------------------------------------------------- |
MikamiUitOpen | 0:9b1d4712f862 | 6 | #include "mbed.h" |
MikamiUitOpen | 0:9b1d4712f862 | 7 | #include "SinCosFixed.hpp" // Sin16() 用 |
MikamiUitOpen | 0:9b1d4712f862 | 8 | #pragma diag_suppress 3108 // arm_sin_q15() で,コンパイル時に出る warning 抑制のため |
MikamiUitOpen | 0:9b1d4712f862 | 9 | #include "arm_math.h" // arm_sin_q15() 用 |
MikamiUitOpen | 0:9b1d4712f862 | 10 | |
MikamiUitOpen | 0:9b1d4712f862 | 11 | const int TS_ = 10; // 標本化間隔:10 μs |
MikamiUitOpen | 0:9b1d4712f862 | 12 | |
MikamiUitOpen | 0:9b1d4712f862 | 13 | Ticker timer_; |
MikamiUitOpen | 0:9b1d4712f862 | 14 | AnalogOut da1_(A2); |
MikamiUitOpen | 0:9b1d4712f862 | 15 | AnalogOut da2_(D13); |
MikamiUitOpen | 0:9b1d4712f862 | 16 | DigitalOut dOut_(D2); |
MikamiUitOpen | 0:9b1d4712f862 | 17 | |
MikamiUitOpen | 0:9b1d4712f862 | 18 | const int DX_ = 997; |
MikamiUitOpen | 0:9b1d4712f862 | 19 | int16_t phi1_ = 0; |
MikamiUitOpen | 0:9b1d4712f862 | 20 | int16_t phi2_ = 0; |
MikamiUitOpen | 0:9b1d4712f862 | 21 | |
MikamiUitOpen | 0:9b1d4712f862 | 22 | void TimerIsr() |
MikamiUitOpen | 0:9b1d4712f862 | 23 | { |
MikamiUitOpen | 0:9b1d4712f862 | 24 | dOut_ = 1; |
MikamiUitOpen | 0:9b1d4712f862 | 25 | int16_t sn1 = Sin16(phi1_); // 300 ns(実測値) |
MikamiUitOpen | 0:9b1d4712f862 | 26 | dOut_ = 0; |
MikamiUitOpen | 0:9b1d4712f862 | 27 | wait_us(2); |
MikamiUitOpen | 0:9b1d4712f862 | 28 | dOut_ = 1; |
MikamiUitOpen | 0:9b1d4712f862 | 29 | int16_t sn2 = arm_sin_q15(phi2_); // 570 ns(実測値) |
MikamiUitOpen | 0:9b1d4712f862 | 30 | dOut_ = 0; |
MikamiUitOpen | 0:9b1d4712f862 | 31 | |
MikamiUitOpen | 0:9b1d4712f862 | 32 | phi1_ += 2*DX_; |
MikamiUitOpen | 0:9b1d4712f862 | 33 | phi2_ = (phi2_ + DX_) & 0x7FFF; |
MikamiUitOpen | 0:9b1d4712f862 | 34 | |
MikamiUitOpen | 0:9b1d4712f862 | 35 | da1_.write_u16(sn1+32768); |
MikamiUitOpen | 0:9b1d4712f862 | 36 | da2_.write_u16(sn2/2+32768); |
MikamiUitOpen | 0:9b1d4712f862 | 37 | } |
MikamiUitOpen | 0:9b1d4712f862 | 38 | |
MikamiUitOpen | 0:9b1d4712f862 | 39 | int main() |
MikamiUitOpen | 0:9b1d4712f862 | 40 | { |
MikamiUitOpen | 0:9b1d4712f862 | 41 | timer_.attach_us(&TimerIsr, TS_); |
MikamiUitOpen | 0:9b1d4712f862 | 42 | |
MikamiUitOpen | 0:9b1d4712f862 | 43 | while (true) {} |
MikamiUitOpen | 0:9b1d4712f862 | 44 | } |