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
Diff: F446_Multirate.cpp
- Revision:
- 3:285cebe5823c
- Parent:
- 2:b55ae17ffd92
- Child:
- 4:c853feefa216
--- a/F446_Multirate.cpp Sat May 19 04:37:02 2018 +0000 +++ b/F446_Multirate.cpp Wed May 30 09:09:04 2018 +0000 @@ -2,46 +2,19 @@ // 出力を 4 倍にアップサンプリングするクラス:高域の補正を行う場合 // Nucleo-F446RE 専用 // -// 2018/05/19, Copyright (c) 2018 MIKAMI, Naoki +// 2018/05/30, Copyright (c) 2018 MIKAMI, Naoki //----------------------------------------------------------- #include "F446_Multirate.hpp" -F446_Multirate::F446_Multirate() : indexW_(0) +F446_Multirate::F446_Multirate(int order, const Biquad::Coefs ck[], float g0) + : indexW_(0) { -// 補間用フィルタの設定 -// 全体は biquad フィルタ4段とし,最初の3段は 6 次の LPF とし,最後の1段は -// 外付けの 1 次のアナログフィルタによる,高域の低下分を補正するための,2 次の -// LPF を使用. -// 利得定数は,両者の利得定数の積に sqrt(2) を乗算した.これは 2 次のフィルタの -// 利得の最大値が 1 倍のため,利得の最大値を sqrt(2) 倍にするため - //-------------------------------- - // 1 ~ 3 段目 - // 低域通過フィルタ - // 連立チェビシェフ特性 - // 次数 : 6 次 - // 標本化周波数: 40.00 kHz - // 遮断周波数 : 4.80 kHz - // 通過域のリップル: 0.50 dB - // 阻止域の減衰量 :35.00 dB - //-------------------------------- - const Biquad::Coefs HK[] = { - {1.370091E+00f, -5.353523E-01f, 2.500437E-01f, 1.0f}, // 1段目 - {1.402004E+00f, -8.228448E-01f, -1.182903E+00f, 1.0f}, // 2段目 - {1.426447E+00f, -9.646314E-01f, -1.362836E+00f, 1.0f}, // 3段目 - //-------------------------------- - // 4 段目:高域補正用フィルタ - // 低域通過フィルタ - // 連立チェビシェフ特性 - // 次数 : 2 次 - // 標本化周波数: 40.00 kHz - // 遮断周波数 : 5.20 kHz - // 通過域のリップル: 3.00 dB - // 阻止域の減衰量 : 8.00 dB - //-------------------------------- - {1.240986E+00f, -7.647923E-01f, -1.053681E+00f, 1.0f}}; // 4段目 - const float G0 = FACTOR_*3.016500E-02f*3.918621E-01f*sqrtf(2); // 利得定数 - interpolator_ = new IirCascade(8, HK, G0); // 補間用フィルタの初期化 + // 補間用フィルタの初期化 + if (order == -1) // デフォルトの補間用フィルタを使用 + interpolator_ = new IirCascade(8, HK_, G0_); + else // コンストラクタの引数で与えられた係数の補間用フィルタを使用 + interpolator_ = new IirCascade(order, ck, g0); } // 標本化の実行開始 @@ -90,3 +63,38 @@ int F446_Multirate::indexR_ = FACTOR_ - 1; float F446_Multirate::xn_; __IO bool F446_Multirate::okIn_ = false; + +// 補間用フィルタの係数(AD 変換器の標本化周波数は 10 kHz を想定している) +// +// 補間用フィルタ全体は biquad フィルタ4段とする. +// 最初の3段は 6 次の LPF を使用し,最後の1段は,外付けの 1 次のアナログフィル +// タによる,高域の低下分を補正するための 2 次の LPF を使用. +// 利得定数は,両者の利得定数の積に sqrt(2) を乗算した.これは 2 次のフィルタの +// 利得の最大値が 1 倍のため,この利得の最大値を sqrt(2) 倍にするため +//-------------------------------- +// 1 ~ 3 段目 +// 低域通過フィルタ +// 連立チェビシェフ特性 +// 次数 : 6 次 +// 標本化周波数: 40.00 kHz +// 遮断周波数 : 4.80 kHz +// 通過域のリップル: 0.50 dB +// 阻止域の減衰量 :35.00 dB +//-------------------------------- +const Biquad::Coefs F446_Multirate::HK_[] = { + {1.370091E+00f, -5.353523E-01f, 2.500437E-01f, 1.0f}, // 1段目 + {1.402004E+00f, -8.228448E-01f, -1.182903E+00f, 1.0f}, // 2段目 + {1.426447E+00f, -9.646314E-01f, -1.362836E+00f, 1.0f}, // 3段目 +//-------------------------------- +// 4 段目:高域補正用フィルタ +// 低域通過フィルタ +// 連立チェビシェフ特性 +// 次数 : 2 次 +// 標本化周波数: 40.00 kHz +// 遮断周波数 : 5.20 kHz +// 通過域のリップル: 3.00 dB +// 阻止域の減衰量 : 8.00 dB +//-------------------------------- + {1.240986E+00f, -7.647923E-01f, -1.053681E+00f, 1.0f}}; // 4段目 +// 利得定数 +const float F446_Multirate::G0_ = FACTOR_*3.016500E-02f*3.918621E-01f*1.41421f;