Dual-phase oscillator using 2nd-order IIR filter.
Dependencies: UITDSP_ADDA mbed
main.cpp@1:60bb239847c3, 2016-02-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Feb 23 00:28:02 2016 +0000
- Revision:
- 1:60bb239847c3
- Parent:
- 0:45f7919cc254
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:45f7919cc254 | 1 | //------------------------------------------------------------------------------ |
MikamiUitOpen | 0:45f7919cc254 | 2 | // cos波,sin波の同時発生,2次の IIR フィルタを使う方法 |
MikamiUitOpen | 0:45f7919cc254 | 3 | // アルゴリズム検証用プログラムのため,無駄な部分あり |
MikamiUitOpen | 1:60bb239847c3 | 4 | // 2016/02/23, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:45f7919cc254 | 5 | //------------------------------------------------------------------------------ |
MikamiUitOpen | 0:45f7919cc254 | 6 | |
MikamiUitOpen | 0:45f7919cc254 | 7 | #include "ADC_BuiltIn.hpp" // かならず必要 |
MikamiUitOpen | 0:45f7919cc254 | 8 | #include "DAC_MCP4922Dual.hpp" // DAC MCP4922,2チャンネル用 |
MikamiUitOpen | 0:45f7919cc254 | 9 | |
MikamiUitOpen | 0:45f7919cc254 | 10 | using namespace Mikami; // かならず必要 |
MikamiUitOpen | 0:45f7919cc254 | 11 | |
MikamiUitOpen | 0:45f7919cc254 | 12 | const int FS_ = 10000; // 標本化周波数: 10 kHz |
MikamiUitOpen | 0:45f7919cc254 | 13 | ADC_BuiltIn adc_(A0, FS_); // A0 からの入力を使うように設定 |
MikamiUitOpen | 0:45f7919cc254 | 14 | DAC_MCP4922Dual myDac_; // DAC を2チャンネルで使うための設定 |
MikamiUitOpen | 0:45f7919cc254 | 15 | |
MikamiUitOpen | 0:45f7919cc254 | 16 | int main() |
MikamiUitOpen | 0:45f7919cc254 | 17 | { |
MikamiUitOpen | 0:45f7919cc254 | 18 | myDac_.ScfClockTim3(420000); // 出力の LPF の遮断周波数を 4.2 kHz に設定 |
MikamiUitOpen | 0:45f7919cc254 | 19 | |
MikamiUitOpen | 0:45f7919cc254 | 20 | const float F0 = 440; // 発生する sin, con の周波数 |
MikamiUitOpen | 0:45f7919cc254 | 21 | const float PI2FT = 6.28319f*F0/(float)FS_; |
MikamiUitOpen | 0:45f7919cc254 | 22 | const float a1 = 2.0f*cosf(PI2FT); |
MikamiUitOpen | 0:45f7919cc254 | 23 | const float b1S = sinf(PI2FT); |
MikamiUitOpen | 0:45f7919cc254 | 24 | const float b1C = cosf(PI2FT); |
MikamiUitOpen | 0:45f7919cc254 | 25 | |
MikamiUitOpen | 0:45f7919cc254 | 26 | float un1 = 0; // u[-1] = 0; |
MikamiUitOpen | 0:45f7919cc254 | 27 | float un2 = 0; // u[-2] = 0; |
MikamiUitOpen | 1:60bb239847c3 | 28 | float xn = 1; // x[n], 単位インパルス |
MikamiUitOpen | 0:45f7919cc254 | 29 | while (true) |
MikamiUitOpen | 0:45f7919cc254 | 30 | { |
MikamiUitOpen | 1:60bb239847c3 | 31 | adc_.Read(); // 標本化クロックと同期をとるために必要 |
MikamiUitOpen | 0:45f7919cc254 | 32 | //----------------------------------------------- |
MikamiUitOpen | 1:60bb239847c3 | 33 | float un = a1*un1 - un2 + xn; |
MikamiUitOpen | 0:45f7919cc254 | 34 | |
MikamiUitOpen | 0:45f7919cc254 | 35 | float ynS = un1*b1S; // sin |
MikamiUitOpen | 0:45f7919cc254 | 36 | float ynC = un - un1*b1C; // cos |
MikamiUitOpen | 0:45f7919cc254 | 37 | |
MikamiUitOpen | 0:45f7919cc254 | 38 | un2 = un1; |
MikamiUitOpen | 0:45f7919cc254 | 39 | un1 = un; |
MikamiUitOpen | 1:60bb239847c3 | 40 | |
MikamiUitOpen | 1:60bb239847c3 | 41 | xn = 0; // 単位インパルスなので次からは 0 |
MikamiUitOpen | 0:45f7919cc254 | 42 | //----------------------------------------------- |
MikamiUitOpen | 0:45f7919cc254 | 43 | myDac_.Write(0.8f*ynS, 0.8f*ynC); // DAC へ出力する |
MikamiUitOpen | 0:45f7919cc254 | 44 | } |
MikamiUitOpen | 0:45f7919cc254 | 45 | } |
MikamiUitOpen | 0:45f7919cc254 | 46 | //------------------------------------------------------------------------------ |