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.

Dependencies:   Array_Matrix

Dependents:   F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver Demo_F446_AD_DA_Multirate ... more

Committer:
MikamiUitOpen
Date:
Fri Jun 15 13:33:20 2018 +0000
Revision:
5:4800dd3838d6
Parent:
4:c853feefa216
Child:
7:6275fe158ae8
6

Who changed what in which revision?

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