STM32F446 内蔵の DAC から出力する際に,補間フィルタを利用し,標本化周波数を入力の際の4倍の標本化周波数で出力するためのライブラリ.このライブラリを登録した際のプログラム: Demo_DSP_ADDA_Multirate. Library for outputting from built-in DAC in STM32F446 using interpolation filter at sampling frequency of 4 times in case of input.

Dependencies:   Array_Matrix DSP_ADDA

Dependents:   Demo_DSP_ADDA_Multirate DSP_AD_DA_Multirate DSP_GraphicEqualizerB DSP_VariableLHpfB ... more

Revision:
3:59af3dfa0595
Parent:
2:aa092bbc8877
Child:
4:c233f2db4652
--- a/MultirateLiPh.cpp	Tue May 26 12:21:41 2020 +0000
+++ b/MultirateLiPh.cpp	Tue Jun 16 09:48:54 2020 +0000
@@ -2,32 +2,37 @@
 //  出力を 4 倍にアップサンプリングするクラス
 //  補間処理で使うフィルタとして,直線位相 FIR フィルタを使用
 //  
-//  2020/05/26, Copyright (c) 2020 MIKAMI, Naoki
+//  2020/06/16, Copyright (c) 2020 MIKAMI, Naoki
 //-----------------------------------------------------------
 
 #include "MultirateLiPh.hpp"
 using namespace Mikami;
 
-MultirateLiPh::MultirateLiPh()
-    : indexW_(0), SIZE_((ORDER_+2)/FACTOR_), FIR_LOOP_(SIZE_),
-      CENTER_(SIZE_/2), un_(SIZE_, 0.0f),
-      h1_(SIZE_, HK1_), h2_(SIZE_, HK2_), h3_(SIZE_, HK3_)
-{
-    // 割り込み優先順位の設定
-    NVIC_SetPriority(ADC_IRQn, 0);      // ADC 終了割り込み:最優先
-    NVIC_SetPriority(CAN2_TX_IRQn, 1);  // ソフトウェア割り込みで使用:2番目に優先
-}
+// コンストラクタ(デフォルトの補間フィルタの係数を使う場合)
+MultirateLiPh::MultirateLiPh(float fSampling,
+                             PinName pin, ADC_TypeDef* const adc)
+    : indexW_(0), FIR_LOOP_(ORDER_/4), CENTER_(ORDER_/(FACTOR_*2)),
+      un_(ORDER_/4, 0.0f),
+      h1_(ORDER_/4, HK1_), h2_(ORDER_/4, HK2_), h3_(ORDER_/4, HK3_)
+{   Init(fSampling, pin, adc); }
+
+// コンストラクタ(デフォルト以外の補間フィルタの係数を使う場合)
+MultirateLiPh::MultirateLiPh(float fSampling, int order, const float hk1[],
+                             const float hk2[], const float hk3[],
+                             PinName pin, ADC_TypeDef* const adc)
+    : indexW_(0), FIR_LOOP_(order/4), CENTER_(order/(FACTOR_*2)),
+      un_(order/4, 0.0f),
+      h1_(order/4, hk1), h2_(order/4, hk2), h3_(order/4, hk3)
+{   Init(fSampling, pin, adc); }
 
 // 標本化の実行開始
-void MultirateLiPh::Start(float fSampling, void (*Func)(),
-                          PinName pin, ADC_TypeDef* const adc)
+void MultirateLiPh::Start(void (*Func)())
 {
     // CAN2_TX によるソフトウェア割り込みに対応する設定
     NVIC_SetVector(CAN2_TX_IRQn, (uint32_t)Func);
     NVIC_EnableIRQ(CAN2_TX_IRQn);       
 
     // AD 変換器を使うための準備
-    adc_ = new DspAdc_Intr(fSampling*FACTOR_, pin, adc);
     wait_us(1000);    // ある程度の待ち時間が必要
     adc_->SetIntrVec(&MultirateLiPh::AdcIsr);  // AD 変換終了に対応する ISR の設定
 }
@@ -66,6 +71,15 @@
     return y;
 }
 
+// ADC の初期化と割込み優先順位の設定
+void MultirateLiPh::Init(float fSampling, PinName pin, ADC_TypeDef* const adc)
+{
+    NVIC_SetPriority(ADC_IRQn, 0);      // ADC 終了割り込み:最優先
+    NVIC_SetPriority(CAN2_TX_IRQn, 1);  // ソフトウェア割り込みで使用:2番目に優先
+
+    adc_ = new DspAdc_Intr(fSampling*FACTOR_, pin, adc);
+}
+
 // static メンバの実体の宣言/初期化
 DspAdc_Intr *MultirateLiPh::adc_;    // AD変換器のオブジェクトのポインタ
 DspDac MultirateLiPh::dac_;          // DA変換器のオブジェクト