Frequency shifter using Weaver modulator for ST Nucleo F401RE.
Dependencies: UITDSP_ADDA mbed
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 }
Generated on Fri Jul 15 2022 17:02:41 by 1.7.2