The experiment using this program is introduced on "Interface" No.3, CQ publishing Co.,Ltd, 2015. 本プログラムを使った実験は,CQ出版社のインターフェース 2015年3月号で紹介しています.
Dependencies: DSProcessingIO mbed
FreqConv.cpp@2:0b15cd2b79e3, 2014-12-27 (annotated)
- Committer:
- CQpub0Mikami
- Date:
- Sat Dec 27 07:01:43 2014 +0000
- Revision:
- 2:0b15cd2b79e3
- Parent:
- 0:a5a171eda3f8
3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
CQpub0Mikami | 0:a5a171eda3f8 | 1 | //-------------------------------------------------------------- |
CQpub0Mikami | 0:a5a171eda3f8 | 2 | // Frequency converter |
CQpub0Mikami | 0:a5a171eda3f8 | 3 | // Copyright (c) 2014 MIKAMI, Naoki, 2014/06/23 |
CQpub0Mikami | 0:a5a171eda3f8 | 4 | //-------------------------------------------------------------- |
CQpub0Mikami | 0:a5a171eda3f8 | 5 | |
CQpub0Mikami | 0:a5a171eda3f8 | 6 | #include "mbed.h" |
CQpub0Mikami | 0:a5a171eda3f8 | 7 | #include "AdcInternal.hpp" |
CQpub0Mikami | 0:a5a171eda3f8 | 8 | #include "MCP4922Single.hpp" |
CQpub0Mikami | 0:a5a171eda3f8 | 9 | #include "HilbertTransform.hpp" |
CQpub0Mikami | 0:a5a171eda3f8 | 10 | #include "coefsHilbert94.hpp" |
CQpub0Mikami | 0:a5a171eda3f8 | 11 | #include "DC_Cut_Coefficients.hpp" |
CQpub0Mikami | 0:a5a171eda3f8 | 12 | #include "Biquad.hpp" |
CQpub0Mikami | 0:a5a171eda3f8 | 13 | #include "TwoPhaseGenerator.hpp" |
CQpub0Mikami | 0:a5a171eda3f8 | 14 | |
CQpub0Mikami | 0:a5a171eda3f8 | 15 | using namespace Mikami; |
CQpub0Mikami | 0:a5a171eda3f8 | 16 | |
CQpub0Mikami | 0:a5a171eda3f8 | 17 | const float FS_ = 10.0e3f; |
CQpub0Mikami | 0:a5a171eda3f8 | 18 | Adc adc_(A0); |
CQpub0Mikami | 0:a5a171eda3f8 | 19 | Dac dac_(Dac::DAC_A); |
CQpub0Mikami | 0:a5a171eda3f8 | 20 | |
CQpub0Mikami | 0:a5a171eda3f8 | 21 | Ticker timer_; // for timer interrupt |
CQpub0Mikami | 0:a5a171eda3f8 | 22 | |
CQpub0Mikami | 0:a5a171eda3f8 | 23 | Hilbert<ORDER_> ht(hm_); |
CQpub0Mikami | 0:a5a171eda3f8 | 24 | Biquad DcCut(c1_); // DC cut filter |
CQpub0Mikami | 0:a5a171eda3f8 | 25 | TwoPhaseGenerator sinCos_(100.0f, FS_); // 100.0 Hz |
CQpub0Mikami | 0:a5a171eda3f8 | 26 | |
CQpub0Mikami | 0:a5a171eda3f8 | 27 | void TimerIsr() |
CQpub0Mikami | 0:a5a171eda3f8 | 28 | { |
CQpub0Mikami | 0:a5a171eda3f8 | 29 | float yI, yQ, cosx, sinx; |
CQpub0Mikami | 0:a5a171eda3f8 | 30 | |
CQpub0Mikami | 0:a5a171eda3f8 | 31 | float xn = adc_.Read(); // input |
CQpub0Mikami | 0:a5a171eda3f8 | 32 | |
CQpub0Mikami | 0:a5a171eda3f8 | 33 | xn = DcCut.Execute(g0_*xn); // DC cut |
CQpub0Mikami | 0:a5a171eda3f8 | 34 | ht.Execute(xn, yI, yQ); // Hilbert transform |
CQpub0Mikami | 0:a5a171eda3f8 | 35 | sinCos_.Generate(cosx, sinx); // cos and sin generator |
CQpub0Mikami | 0:a5a171eda3f8 | 36 | float yn = yI*cosx - yQ*sinx; // conversion |
CQpub0Mikami | 0:a5a171eda3f8 | 37 | |
CQpub0Mikami | 0:a5a171eda3f8 | 38 | dac_.Write(yn); // output |
CQpub0Mikami | 0:a5a171eda3f8 | 39 | } |
CQpub0Mikami | 0:a5a171eda3f8 | 40 | |
CQpub0Mikami | 0:a5a171eda3f8 | 41 | int main() |
CQpub0Mikami | 0:a5a171eda3f8 | 42 | { |
CQpub0Mikami | 0:a5a171eda3f8 | 43 | timer_.attach_us(&TimerIsr, 1.0e6f/FS_); |
CQpub0Mikami | 0:a5a171eda3f8 | 44 | while (true) {} // infinite loop |
CQpub0Mikami | 0:a5a171eda3f8 | 45 | } |
CQpub0Mikami | 0:a5a171eda3f8 | 46 |