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

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;