不韋 呂
/
CQ_FixedPointSin_CMSIS
CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Wed Jul 27 2022 14:32:11 by 1.7.2