Demo program of digital signal processing: Variable LPF/HPF, Vocal canceller, Pitch shifter, Reverbrator. ディジタル信号処理のデモプログラム. 遮断周波数可変 LPF/HPF,ボーカルキャンセラ,ピッチシフタ,残響生成器.

Dependencies:   Array_Matrix F446_AD_DA UIT_AQM1602 mbed

Revision:
0:fa74b1130cc3
Child:
5:503bd366fd73
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SignalProcessing/WeaverModulator.hpp	Sun Jan 29 09:11:30 2017 +0000
@@ -0,0 +1,79 @@
+//--------------------------------------------------------------
+//  Weaver 変調器
+//      入力信号の帯域:             0.1 kHz ---- 9.9 kHz
+//      帯域中央の周波数:           5.0 kHz
+//      低域通過フィルタの遮断周波数: 4.9 kHz
+
+// 2017/01/28, Copyright (c) 2017 MIKAMI, Naoki
+//--------------------------------------------------------------
+
+#ifndef WEAVER_MODULATOR_HPP
+#define WEAVER_MODULATOR_HPP
+
+#include "IIR_Cascade.hpp"
+#include "Coefficients.hpp"  // Coeffisients of LPF and DC-cut filter
+#include "Array.hpp"
+using namespace Mikami;
+
+class FrqShifter : public SignalProcessing
+{
+public:
+    FrqShifter(float fS)
+        : lpfC_(WEAVER_ORDER_, weaver_g0Lpf_, weaver_ck_),
+          lpfS_(WEAVER_ORDER_, weaver_g0Lpf_, weaver_ck_),
+          dcCut_(weaver_c1_),
+          FS_(fS), PI2_(3.1415926536f*2), F_B_(5000)
+    {
+        lpfC_.Clear();
+        lpfS_.Clear();
+
+        dPhi1_ = F_B_*PI2_/FS_;
+        dPhi2_ = dPhi1_;
+        phi1_ = 0;
+        phi2_ = 0;
+    }
+    
+    virtual float Execute(float xn1, float xn2)
+    {
+        float xn = (xn1 + xn2)*0.5f;
+        xn = dcCut_.Execute(weaver_g0_*xn); // DC 成分除去
+    
+        float mpyC = xn*cosf(phi1_);
+        float mpyS = xn*sinf(phi1_);
+    
+        // LPF
+        float mpyC_Lpf = lpfC_.Execute(mpyC);
+        float mpyS_Lpf = lpfS_.Execute(mpyS);
+    
+        float mpyC_C = mpyC_Lpf*cosf(phi2_);
+        float mpyS_S = mpyS_Lpf*sinf(phi2_);
+    
+        float yn = 2.0f*(mpyC_C + mpyS_S);
+
+        phi1_ = phi1_ + dPhi1_;
+        if (phi1_ > PI2_) phi1_ = phi1_ - PI2_;
+        phi2_ = phi2_ + dPhi2_;
+        if (phi2_ > PI2_) phi2_ = phi2_ - PI2_;
+
+        return yn;   
+    }
+    
+    // 周波数のシフト量を設定
+    void SetFrequensy(float fShift)
+    {   dPhi2_ = (fShift + F_B_)*PI2_/FS_; }
+
+private:
+    // Weaver 変調器で使う低域通過フィルタ 
+    IirCascade lpfC_;
+    IirCascade lpfS_;
+    // 直流分除去フィルタ
+    Biquad dcCut_;
+    
+    const float FS_;
+    const float PI2_;
+    const float F_B_;      // 中心周波数
+    
+    float phi1_, dPhi1_;
+    float phi2_, dPhi2_;
+};
+#endif  // WEAVER_MODULATOR_HPP