不韋 呂
/
SDR_AM_Rx_CIC
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
SDR_Library/QuadOscIir.hpp@1:30d9fb51dec1, 2019-09-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Sep 23 07:32:10 2019 +0000
- Revision:
- 1:30d9fb51dec1
- Parent:
- 0:6906f8616429
- Child:
- 2:4bec6b2be809
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:6906f8616429 | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:6906f8616429 | 2 | // IIR フィルタを利用する二相発振器のクラス |
MikamiUitOpen | 0:6906f8616429 | 3 | // |
MikamiUitOpen | 0:6906f8616429 | 4 | // 2019/04/11, Copyright (c) 2019 MIKAMI, Naoki |
MikamiUitOpen | 0:6906f8616429 | 5 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:6906f8616429 | 6 | |
MikamiUitOpen | 0:6906f8616429 | 7 | #include "mbed.h" |
MikamiUitOpen | 0:6906f8616429 | 8 | |
MikamiUitOpen | 0:6906f8616429 | 9 | #ifndef QUAD_PHASE_OSC_IIR_HPP |
MikamiUitOpen | 0:6906f8616429 | 10 | #define QUAD_PHASE_OSC_IIR_HPP |
MikamiUitOpen | 0:6906f8616429 | 11 | |
MikamiUitOpen | 0:6906f8616429 | 12 | namespace Mikami |
MikamiUitOpen | 0:6906f8616429 | 13 | { |
MikamiUitOpen | 0:6906f8616429 | 14 | class QuadOscIir |
MikamiUitOpen | 0:6906f8616429 | 15 | { |
MikamiUitOpen | 0:6906f8616429 | 16 | public: |
MikamiUitOpen | 0:6906f8616429 | 17 | // コンストラクタ |
MikamiUitOpen | 0:6906f8616429 | 18 | // f0: 周波数,単位:Hz |
MikamiUitOpen | 0:6906f8616429 | 19 | // ts: 標本化間隔,単位:μs |
MikamiUitOpen | 0:6906f8616429 | 20 | // amp: 振幅 |
MikamiUitOpen | 0:6906f8616429 | 21 | QuadOscIir(float f0, float ts, float amp = 1) |
MikamiUitOpen | 0:6906f8616429 | 22 | : TS_(ts*1.0E-6f), A0_(amp) { Set(f0); } |
MikamiUitOpen | 0:6906f8616429 | 23 | |
MikamiUitOpen | 0:6906f8616429 | 24 | // sin/cos 発生,実行時間の実測値:91 ns |
MikamiUitOpen | 0:6906f8616429 | 25 | void Generate(float &sinX, float &cosX) |
MikamiUitOpen | 0:6906f8616429 | 26 | { |
MikamiUitOpen | 0:6906f8616429 | 27 | RecursivePart(); |
MikamiUitOpen | 0:6906f8616429 | 28 | sinX = b1S_*un2_; |
MikamiUitOpen | 0:6906f8616429 | 29 | cosX = A0_*un1_ + b1C_*un2_; |
MikamiUitOpen | 0:6906f8616429 | 30 | } |
MikamiUitOpen | 0:6906f8616429 | 31 | |
MikamiUitOpen | 0:6906f8616429 | 32 | // sin 発生,実行時間の実測値:69 ns |
MikamiUitOpen | 0:6906f8616429 | 33 | float GenerateSin() |
MikamiUitOpen | 0:6906f8616429 | 34 | { |
MikamiUitOpen | 0:6906f8616429 | 35 | RecursivePart(); |
MikamiUitOpen | 0:6906f8616429 | 36 | return b1S_*un2_; |
MikamiUitOpen | 0:6906f8616429 | 37 | } |
MikamiUitOpen | 0:6906f8616429 | 38 | |
MikamiUitOpen | 0:6906f8616429 | 39 | // cis 発生,実行時間の実測値:80 ns |
MikamiUitOpen | 0:6906f8616429 | 40 | float GenerateCos() |
MikamiUitOpen | 0:6906f8616429 | 41 | { |
MikamiUitOpen | 0:6906f8616429 | 42 | RecursivePart(); |
MikamiUitOpen | 0:6906f8616429 | 43 | return A0_*un1_ + b1C_*un2_; |
MikamiUitOpen | 0:6906f8616429 | 44 | } |
MikamiUitOpen | 0:6906f8616429 | 45 | |
MikamiUitOpen | 0:6906f8616429 | 46 | // 出力周波数の設定,周波数を変更し再スタートする場合も使える |
MikamiUitOpen | 0:6906f8616429 | 47 | // f0:周波数,単位:Hz |
MikamiUitOpen | 0:6906f8616429 | 48 | void Set(float f0) |
MikamiUitOpen | 0:6906f8616429 | 49 | { |
MikamiUitOpen | 0:6906f8616429 | 50 | static const float pi2 = 6.283185f; |
MikamiUitOpen | 0:6906f8616429 | 51 | a1_ = 2.0f*cosf(pi2*f0*TS_); |
MikamiUitOpen | 0:6906f8616429 | 52 | b1S_ = A0_*sinf(pi2*f0*TS_); |
MikamiUitOpen | 0:6906f8616429 | 53 | b1C_ = -A0_*cosf(pi2*f0*TS_); |
MikamiUitOpen | 0:6906f8616429 | 54 | un1_ = 1.0f; |
MikamiUitOpen | 0:6906f8616429 | 55 | un2_ = 0.0f; |
MikamiUitOpen | 0:6906f8616429 | 56 | } |
MikamiUitOpen | 0:6906f8616429 | 57 | |
MikamiUitOpen | 0:6906f8616429 | 58 | private: |
MikamiUitOpen | 0:6906f8616429 | 59 | const float TS_; // 標本化間隔 |
MikamiUitOpen | 0:6906f8616429 | 60 | const float A0_; // 振幅 |
MikamiUitOpen | 0:6906f8616429 | 61 | float a1_, b1S_, b1C_; |
MikamiUitOpen | 0:6906f8616429 | 62 | float un1_, un2_; |
MikamiUitOpen | 0:6906f8616429 | 63 | |
MikamiUitOpen | 0:6906f8616429 | 64 | // u[n] = a1*u[n-1] - u[n-2] の計算 |
MikamiUitOpen | 0:6906f8616429 | 65 | void RecursivePart() |
MikamiUitOpen | 0:6906f8616429 | 66 | { |
MikamiUitOpen | 0:6906f8616429 | 67 | float un = a1_*un1_ - un2_; |
MikamiUitOpen | 0:6906f8616429 | 68 | un2_ = un1_; // u[n-2] ← u[n-1] |
MikamiUitOpen | 0:6906f8616429 | 69 | un1_ = un; // u[n-1] ← u[n] |
MikamiUitOpen | 0:6906f8616429 | 70 | } |
MikamiUitOpen | 0:6906f8616429 | 71 | }; |
MikamiUitOpen | 0:6906f8616429 | 72 | } |
MikamiUitOpen | 0:6906f8616429 | 73 | #endif // QUAD_PHASE_OSC_IIR_HPP |