CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CMSISmain.cpp Source File

CMSISmain.cpp

00001 //----------------------------------------------------------------------
00002 //  自作 Sin16() と ARM の arm_sin_q15() の実行時間の比較
00003 //      arm_sin_q15.c は自分でインポートする必要がある
00004 //  2017/03/01, Copyright (c) 2017 MIKAMI, Naoki
00005 //----------------------------------------------------------------------
00006 #include "mbed.h"
00007 #include "SinCosFixed.hpp"  // Sin16() 用
00008 #pragma diag_suppress 3108  // arm_sin_q15() で,コンパイル時に出る warning 抑制のため
00009 #include "arm_math.h"       // arm_sin_q15() 用
00010 
00011 const int TS_ = 10; // 標本化間隔:10 μs
00012 
00013 Ticker timer_;
00014 AnalogOut da1_(A2);
00015 AnalogOut da2_(D13);
00016 DigitalOut dOut_(D2);
00017 
00018 const int DX_ = 997;
00019 int16_t phi1_ = 0;
00020 int16_t phi2_ = 0;
00021 
00022 void TimerIsr()
00023 {
00024     dOut_ = 1;
00025     int16_t sn1 = Sin16(phi1_);         // 300 ns(実測値)
00026     dOut_ = 0;
00027     wait_us(2);
00028     dOut_ = 1;
00029     int16_t sn2 = arm_sin_q15(phi2_);   // 570 ns(実測値)
00030     dOut_ = 0;
00031     
00032     phi1_ += 2*DX_;
00033     phi2_ = (phi2_ + DX_) & 0x7FFF;
00034     
00035     da1_.write_u16(sn1+32768);
00036     da2_.write_u16(sn2/2+32768);
00037 }
00038 
00039 int main()
00040 {
00041     timer_.attach_us(&TimerIsr, TS_);
00042     
00043     while (true) {}
00044 }