Frequency shifter using Weaver modulator for ST Nucleo F401RE.
Dependencies: UITDSP_ADDA mbed
Diff: main.cpp
- 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; + } +}