Frequency shifter using Weaver modulator for ST Nucleo F401RE.

Dependencies:   UITDSP_ADDA mbed

Committer:
MikamiUitOpen
Date:
Sat Jul 25 07:56:36 2015 +0000
Revision:
0:c17cb8371b55
Child:
1:013f4e5762b1
1

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 0:c17cb8371b55 24 // Weaver 変調器で使う低域通過フィルタ
MikamiUitOpen 0:c17cb8371b55 25 IIR_Cascade<ORDER_> lpfC_(ck_, g0Lpf_);
MikamiUitOpen 0:c17cb8371b55 26 IIR_Cascade<ORDER_> lpfS_(ck_, g0Lpf_);
MikamiUitOpen 0:c17cb8371b55 27
MikamiUitOpen 0:c17cb8371b55 28 // 直流分除去フィルタ
MikamiUitOpen 0:c17cb8371b55 29 Biquad DcCut_(c1_);
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 0:c17cb8371b55 35 lpfC_.Clear();
MikamiUitOpen 0:c17cb8371b55 36 lpfS_.Clear();
MikamiUitOpen 0:c17cb8371b55 37
MikamiUitOpen 0:c17cb8371b55 38 const float PI2 = 3.1415926536f*2;
MikamiUitOpen 0:c17cb8371b55 39 const float FL_ = 200.0f;
MikamiUitOpen 0:c17cb8371b55 40 const float FH_ = 4200.0f;
MikamiUitOpen 0:c17cb8371b55 41 const float FC_ = (FL_ + FH_)/2.0f; // 中心周波数
MikamiUitOpen 0:c17cb8371b55 42 const float DPHI1 = FC_*PI2/FS_; // 中心周波数に対応
MikamiUitOpen 0:c17cb8371b55 43 const float DPHI2 = (-100.0f + FC_)*PI2/FS_; // 中心周波数 - 100 Hz
MikamiUitOpen 0:c17cb8371b55 44
MikamiUitOpen 0:c17cb8371b55 45 float phi1 = 0;
MikamiUitOpen 0:c17cb8371b55 46 float phi2 = 0;
MikamiUitOpen 0:c17cb8371b55 47
MikamiUitOpen 0:c17cb8371b55 48 while (true)
MikamiUitOpen 0:c17cb8371b55 49 {
MikamiUitOpen 0:c17cb8371b55 50 float xn = adc_.Read(); // A5 からの入力信号を読み込む
MikamiUitOpen 0:c17cb8371b55 51 //-----------------------------------------------
MikamiUitOpen 0:c17cb8371b55 52
MikamiUitOpen 0:c17cb8371b55 53 xn = DcCut_.Execute(xn); // DC 成分除去
MikamiUitOpen 0:c17cb8371b55 54
MikamiUitOpen 0:c17cb8371b55 55 float mpyC = xn*cosf(phi1);
MikamiUitOpen 0:c17cb8371b55 56 float mpyS = xn*sinf(phi1);
MikamiUitOpen 0:c17cb8371b55 57
MikamiUitOpen 0:c17cb8371b55 58 // LPF
MikamiUitOpen 0:c17cb8371b55 59 mpyC = lpfC_.Execute(mpyC);
MikamiUitOpen 0:c17cb8371b55 60 mpyS = lpfS_.Execute(mpyS);
MikamiUitOpen 0:c17cb8371b55 61
MikamiUitOpen 0:c17cb8371b55 62 mpyC = mpyC*cosf(phi2);
MikamiUitOpen 0:c17cb8371b55 63 mpyS = mpyS*sinf(phi2);
MikamiUitOpen 0:c17cb8371b55 64
MikamiUitOpen 0:c17cb8371b55 65 float yn = 2.0f*(mpyC + mpyS);
MikamiUitOpen 0:c17cb8371b55 66
MikamiUitOpen 0:c17cb8371b55 67 //-----------------------------------------------
MikamiUitOpen 0:c17cb8371b55 68 if (sw_ == 0) myDac_.Write(xn); // 入力をそのまま DAC へ出力する
MikamiUitOpen 0:c17cb8371b55 69 else myDac_.Write(yn); // 処理した結果を DAC へ出力する
MikamiUitOpen 0:c17cb8371b55 70
MikamiUitOpen 0:c17cb8371b55 71 phi1 = phi1 + DPHI1;
MikamiUitOpen 0:c17cb8371b55 72 if (phi1 > PI2) phi1 = phi1 - PI2;
MikamiUitOpen 0:c17cb8371b55 73 phi2 = phi2 + DPHI2;
MikamiUitOpen 0:c17cb8371b55 74 if (phi2 > PI2) phi2 = phi2 - PI2;
MikamiUitOpen 0:c17cb8371b55 75 }
MikamiUitOpen 0:c17cb8371b55 76 }