不韋 呂 / F746_MySoundMachine

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WeaverModulator.hpp Source File

WeaverModulator.hpp

00001 //--------------------------------------------------------------
00002 //  Weaver 変調器
00003 //      入力信号の帯域:             0.1 kHz ---- 6.9 kHz
00004 //      帯域中央の周波数:           3.5 kHz
00005 //      低域通過フィルタの遮断周波数: 3.4 kHz
00006 //
00007 //  2017/04/10, Copyright (c) 2016 MIKAMI, Naoki
00008 //--------------------------------------------------------------
00009 
00010 #ifndef WEAVER_MODULATOR_HPP
00011 #define WEAVER_MODULATOR_HPP
00012 
00013 #include "ProcessingBase.hpp"
00014 #include "IIR_Cascade.hpp"
00015 #include "Coefficients.hpp"  // Coeffisients of BPF and LPF
00016 
00017 namespace Mikami
00018 {
00019     class WeaverMod : public ProcessingBase
00020     {
00021     public:
00022         WeaverMod(float fS, float fShift = 0)
00023             : bpf_(ORDER_BPF_, ckBpf_, g0Bpf_),
00024               lpfC_(ORDER_, ck_, g0Lpf_), lpfS_(ORDER_, ck_, g0Lpf_),
00025               FS_(fS), PI2_(3.1415926536f*2), F_B0_(3500),
00026               phi1_(0), dPhi1_(F_B0_*PI2_/FS_), phi2_(0)
00027         {   SetFrequency(fShift); }
00028 
00029         virtual float Execute(float xn)
00030         {
00031             float un = bpf_.Execute(xn);    // 帯域通過フィルタ(BPF)
00032 
00033             float mpyC = un*cosf(phi1_);
00034             float mpyS = un*sinf(phi1_);
00035 
00036             // 低域通過フィルタ(LPF)
00037             float mpyC_Lpf = lpfC_.Execute(mpyC);
00038             float mpyS_Lpf = lpfS_.Execute(mpyS);
00039 
00040             float mpyC_C = mpyC_Lpf*cosf(phi2_);
00041             float mpyS_S = mpyS_Lpf*sinf(phi2_);
00042 
00043             float yn = 2.0f*(mpyC_C + mpyS_S);
00044 
00045             phi1_ = phi1_ + dPhi1_;
00046             if (phi1_ > PI2_) phi1_ = phi1_ - PI2_;
00047             phi2_ = phi2_ + dPhi2_;
00048             if (phi2_ > PI2_) phi2_ = phi2_ - PI2_;
00049 
00050             return yn;
00051         }
00052 
00053         // 周波数のシフト量を設定
00054         void SetFrequency(float fShift)
00055         {   dPhi2_ = (fShift + F_B0_)*PI2_/FS_; }
00056 
00057     private:
00058         // 帯域通過フィルタ
00059         IIR_Cascade bpf_;
00060         // Weaver 変調器で使う低域通過フィルタ 
00061         IIR_Cascade lpfC_, lpfS_;
00062 
00063         const float FS_;
00064         const float PI2_;
00065         const float F_B0_;  // 中心周波数
00066 
00067         float phi1_, dPhi1_;
00068         float phi2_, dPhi2_;
00069 
00070         // disallow copy constructor and assignment operator
00071         WeaverMod(const WeaverMod& );
00072         WeaverMod& operator=(const WeaverMod& );
00073     };
00074 }
00075 #endif  // WEAVER_MODULATOR_HPP