Dual-phase oscillator using 2nd-order IIR filter.

Dependencies:   UITDSP_ADDA mbed

Committer:
MikamiUitOpen
Date:
Tue Feb 23 00:28:02 2016 +0000
Revision:
1:60bb239847c3
Parent:
0:45f7919cc254
2

Who changed what in which revision?

UserRevisionLine numberNew 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 //------------------------------------------------------------------------------