Frequency shifter using Weaver modulator for ST Nucleo F401RE.

Dependencies:   UITDSP_ADDA mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //------------------------------------------------------------------------------
00002 //  Weaver 変調器を使う周波数シフタ
00003 //
00004 //  200 Hz ~ 4.2 kHz の範囲の成分の周波数を 100 Hz 低い方へシフトする
00005 //
00006 //  SW:0 No shift, SW:1 Shift to lower
00007 //
00008 //  2015/07/25, Copyright (c) 2015 MIKAMI, Naoki
00009 //------------------------------------------------------------------------------
00010 
00011 #include "ADC_BuiltIn.hpp"      // かならず必要 
00012 #include "DAC_MCP4922.hpp"
00013 
00014 #include "IIR_Cascade.hpp"
00015 #include "Coefficients.hpp"  // Coeffisients of LPF and DC-cut filter
00016 
00017 using namespace Mikami;         // かならず必要 
00018 
00019 const int FS_ = 10000;          // 標本化周波数: 10 kHz
00020 ADC_BuiltIn adc_(A0, FS_);      // A5 からの入力を使うように設定
00021 DAC_MCP4922 myDac_;             // DAC を使うための設定
00022 DigitalIn sw_(D2, PullDown);    // ロータリ・ディップ・スイッチ用
00023 
00024 // 入力帯域制限用帯域通過フィルタ
00025 IIR_Cascade<ORDER_BPF_> bpf_(ckBP_, g0Bpf_);
00026 
00027 // Weaver 変調器で使う低域通過フィルタ 
00028 IIR_Cascade<ORDER_LPF_> lpfC_(ckLP_, g0Lpf_);
00029 IIR_Cascade<ORDER_LPF_> lpfS_(ckLP_, g0Lpf_);
00030 
00031 int main()
00032 {
00033     myDac_.ScfClockTim3(420000);    // 出力の LPF の遮断周波数を 4.2 kHz に設定
00034 
00035     bpf_.Clear();
00036     lpfC_.Clear();
00037     lpfS_.Clear();
00038 
00039     const float PI2 = 3.1415926536f*2;
00040     const float FL_ = 200.0f;
00041     const float FH_ = 4200.0f;
00042     const float FC_ = (FL_ + FH_)/2.0f;             // 中心周波数
00043     const float DPHI1 = FC_*PI2/FS_;                // 中心周波数に対応
00044     const float DPHI2 = (-100.0f + FC_)*PI2/FS_;    // 中心周波数 - 100 Hz
00045 
00046     float phi1 = 0;
00047     float phi2 = 0;
00048     
00049     while (true)
00050     {
00051         float xn = adc_.Read();     // A5 からの入力信号を読み込む
00052         //-----------------------------------------------
00053 
00054         xn = bpf_.Execute(xn);    // 帯域制限
00055         
00056         float mpyC = xn*cosf(phi1);
00057         float mpyS = xn*sinf(phi1);
00058         
00059         // LPF
00060         mpyC = lpfC_.Execute(mpyC);
00061         mpyS = lpfS_.Execute(mpyS);
00062         
00063         mpyC = mpyC*cosf(phi2);
00064         mpyS = mpyS*sinf(phi2);
00065         
00066         float yn = 2.0f*(mpyC + mpyS);
00067         
00068         //-----------------------------------------------
00069         if (sw_ == 0) myDac_.Write(xn);    // 入力をそのまま DAC へ出力する
00070         else          myDac_.Write(yn);    // 処理した結果を DAC へ出力する
00071         
00072         phi1 = phi1 + DPHI1;
00073         if (phi1 > PI2) phi1 = phi1 - PI2;
00074         phi2 = phi2 + DPHI2;
00075         if (phi2 > PI2) phi2 = phi2 - PI2;
00076     }
00077 }