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

Committer:
MikamiUitOpen
Date:
Mon May 25 12:49:15 2020 +0000
Revision:
1:6f582d9e27b4
Parent:
0:79c0b1e2fd10
Child:
2:aa092bbc8877
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:79c0b1e2fd10 1 //-----------------------------------------------------------
MikamiUitOpen 0:79c0b1e2fd10 2 // 出力を 4 倍にアップサンプリングするクラス(ヘッダ)
MikamiUitOpen 0:79c0b1e2fd10 3 // 補間処理で使うフィルタとして,直線位相 FIR フィルタを使用
MikamiUitOpen 0:79c0b1e2fd10 4 //
MikamiUitOpen 0:79c0b1e2fd10 5 // 出力端子: A2 (PA_4)
MikamiUitOpen 0:79c0b1e2fd10 6 //
MikamiUitOpen 0:79c0b1e2fd10 7 // 2020/05/25, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 0:79c0b1e2fd10 8 //-----------------------------------------------------------
MikamiUitOpen 0:79c0b1e2fd10 9
MikamiUitOpen 0:79c0b1e2fd10 10 #include "DSP_AdcIntr.hpp"
MikamiUitOpen 0:79c0b1e2fd10 11 #include "DSP_Dac.hpp"
MikamiUitOpen 0:79c0b1e2fd10 12 #include "Array.hpp"
MikamiUitOpen 0:79c0b1e2fd10 13
MikamiUitOpen 0:79c0b1e2fd10 14 #ifndef MULTIRATE_LINEARPHASE_HPP
MikamiUitOpen 0:79c0b1e2fd10 15 #define MULTIRATE_LINEARPHASE_HPP
MikamiUitOpen 0:79c0b1e2fd10 16
MikamiUitOpen 0:79c0b1e2fd10 17 namespace Mikami
MikamiUitOpen 0:79c0b1e2fd10 18 {
MikamiUitOpen 0:79c0b1e2fd10 19 class MultirateLiPh
MikamiUitOpen 0:79c0b1e2fd10 20 {
MikamiUitOpen 0:79c0b1e2fd10 21 public:
MikamiUitOpen 0:79c0b1e2fd10 22 // コンストラクタ
MikamiUitOpen 0:79c0b1e2fd10 23 MultirateLiPh();
MikamiUitOpen 1:6f582d9e27b4 24
MikamiUitOpen 0:79c0b1e2fd10 25 virtual ~MultirateLiPh() { delete adc_; }
MikamiUitOpen 0:79c0b1e2fd10 26
MikamiUitOpen 0:79c0b1e2fd10 27 // 標本化の実行開始
MikamiUitOpen 0:79c0b1e2fd10 28 // fSampling 入力の標本化周波数
MikamiUitOpen 0:79c0b1e2fd10 29 // Func ソフトウェア割込みに対する ISR
MikamiUitOpen 0:79c0b1e2fd10 30 // pin 入力ピン(デフォルトは A1)
MikamiUitOpen 0:79c0b1e2fd10 31 // adc ADC1, ADC2, ADC3 のいずれか
MikamiUitOpen 0:79c0b1e2fd10 32 void Start(float fSampling, void (*Func)(), PinName pin = A1,
MikamiUitOpen 0:79c0b1e2fd10 33 ADC_TypeDef* const adc = ADC2);
MikamiUitOpen 0:79c0b1e2fd10 34
MikamiUitOpen 0:79c0b1e2fd10 35 // AD変換の結果を取り出す
MikamiUitOpen 0:79c0b1e2fd10 36 float Input() { return xn_; }
MikamiUitOpen 0:79c0b1e2fd10 37
MikamiUitOpen 0:79c0b1e2fd10 38 // 補間用フィルタを実行し,処理結果を出力用バッファへ書き込む
MikamiUitOpen 0:79c0b1e2fd10 39 void Output(float yn);
MikamiUitOpen 0:79c0b1e2fd10 40
MikamiUitOpen 0:79c0b1e2fd10 41 private:
MikamiUitOpen 0:79c0b1e2fd10 42 static const int FACTOR_ = 4; // アップサンプリング倍率:4 倍
MikamiUitOpen 0:79c0b1e2fd10 43 // この倍率は 2 のべき乗にすること
MikamiUitOpen 0:79c0b1e2fd10 44 static const int MASK_FACTOR_ = FACTOR_ - 1;
MikamiUitOpen 0:79c0b1e2fd10 45 static const int MASK_BUF_ = 2*FACTOR_ - 1;
MikamiUitOpen 0:79c0b1e2fd10 46
MikamiUitOpen 0:79c0b1e2fd10 47 static DspAdc_Intr *adc_; // AD変換器のオブジェクトのポインタ
MikamiUitOpen 0:79c0b1e2fd10 48 static DspDac dac_; // DA変換器のオブジェクト
MikamiUitOpen 1:6f582d9e27b4 49
MikamiUitOpen 0:79c0b1e2fd10 50 static Array<float> buf_; // DA変換器に出力するデータ用バッファ
MikamiUitOpen 0:79c0b1e2fd10 51 static int indexR_; // buf_ から読み出す際のインデックス
MikamiUitOpen 0:79c0b1e2fd10 52 static float xn_; // AD変換器から入力されたデータ
MikamiUitOpen 0:79c0b1e2fd10 53 int indexW_; // buf_ へ書き込む際のインデックス
MikamiUitOpen 1:6f582d9e27b4 54
MikamiUitOpen 0:79c0b1e2fd10 55 // 補間用フィルタ用
MikamiUitOpen 0:79c0b1e2fd10 56 const int FIR_LOOP_; // FIR フィルタのループの数
MikamiUitOpen 0:79c0b1e2fd10 57 const int CENTER_; // 補間処理をしない信号の位置
MikamiUitOpen 0:79c0b1e2fd10 58 Array<float> un_; // FIR フィルタの遅延器に対応するバッファ
MikamiUitOpen 1:6f582d9e27b4 59 const Array<float> h1_, h2_, h3_; // FIR フィルタの係数
MikamiUitOpen 0:79c0b1e2fd10 60
MikamiUitOpen 0:79c0b1e2fd10 61 // 補間用フィルタ用の係数(デフォルト)
MikamiUitOpen 0:79c0b1e2fd10 62 static const int ORDER_;
MikamiUitOpen 0:79c0b1e2fd10 63 static const float HK1_[], HK2_[], HK3_[];
MikamiUitOpen 0:79c0b1e2fd10 64
MikamiUitOpen 0:79c0b1e2fd10 65 // 引数を 0 ~ (アップサンプリング倍率-1) の間でカウントアップ
MikamiUitOpen 1:6f582d9e27b4 66 static int ModIndex(int &index)
MikamiUitOpen 1:6f582d9e27b4 67 { return index = ++index & MASK_BUF_; }
MikamiUitOpen 0:79c0b1e2fd10 68
MikamiUitOpen 0:79c0b1e2fd10 69 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:79c0b1e2fd10 70 static void AdcIsr();
MikamiUitOpen 1:6f582d9e27b4 71
MikamiUitOpen 0:79c0b1e2fd10 72 // 補間用 FIR フィルタ
MikamiUitOpen 0:79c0b1e2fd10 73 float Interpolator(const float hk[]) const;
MikamiUitOpen 0:79c0b1e2fd10 74 };
MikamiUitOpen 0:79c0b1e2fd10 75 }
MikamiUitOpen 0:79c0b1e2fd10 76 #endif // MULTIRATE_LINEARPHASE_HPP