不韋 呂
/
CQ_FixedPointSinCos
CQ出版社インターフェース誌の2017年10月号で解説している二相発振器のプログラム
QuadOscIirFixed.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 | // IIR フィルタを利用する二相発振器のクラス |
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_IIR_FIXED_HPP |
MikamiUitOpen | 0:97d46bd73383 | 11 | #define QUAD_PHASE_OSC_IIR_FIXED_HPP |
MikamiUitOpen | 0:97d46bd73383 | 12 | |
MikamiUitOpen | 0:97d46bd73383 | 13 | class QuadOscIIR |
MikamiUitOpen | 0:97d46bd73383 | 14 | { |
MikamiUitOpen | 0:97d46bd73383 | 15 | public: |
MikamiUitOpen | 0:97d46bd73383 | 16 | // Constructor |
MikamiUitOpen | 0:97d46bd73383 | 17 | QuadOscIIR(float f0, float ts) |
MikamiUitOpen | 0:97d46bd73383 | 18 | : A1_(ToFixed14(2.0f*cosf(6.283185f*f0*ts*1.0E-6f))), |
MikamiUitOpen | 0:97d46bd73383 | 19 | B1S_(ToFixed14(sinf(6.283185f*f0*ts*1.0E-6f))), |
MikamiUitOpen | 0:97d46bd73383 | 20 | B1C_(ToFixed14(-cosf(6.283185f*f0*ts*1.0E-6f))), |
MikamiUitOpen | 0:97d46bd73383 | 21 | un1_(ToFixed14(1.0f)), un2_(0) {} |
MikamiUitOpen | 0:97d46bd73383 | 22 | |
MikamiUitOpen | 0:97d46bd73383 | 23 | void Generate(int16_t &sinX, int16_t &cosX) |
MikamiUitOpen | 0:97d46bd73383 | 24 | { |
MikamiUitOpen | 0:97d46bd73383 | 25 | // u[n] = a1*u[n-1] - u[n-2] |
MikamiUitOpen | 0:97d46bd73383 | 26 | int32_t un = Round14(A1_*un1_) - un2_; |
MikamiUitOpen | 0:97d46bd73383 | 27 | |
MikamiUitOpen | 0:97d46bd73383 | 28 | sinX = Round14(B1S_*un1_); |
MikamiUitOpen | 0:97d46bd73383 | 29 | cosX = un + Round14(B1C_*un1_); |
MikamiUitOpen | 0:97d46bd73383 | 30 | |
MikamiUitOpen | 0:97d46bd73383 | 31 | un2_ = un1_; // u[n-2] ← u[n-1] |
MikamiUitOpen | 0:97d46bd73383 | 32 | un1_ = un; // u[n-1] ← u[n] |
MikamiUitOpen | 0:97d46bd73383 | 33 | } |
MikamiUitOpen | 0:97d46bd73383 | 34 | private: |
MikamiUitOpen | 0:97d46bd73383 | 35 | const int16_t A1_, B1S_, B1C_; |
MikamiUitOpen | 0:97d46bd73383 | 36 | int32_t un1_, un2_; |
MikamiUitOpen | 0:97d46bd73383 | 37 | }; |
MikamiUitOpen | 0:97d46bd73383 | 38 | #endif // QUAD_PHASE_OSC_IIR_FIXED_HPP |