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.cpp@1:abd7e93549b2, 2018-05-16 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Wed May 16 07:30:14 2018 +0000
- Revision:
- 1:abd7e93549b2
- Parent:
- 0:2447a7d225b1
- Child:
- 2:b55ae17ffd92
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:2447a7d225b1 | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 2 | // 出力を 4 倍にアップサンプリングするクラス:高域の補正を行う場合 |
MikamiUitOpen | 0:2447a7d225b1 | 3 | // Nucleo-F446RE 専用 |
MikamiUitOpen | 0:2447a7d225b1 | 4 | // |
MikamiUitOpen | 0:2447a7d225b1 | 5 | // 2018/05/15, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 0:2447a7d225b1 | 6 | //----------------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 7 | |
MikamiUitOpen | 0:2447a7d225b1 | 8 | #include "F446_Multirate.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 9 | |
MikamiUitOpen | 0:2447a7d225b1 | 10 | F446_Multirate::F446_Multirate() : indexW_(0) |
MikamiUitOpen | 0:2447a7d225b1 | 11 | { |
MikamiUitOpen | 0:2447a7d225b1 | 12 | // 補間用フィルタの設定 |
MikamiUitOpen | 0:2447a7d225b1 | 13 | // 全体は biquad フィルタ4段とし,最初の3段は 6 次の LPF とし,最後の1段は |
MikamiUitOpen | 0:2447a7d225b1 | 14 | // 外付けの 1 次のアナログフィルタによる,高域の低下分を補正するための,2 次の |
MikamiUitOpen | 0:2447a7d225b1 | 15 | // LPF を使用. |
MikamiUitOpen | 0:2447a7d225b1 | 16 | // 利得定数は,両者の利得定数の積に sqrt(2) を乗算した.これは 2 次のフィルタの |
MikamiUitOpen | 0:2447a7d225b1 | 17 | // 利得の最大値が 1 倍のため,利得の最大値を sqrt(2) 倍にするため |
MikamiUitOpen | 0:2447a7d225b1 | 18 | //-------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 19 | // 1 ~ 3 段目 |
MikamiUitOpen | 0:2447a7d225b1 | 20 | // 低域通過フィルタ |
MikamiUitOpen | 0:2447a7d225b1 | 21 | // 連立チェビシェフ特性 |
MikamiUitOpen | 0:2447a7d225b1 | 22 | // 次数 : 6 次 |
MikamiUitOpen | 0:2447a7d225b1 | 23 | // 標本化周波数: 40.00 kHz |
MikamiUitOpen | 0:2447a7d225b1 | 24 | // 遮断周波数 : 4.80 kHz |
MikamiUitOpen | 0:2447a7d225b1 | 25 | // 通過域のリップル: 0.50 dB |
MikamiUitOpen | 0:2447a7d225b1 | 26 | // 阻止域の減衰量 :35.00 dB |
MikamiUitOpen | 0:2447a7d225b1 | 27 | //-------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 28 | const Biquad::Coefs HK[] = { |
MikamiUitOpen | 0:2447a7d225b1 | 29 | {1.370091E+00f, -5.353523E-01f, 2.500437E-01f, 1.0f}, // 1段目 |
MikamiUitOpen | 0:2447a7d225b1 | 30 | {1.402004E+00f, -8.228448E-01f, -1.182903E+00f, 1.0f}, // 2段目 |
MikamiUitOpen | 0:2447a7d225b1 | 31 | {1.426447E+00f, -9.646314E-01f, -1.362836E+00f, 1.0f}, // 3段目 |
MikamiUitOpen | 0:2447a7d225b1 | 32 | //-------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 33 | // 4 段目:高域補正用フィルタ |
MikamiUitOpen | 0:2447a7d225b1 | 34 | // 低域通過フィルタ |
MikamiUitOpen | 0:2447a7d225b1 | 35 | // 連立チェビシェフ特性 |
MikamiUitOpen | 0:2447a7d225b1 | 36 | // 次数 : 2 次 |
MikamiUitOpen | 0:2447a7d225b1 | 37 | // 標本化周波数: 40.00 kHz |
MikamiUitOpen | 0:2447a7d225b1 | 38 | // 遮断周波数 : 5.20 kHz |
MikamiUitOpen | 0:2447a7d225b1 | 39 | // 通過域のリップル: 3.00 dB |
MikamiUitOpen | 0:2447a7d225b1 | 40 | // 阻止域の減衰量 : 8.00 dB |
MikamiUitOpen | 0:2447a7d225b1 | 41 | //-------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 42 | {1.240986E+00f, -7.647923E-01f, -1.053681E+00f, 1.0f}}; // 4段目 |
MikamiUitOpen | 0:2447a7d225b1 | 43 | const float G0 = FACTOR_*3.016500E-02f*3.918621E-01f*sqrtf(2); // 利得定数 |
MikamiUitOpen | 0:2447a7d225b1 | 44 | interpolator_ = new IirCascade(8, HK, G0); // 補間用フィルタの初期化 |
MikamiUitOpen | 0:2447a7d225b1 | 45 | } |
MikamiUitOpen | 0:2447a7d225b1 | 46 | |
MikamiUitOpen | 0:2447a7d225b1 | 47 | // AD 変換終了割り込みを使えるようにする |
MikamiUitOpen | 0:2447a7d225b1 | 48 | void F446_Multirate::SetIntr(int frequency) |
MikamiUitOpen | 0:2447a7d225b1 | 49 | { |
MikamiUitOpen | 0:2447a7d225b1 | 50 | adc_ = new AdcF446(frequency*FACTOR_); // AD変換器の初期化 |
MikamiUitOpen | 0:2447a7d225b1 | 51 | wait_us(1000); // ある程度の待ち時間が必要 |
MikamiUitOpen | 0:2447a7d225b1 | 52 | adc_->SetIntrVec(&F446_Multirate::AdcIsr); // ISR の設定 |
MikamiUitOpen | 0:2447a7d225b1 | 53 | } |
MikamiUitOpen | 0:2447a7d225b1 | 54 | |
MikamiUitOpen | 0:2447a7d225b1 | 55 | // AD変換の結果を取り出す |
MikamiUitOpen | 0:2447a7d225b1 | 56 | float F446_Multirate::Input() |
MikamiUitOpen | 0:2447a7d225b1 | 57 | { |
MikamiUitOpen | 0:2447a7d225b1 | 58 | while (!okIn_) {} // AD変換の結果を取り出せるまで待つ |
MikamiUitOpen | 0:2447a7d225b1 | 59 | okIn_ = false; |
MikamiUitOpen | 0:2447a7d225b1 | 60 | return xn_; |
MikamiUitOpen | 0:2447a7d225b1 | 61 | } |
MikamiUitOpen | 0:2447a7d225b1 | 62 | |
MikamiUitOpen | 0:2447a7d225b1 | 63 | // 補間用フィルタを実行し,処理結果を出力用バッファへ書き込む |
MikamiUitOpen | 0:2447a7d225b1 | 64 | void F446_Multirate::Output(float yn) |
MikamiUitOpen | 0:2447a7d225b1 | 65 | { |
MikamiUitOpen | 0:2447a7d225b1 | 66 | for (int n=0; n<FACTOR_; n++) |
MikamiUitOpen | 0:2447a7d225b1 | 67 | { |
MikamiUitOpen | 0:2447a7d225b1 | 68 | buf_[ModCounter(indexW_)] = interpolator_->Execute(yn); |
MikamiUitOpen | 0:2447a7d225b1 | 69 | yn = 0; // 2回目からは補間用フィルタの入力を 0 値とする |
MikamiUitOpen | 0:2447a7d225b1 | 70 | } |
MikamiUitOpen | 0:2447a7d225b1 | 71 | } |
MikamiUitOpen | 0:2447a7d225b1 | 72 | |
MikamiUitOpen | 0:2447a7d225b1 | 73 | // ADC 変換終了割り込みに対する割り込みサービス・ルーチン |
MikamiUitOpen | 0:2447a7d225b1 | 74 | void F446_Multirate::AdcIsr() |
MikamiUitOpen | 0:2447a7d225b1 | 75 | { |
MikamiUitOpen | 0:2447a7d225b1 | 76 | static int count = 0; |
MikamiUitOpen | 0:2447a7d225b1 | 77 | |
MikamiUitOpen | 0:2447a7d225b1 | 78 | xn_ = adc_->Read(); // AD変換器の値を読み込む |
MikamiUitOpen | 0:2447a7d225b1 | 79 | dac_.Write(buf_[ModCounter(indexR_)]); // 出力バッファの内容を DAC へ書き込む |
MikamiUitOpen | 0:2447a7d225b1 | 80 | |
MikamiUitOpen | 0:2447a7d225b1 | 81 | if (count == 0) okIn_ = true; // AD変換器からの入力信号は4回に1回使う |
MikamiUitOpen | 0:2447a7d225b1 | 82 | count = ++count & MASK_FACTOR_; // 出力時に4倍にアップサンプリングするので, |
MikamiUitOpen | 0:2447a7d225b1 | 83 | // 入力を4回に1回行うための処理 |
MikamiUitOpen | 0:2447a7d225b1 | 84 | } |
MikamiUitOpen | 0:2447a7d225b1 | 85 | |
MikamiUitOpen | 0:2447a7d225b1 | 86 | // static メンバの実体の宣言/初期化 |
MikamiUitOpen | 0:2447a7d225b1 | 87 | AdcF446 *F446_Multirate::adc_; |
MikamiUitOpen | 0:2447a7d225b1 | 88 | DacF446 F446_Multirate::dac_; |
MikamiUitOpen | 0:2447a7d225b1 | 89 | Array<float> F446_Multirate::buf_(2*FACTOR_, 0.0f); |
MikamiUitOpen | 0:2447a7d225b1 | 90 | int F446_Multirate::indexR_ = FACTOR_ - 1; |
MikamiUitOpen | 0:2447a7d225b1 | 91 | float F446_Multirate::xn_; |
MikamiUitOpen | 0:2447a7d225b1 | 92 | __IO bool F446_Multirate::okIn_ = false; |