不韋 呂
/
SDR_AM_Rx_CIC
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
Embed:
(wiki syntax)
Show/hide line numbers
QuadOscIir.hpp
00001 //-------------------------------------------------------------- 00002 // IIR フィルタを利用する直交信号発生器のクラス 00003 // 00004 // 2020/07/30, Copyright (c) 2020 MIKAMI, Naoki 00005 //-------------------------------------------------------------- 00006 00007 #include "mbed.h" 00008 00009 #ifndef QUAD_PHASE_OSC_IIR_HPP 00010 #define QUAD_PHASE_OSC_IIR_HPP 00011 00012 namespace Mikami 00013 { 00014 class QuadOscIir 00015 { 00016 public: 00017 // コンストラクタ 00018 // f0 周波数,単位:Hz 00019 // ts 標本化間隔,単位:μs 00020 // amp 振幅 00021 QuadOscIir(float f0, float ts, float amp = 1) 00022 : TS_(ts*1.0E-6f), A0_(amp) { Set(f0); } 00023 00024 // sin/cos 発生 00025 void Generate(float &sinX, float &cosX) 00026 { 00027 float vn = a1_*vn1_ - vn2_; 00028 sinX = b1S_*vn1_; 00029 cosX = A0_*vn + b1C_*vn1_; 00030 00031 vn2_ = vn1_; // v[n-2] ← v[n-1] 00032 vn1_ = vn; // v[n-1] ← v[n] 00033 } 00034 00035 // 出力周波数の設定,周波数を変更し再スタートする場合も使える 00036 // f0:周波数,単位:Hz 00037 void Set(float f0) 00038 { 00039 static const float PI2 = 6.283185f; 00040 a1_ = 2.0f*cosf(PI2*f0*TS_); 00041 b1S_ = A0_*sinf(PI2*f0*TS_); 00042 b1C_ = -A0_*cosf(PI2*f0*TS_); 00043 vn1_ = 1.0f; 00044 vn2_ = 0.0f; 00045 } 00046 00047 private: 00048 const float TS_; // 標本化間隔 00049 const float A0_; // 振幅 00050 float a1_, b1S_, b1C_; 00051 float vn1_, vn2_; 00052 00053 // コピー・コンストラクタ,代入演算子の禁止のため 00054 QuadOscIir(const QuadOscIir&); 00055 QuadOscIir& operator=(const QuadOscIir&); 00056 }; 00057 } 00058 #endif // QUAD_PHASE_OSC_IIR_HPP
Generated on Fri Jul 22 2022 13:23:29 by 1.7.2