![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Frequency shifter using Weaver modulator for ST Nucleo F401RE.
Dependencies: UITDSP_ADDA mbed
main.cpp@0:c17cb8371b55, 2015-07-25 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat Jul 25 07:56:36 2015 +0000
- Revision:
- 0:c17cb8371b55
- Child:
- 1:013f4e5762b1
1
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 | 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 | } |