不韋 呂
/
CQ_FixedPointSinCos
CQ出版社インターフェース誌の2017年10月号で解説している二相発振器のプログラム
QuadOscAddFixed.hpp@0:97d46bd73383, 2017-08-02 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed Aug 02 11:50:17 2017 +0000
- Revision:
- 0:97d46bd73383
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:97d46bd73383 | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:97d46bd73383 | 2 | // 三角関数の加法定理を使う二相発振器のクラス |
MikamiUitOpen | 0:97d46bd73383 | 3 | // |
MikamiUitOpen | 0:97d46bd73383 | 4 | // 2017/03/02, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 0:97d46bd73383 | 5 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:97d46bd73383 | 6 | |
MikamiUitOpen | 0:97d46bd73383 | 7 | #include "mbed.h" |
MikamiUitOpen | 0:97d46bd73383 | 8 | #include "FixedFloat.hpp" |
MikamiUitOpen | 0:97d46bd73383 | 9 | |
MikamiUitOpen | 0:97d46bd73383 | 10 | #ifndef QUAD_PHASE_OSC_ADDTHEOREM_FIXED_HPP |
MikamiUitOpen | 0:97d46bd73383 | 11 | #define QUAD_PHASE_OSC_ADDTHEOREM_FIXED_HPP |
MikamiUitOpen | 0:97d46bd73383 | 12 | |
MikamiUitOpen | 0:97d46bd73383 | 13 | class QuadOscAddTheorem |
MikamiUitOpen | 0:97d46bd73383 | 14 | { |
MikamiUitOpen | 0:97d46bd73383 | 15 | public: |
MikamiUitOpen | 0:97d46bd73383 | 16 | // Constructor |
MikamiUitOpen | 0:97d46bd73383 | 17 | QuadOscAddTheorem(float f0, float ts) |
MikamiUitOpen | 0:97d46bd73383 | 18 | : A1_(ToFixed14(cosf(6.283185f*f0*ts*1.0E-6f))), |
MikamiUitOpen | 0:97d46bd73383 | 19 | B1_(ToFixed14(sinf(6.283185f*f0*ts*1.0E-6f))), |
MikamiUitOpen | 0:97d46bd73383 | 20 | xn1_(ToFixed14(1.0f)), yn1_(0) {} |
MikamiUitOpen | 0:97d46bd73383 | 21 | |
MikamiUitOpen | 0:97d46bd73383 | 22 | void Generate(int16_t &yn, int16_t &xn) |
MikamiUitOpen | 0:97d46bd73383 | 23 | { |
MikamiUitOpen | 0:97d46bd73383 | 24 | yn = Round14( A1_*yn1_ + B1_*xn1_); // sin |
MikamiUitOpen | 0:97d46bd73383 | 25 | xn = Round14(-B1_*yn1_ + A1_*xn1_); // cos |
MikamiUitOpen | 0:97d46bd73383 | 26 | |
MikamiUitOpen | 0:97d46bd73383 | 27 | // 振幅の補正 |
MikamiUitOpen | 0:97d46bd73383 | 28 | int16_t c1 = Q14_1p5 - |
MikamiUitOpen | 0:97d46bd73383 | 29 | ((Round14(xn*xn + yn*yn) + 1) >> 1); |
MikamiUitOpen | 0:97d46bd73383 | 30 | xn = Round14(c1*xn); |
MikamiUitOpen | 0:97d46bd73383 | 31 | yn = Round14(c1*yn); |
MikamiUitOpen | 0:97d46bd73383 | 32 | |
MikamiUitOpen | 0:97d46bd73383 | 33 | xn1_ = xn; |
MikamiUitOpen | 0:97d46bd73383 | 34 | yn1_ = yn; |
MikamiUitOpen | 0:97d46bd73383 | 35 | } |
MikamiUitOpen | 0:97d46bd73383 | 36 | |
MikamiUitOpen | 0:97d46bd73383 | 37 | private: |
MikamiUitOpen | 0:97d46bd73383 | 38 | const int16_t A1_, B1_; |
MikamiUitOpen | 0:97d46bd73383 | 39 | static const int16_t Q14_1p5 = 0x6000; // 1.5Q14 |
MikamiUitOpen | 0:97d46bd73383 | 40 | int16_t xn1_, yn1_; |
MikamiUitOpen | 0:97d46bd73383 | 41 | }; |
MikamiUitOpen | 0:97d46bd73383 | 42 | #endif // QUAD_PHASE_OSC_ADDTHEOREM_FIXED_HPP |