Frequency shifter using Weaver modulator for ST Nucleo F401RE.

Dependencies:   UITDSP_ADDA mbed

Committer:
MikamiUitOpen
Date:
Sat Jul 25 09:03:13 2015 +0000
Revision:
1:013f4e5762b1
Parent:
0:c17cb8371b55
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:c17cb8371b55 1 //------------------------------------------------------------------------------
MikamiUitOpen 0:c17cb8371b55 2 // Weaver 変調器を使う周波数シフタ
MikamiUitOpen 0:c17cb8371b55 3 //
MikamiUitOpen 0:c17cb8371b55 4 // 200 Hz ~ 4.2 kHz の範囲の成分の周波数を 100 Hz 低い方へシフトする
MikamiUitOpen 0:c17cb8371b55 5 //
MikamiUitOpen 0:c17cb8371b55 6 // SW:0 No shift, SW:1 Shift to lower
MikamiUitOpen 0:c17cb8371b55 7 //
MikamiUitOpen 0:c17cb8371b55 8 // 2015/07/25, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 0:c17cb8371b55 9 //------------------------------------------------------------------------------
MikamiUitOpen 0:c17cb8371b55 10
MikamiUitOpen 0:c17cb8371b55 11 #include "ADC_BuiltIn.hpp" // かならず必要
MikamiUitOpen 0:c17cb8371b55 12 #include "DAC_MCP4922.hpp"
MikamiUitOpen 0:c17cb8371b55 13
MikamiUitOpen 0:c17cb8371b55 14 #include "IIR_Cascade.hpp"
MikamiUitOpen 0:c17cb8371b55 15 #include "Coefficients.hpp" // Coeffisients of LPF and DC-cut filter
MikamiUitOpen 0:c17cb8371b55 16
MikamiUitOpen 0:c17cb8371b55 17 using namespace Mikami; // かならず必要
MikamiUitOpen 0:c17cb8371b55 18
MikamiUitOpen 0:c17cb8371b55 19 const int FS_ = 10000; // 標本化周波数: 10 kHz
MikamiUitOpen 0:c17cb8371b55 20 ADC_BuiltIn adc_(A0, FS_); // A5 からの入力を使うように設定
MikamiUitOpen 0:c17cb8371b55 21 DAC_MCP4922 myDac_; // DAC を使うための設定
MikamiUitOpen 0:c17cb8371b55 22 DigitalIn sw_(D2, PullDown); // ロータリ・ディップ・スイッチ用
MikamiUitOpen 0:c17cb8371b55 23
MikamiUitOpen 1:013f4e5762b1 24 // 入力帯域制限用帯域通過フィルタ
MikamiUitOpen 1:013f4e5762b1 25 IIR_Cascade<ORDER_BPF_> bpf_(ckBP_, g0Bpf_);
MikamiUitOpen 1:013f4e5762b1 26
MikamiUitOpen 0:c17cb8371b55 27 // Weaver 変調器で使う低域通過フィルタ
MikamiUitOpen 1:013f4e5762b1 28 IIR_Cascade<ORDER_LPF_> lpfC_(ckLP_, g0Lpf_);
MikamiUitOpen 1:013f4e5762b1 29 IIR_Cascade<ORDER_LPF_> lpfS_(ckLP_, g0Lpf_);
MikamiUitOpen 0:c17cb8371b55 30
MikamiUitOpen 0:c17cb8371b55 31 int main()
MikamiUitOpen 0:c17cb8371b55 32 {
MikamiUitOpen 0:c17cb8371b55 33 myDac_.ScfClockTim3(420000); // 出力の LPF の遮断周波数を 4.2 kHz に設定
MikamiUitOpen 0:c17cb8371b55 34
MikamiUitOpen 1:013f4e5762b1 35 bpf_.Clear();
MikamiUitOpen 0:c17cb8371b55 36 lpfC_.Clear();
MikamiUitOpen 0:c17cb8371b55 37 lpfS_.Clear();
MikamiUitOpen 0:c17cb8371b55 38
MikamiUitOpen 0:c17cb8371b55 39 const float PI2 = 3.1415926536f*2;
MikamiUitOpen 0:c17cb8371b55 40 const float FL_ = 200.0f;
MikamiUitOpen 0:c17cb8371b55 41 const float FH_ = 4200.0f;
MikamiUitOpen 0:c17cb8371b55 42 const float FC_ = (FL_ + FH_)/2.0f; // 中心周波数
MikamiUitOpen 0:c17cb8371b55 43 const float DPHI1 = FC_*PI2/FS_; // 中心周波数に対応
MikamiUitOpen 0:c17cb8371b55 44 const float DPHI2 = (-100.0f + FC_)*PI2/FS_; // 中心周波数 - 100 Hz
MikamiUitOpen 0:c17cb8371b55 45
MikamiUitOpen 0:c17cb8371b55 46 float phi1 = 0;
MikamiUitOpen 0:c17cb8371b55 47 float phi2 = 0;
MikamiUitOpen 0:c17cb8371b55 48
MikamiUitOpen 0:c17cb8371b55 49 while (true)
MikamiUitOpen 0:c17cb8371b55 50 {
MikamiUitOpen 0:c17cb8371b55 51 float xn = adc_.Read(); // A5 からの入力信号を読み込む
MikamiUitOpen 0:c17cb8371b55 52 //-----------------------------------------------
MikamiUitOpen 0:c17cb8371b55 53
MikamiUitOpen 1:013f4e5762b1 54 xn = bpf_.Execute(xn); // 帯域制限
MikamiUitOpen 0:c17cb8371b55 55
MikamiUitOpen 0:c17cb8371b55 56 float mpyC = xn*cosf(phi1);
MikamiUitOpen 0:c17cb8371b55 57 float mpyS = xn*sinf(phi1);
MikamiUitOpen 0:c17cb8371b55 58
MikamiUitOpen 0:c17cb8371b55 59 // LPF
MikamiUitOpen 0:c17cb8371b55 60 mpyC = lpfC_.Execute(mpyC);
MikamiUitOpen 0:c17cb8371b55 61 mpyS = lpfS_.Execute(mpyS);
MikamiUitOpen 0:c17cb8371b55 62
MikamiUitOpen 0:c17cb8371b55 63 mpyC = mpyC*cosf(phi2);
MikamiUitOpen 0:c17cb8371b55 64 mpyS = mpyS*sinf(phi2);
MikamiUitOpen 0:c17cb8371b55 65
MikamiUitOpen 0:c17cb8371b55 66 float yn = 2.0f*(mpyC + mpyS);
MikamiUitOpen 0:c17cb8371b55 67
MikamiUitOpen 0:c17cb8371b55 68 //-----------------------------------------------
MikamiUitOpen 0:c17cb8371b55 69 if (sw_ == 0) myDac_.Write(xn); // 入力をそのまま DAC へ出力する
MikamiUitOpen 0:c17cb8371b55 70 else myDac_.Write(yn); // 処理した結果を DAC へ出力する
MikamiUitOpen 0:c17cb8371b55 71
MikamiUitOpen 0:c17cb8371b55 72 phi1 = phi1 + DPHI1;
MikamiUitOpen 0:c17cb8371b55 73 if (phi1 > PI2) phi1 = phi1 - PI2;
MikamiUitOpen 0:c17cb8371b55 74 phi2 = phi2 + DPHI2;
MikamiUitOpen 0:c17cb8371b55 75 if (phi2 > PI2) phi2 = phi2 - PI2;
MikamiUitOpen 0:c17cb8371b55 76 }
MikamiUitOpen 0:c17cb8371b55 77 }