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
Diff: MultirateLiPh.cpp
- 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変換器のオブジェクト