![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Dual-phase oscillator using 2nd-order IIR filter.
Dependencies: UITDSP_ADDA mbed
main.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2016-02-23
- Revision:
- 1:60bb239847c3
- Parent:
- 0:45f7919cc254
File content as of revision 1:60bb239847c3:
//------------------------------------------------------------------------------ // cos波,sin波の同時発生,2次の IIR フィルタを使う方法 // アルゴリズム検証用プログラムのため,無駄な部分あり // 2016/02/23, Copyright (c) 2016 MIKAMI, Naoki //------------------------------------------------------------------------------ #include "ADC_BuiltIn.hpp" // かならず必要 #include "DAC_MCP4922Dual.hpp" // DAC MCP4922,2チャンネル用 using namespace Mikami; // かならず必要 const int FS_ = 10000; // 標本化周波数: 10 kHz ADC_BuiltIn adc_(A0, FS_); // A0 からの入力を使うように設定 DAC_MCP4922Dual myDac_; // DAC を2チャンネルで使うための設定 int main() { myDac_.ScfClockTim3(420000); // 出力の LPF の遮断周波数を 4.2 kHz に設定 const float F0 = 440; // 発生する sin, con の周波数 const float PI2FT = 6.28319f*F0/(float)FS_; const float a1 = 2.0f*cosf(PI2FT); const float b1S = sinf(PI2FT); const float b1C = cosf(PI2FT); float un1 = 0; // u[-1] = 0; float un2 = 0; // u[-2] = 0; float xn = 1; // x[n], 単位インパルス while (true) { adc_.Read(); // 標本化クロックと同期をとるために必要 //----------------------------------------------- float un = a1*un1 - un2 + xn; float ynS = un1*b1S; // sin float ynC = un - un1*b1C; // cos un2 = un1; un1 = un; xn = 0; // 単位インパルスなので次からは 0 //----------------------------------------------- myDac_.Write(0.8f*ynS, 0.8f*ynC); // DAC へ出力する } } //------------------------------------------------------------------------------