Frequency shifter using Weaver modulator for ST Nucleo F401RE.
Dependencies: UITDSP_ADDA mbed
main.cpp@1:013f4e5762b1, 2015-07-25 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat Jul 25 09:03:13 2015 +0000
- Revision:
- 1:013f4e5762b1
- Parent:
- 0:c17cb8371b55
2
Who changed what in which revision?
User | Revision | Line number | New 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 | } |