Nucleo-F446RE 内蔵の AD/DA を使うためのライブラリ.DA からの出力は,標本化周波数の4倍のレートで行う. このライブラリを登録した際のプログラム: Demo_F446_AD_DA_Multirate. Library for built-in ADC and DAC in Nucleo-F446RE. Sampling rate for DAC is four times of that for ADC.
Dependents: F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver Demo_F446_AD_DA_Multirate ... more
F446_Multirate.hpp@7:6275fe158ae8, 2018-10-11 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Oct 11 11:42:48 2018 +0000
- Revision:
- 7:6275fe158ae8
- Parent:
- 6:a14d7f0bc3f5
8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 5:4800dd3838d6 | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 2 | // 出力を 4 倍にアップサンプリングするクラス(ヘッダ) |
MikamiUitOpen | 0:2447a7d225b1 | 3 | // Nucleo-F446RE 専用 |
MikamiUitOpen | 5:4800dd3838d6 | 4 | // 補間処理で使うフィルタとして,縦続形構成の IIR フィルタを使用 |
MikamiUitOpen | 0:2447a7d225b1 | 5 | // |
MikamiUitOpen | 4:c853feefa216 | 6 | // 入力端子: A0 (PA_0) -- デフォルト |
MikamiUitOpen | 4:c853feefa216 | 7 | // A1 (PA_1) -- Start() で指定可能 |
MikamiUitOpen | 0:2447a7d225b1 | 8 | // 出力端子: A2 (PA_4) |
MikamiUitOpen | 0:2447a7d225b1 | 9 | // |
MikamiUitOpen | 6:a14d7f0bc3f5 | 10 | // <注意> |
MikamiUitOpen | 6:a14d7f0bc3f5 | 11 | // ● 重い信号処理を実行する場合は正常に動かない場合がある. |
MikamiUitOpen | 6:a14d7f0bc3f5 | 12 | // ● メンバ関数 Start() を実行した後に,printf() のような重い |
MikamiUitOpen | 6:a14d7f0bc3f5 | 13 | // 処理を実行すると正常に動かないことがある. |
MikamiUitOpen | 6:a14d7f0bc3f5 | 14 | // |
MikamiUitOpen | 7:6275fe158ae8 | 15 | // 2018/10/11, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 5:4800dd3838d6 | 16 | //----------------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 17 | |
MikamiUitOpen | 0:2447a7d225b1 | 18 | #include "mbed.h" |
MikamiUitOpen | 0:2447a7d225b1 | 19 | #include "F446_ADC.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 20 | #include "F446_DAC.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 21 | #include "IIR_Cascade.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 22 | |
MikamiUitOpen | 0:2447a7d225b1 | 23 | #ifndef F446_MULTIRATE_HPP |
MikamiUitOpen | 0:2447a7d225b1 | 24 | #define F446_MULTIRATE_HPP |
MikamiUitOpen | 0:2447a7d225b1 | 25 | |
MikamiUitOpen | 0:2447a7d225b1 | 26 | namespace Mikami |
MikamiUitOpen | 0:2447a7d225b1 | 27 | { |
MikamiUitOpen | 0:2447a7d225b1 | 28 | class F446_Multirate |
MikamiUitOpen | 0:2447a7d225b1 | 29 | { |
MikamiUitOpen | 0:2447a7d225b1 | 30 | public: |
MikamiUitOpen | 0:2447a7d225b1 | 31 | // コンストラクタ |
MikamiUitOpen | 3:285cebe5823c | 32 | // コンストラクタの引数を与えない場合はデフォルトのフィルタを使用 |
MikamiUitOpen | 3:285cebe5823c | 33 | // order = 0 にすると,補間フィルタなしの状態になる |
MikamiUitOpen | 7:6275fe158ae8 | 34 | F446_Multirate(int order = -1, const Biquad hk[] = NULL, |
MikamiUitOpen | 3:285cebe5823c | 35 | float g0 = 1); |
MikamiUitOpen | 0:2447a7d225b1 | 36 | |
MikamiUitOpen | 0:2447a7d225b1 | 37 | virtual ~F446_Multirate() |
MikamiUitOpen | 0:2447a7d225b1 | 38 | { |
MikamiUitOpen | 0:2447a7d225b1 | 39 | delete adc_; |
MikamiUitOpen | 0:2447a7d225b1 | 40 | delete interpolator_; |
MikamiUitOpen | 0:2447a7d225b1 | 41 | } |
MikamiUitOpen | 0:2447a7d225b1 | 42 | |
MikamiUitOpen | 2:b55ae17ffd92 | 43 | // 標本化の実行開始 |
MikamiUitOpen | 4:c853feefa216 | 44 | // frequency 入力の標本化周波数 |
MikamiUitOpen | 4:c853feefa216 | 45 | // pin 入力ピン(デフォルトは A0.A1 の指定も可) |
MikamiUitOpen | 4:c853feefa216 | 46 | void Start(int frequency, PinName pin = A0); |
MikamiUitOpen | 0:2447a7d225b1 | 47 | |
MikamiUitOpen | 0:2447a7d225b1 | 48 | // AD変換の結果を取り出す |
MikamiUitOpen | 0:2447a7d225b1 | 49 | float Input(); |
MikamiUitOpen | 0:2447a7d225b1 | 50 | |
MikamiUitOpen | 0:2447a7d225b1 | 51 | // 補間用フィルタを実行し,処理結果を出力用バッファへ書き込む |
MikamiUitOpen | 0:2447a7d225b1 | 52 | void Output(float yn); |
MikamiUitOpen | 0:2447a7d225b1 | 53 | |
MikamiUitOpen | 0:2447a7d225b1 | 54 | private: |
MikamiUitOpen | 0:2447a7d225b1 | 55 | static const int FACTOR_ = 4; // アップサンプリング倍率:4 倍 |
MikamiUitOpen | 0:2447a7d225b1 | 56 | // この倍率は 2 のべき乗にすること |
MikamiUitOpen | 0:2447a7d225b1 | 57 | static const int MASK_FACTOR_ = FACTOR_ - 1; |
MikamiUitOpen | 0:2447a7d225b1 | 58 | static const int MASK_BUF_ = 2*FACTOR_ - 1; |
MikamiUitOpen | 0:2447a7d225b1 | 59 | |
MikamiUitOpen | 0:2447a7d225b1 | 60 | static AdcF446 *adc_; // AD変換器のオブジェクトのポインタ |
MikamiUitOpen | 0:2447a7d225b1 | 61 | static DacF446 dac_; // DA変換器のオブジェクト |
MikamiUitOpen | 0:2447a7d225b1 | 62 | |
MikamiUitOpen | 0:2447a7d225b1 | 63 | static Array<float> buf_; // DA変換器に出力するデータ用バッファ |
MikamiUitOpen | 0:2447a7d225b1 | 64 | int indexW_; // buf_ へ書き込む際のインデックス |
MikamiUitOpen | 0:2447a7d225b1 | 65 | static int indexR_; // buf_ から読み出す際のインデックス |
MikamiUitOpen | 0:2447a7d225b1 | 66 | static float xn_; // AD変換器から入力されたデータ |
MikamiUitOpen | 0:2447a7d225b1 | 67 | static __IO bool okIn_; // AD変換されたデータが使える場合に true となる |
MikamiUitOpen | 0:2447a7d225b1 | 68 | |
MikamiUitOpen | 3:285cebe5823c | 69 | // 補間用フィルタ用のメンバ |
MikamiUitOpen | 7:6275fe158ae8 | 70 | static const Biquad HK_[]; // biquad 部の係数 |
MikamiUitOpen | 7:6275fe158ae8 | 71 | static const float G0_; // 利得定数 |
MikamiUitOpen | 7:6275fe158ae8 | 72 | IirCascade *interpolator_; // 補間用フィルタのポインタ |
MikamiUitOpen | 3:285cebe5823c | 73 | |
MikamiUitOpen | 0:2447a7d225b1 | 74 | // 引数を 0 ~ (アップサンプリング倍率-1) の間でカウントアップ |
MikamiUitOpen | 0:2447a7d225b1 | 75 | static inline int ModCounter(int &index) |
MikamiUitOpen | 0:2447a7d225b1 | 76 | { |
MikamiUitOpen | 0:2447a7d225b1 | 77 | index = ++index & MASK_BUF_; |
MikamiUitOpen | 0:2447a7d225b1 | 78 | return index; |
MikamiUitOpen | 0:2447a7d225b1 | 79 | } |
MikamiUitOpen | 0:2447a7d225b1 | 80 | // ADC 変換終了割り込みに対する割り込みサービス・ルーチン |
MikamiUitOpen | 0:2447a7d225b1 | 81 | static void AdcIsr(); |
MikamiUitOpen | 0:2447a7d225b1 | 82 | }; |
MikamiUitOpen | 0:2447a7d225b1 | 83 | } |
MikamiUitOpen | 0:2447a7d225b1 | 84 | #endif // F446_MULTIRATE_HPP |