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 // 自作 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 }