AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載

Dependencies:   mbed

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?

UserRevisionLine numberNew 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