Frequency shifter using Weaver modulator for ST Nucleo F401RE.

Dependencies:   UITDSP_ADDA mbed

Revision:
0:c17cb8371b55
Child:
1:013f4e5762b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jul 25 07:56:36 2015 +0000
@@ -0,0 +1,76 @@
+//------------------------------------------------------------------------------
+//  Weaver 変調器を使う周波数シフタ
+//
+//  200 Hz ~ 4.2 kHz の範囲の成分の周波数を 100 Hz 低い方へシフトする
+//
+//  SW:0 No shift, SW:1 Shift to lower
+//
+//  2015/07/25, Copyright (c) 2015 MIKAMI, Naoki
+//------------------------------------------------------------------------------
+
+#include "ADC_BuiltIn.hpp"      // かならず必要 
+#include "DAC_MCP4922.hpp"
+
+#include "IIR_Cascade.hpp"
+#include "Coefficients.hpp"  // Coeffisients of LPF and DC-cut filter
+
+using namespace Mikami;         // かならず必要 
+
+const int FS_ = 10000;          // 標本化周波数: 10 kHz
+ADC_BuiltIn adc_(A0, FS_);      // A5 からの入力を使うように設定
+DAC_MCP4922 myDac_;             // DAC を使うための設定
+DigitalIn sw_(D2, PullDown);    // ロータリ・ディップ・スイッチ用
+
+// Weaver 変調器で使う低域通過フィルタ 
+IIR_Cascade<ORDER_> lpfC_(ck_, g0Lpf_);
+IIR_Cascade<ORDER_> lpfS_(ck_, g0Lpf_);
+
+// 直流分除去フィルタ
+Biquad DcCut_(c1_);
+
+int main()
+{
+    myDac_.ScfClockTim3(420000);    // 出力の LPF の遮断周波数を 4.2 kHz に設定
+
+    lpfC_.Clear();
+    lpfS_.Clear();
+
+    const float PI2 = 3.1415926536f*2;
+    const float FL_ = 200.0f;
+    const float FH_ = 4200.0f;
+    const float FC_ = (FL_ + FH_)/2.0f;             // 中心周波数
+    const float DPHI1 = FC_*PI2/FS_;                // 中心周波数に対応
+    const float DPHI2 = (-100.0f + FC_)*PI2/FS_;    // 中心周波数 - 100 Hz
+
+    float phi1 = 0;
+    float phi2 = 0;
+    
+    while (true)
+    {
+        float xn = adc_.Read();     // A5 からの入力信号を読み込む
+        //-----------------------------------------------
+
+        xn = DcCut_.Execute(xn);    // DC 成分除去
+        
+        float mpyC = xn*cosf(phi1);
+        float mpyS = xn*sinf(phi1);
+        
+        // LPF
+        mpyC = lpfC_.Execute(mpyC);
+        mpyS = lpfS_.Execute(mpyS);
+        
+        mpyC = mpyC*cosf(phi2);
+        mpyS = mpyS*sinf(phi2);
+        
+        float yn = 2.0f*(mpyC + mpyS);
+        
+        //-----------------------------------------------
+        if (sw_ == 0) myDac_.Write(xn);    // 入力をそのまま DAC へ出力する
+        else          myDac_.Write(yn);    // 処理した結果を DAC へ出力する
+        
+        phi1 = phi1 + DPHI1;
+        if (phi1 > PI2) phi1 = phi1 - PI2;
+        phi2 = phi2 + DPHI2;
+        if (phi2 > PI2) phi2 = phi2 - PI2;
+    }
+}