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:
Wed Dec 22 08:01:24 2021 +0000
Revision:
12:f7bfe38c93ab
Parent:
11:91190380ca3c
13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:79c0b1e2fd10 1 //-----------------------------------------------------------
MikamiUitOpen 0:79c0b1e2fd10 2 // 出力を 4 倍にアップサンプリングするクラス(ヘッダ)
MikamiUitOpen 8:356d0c5f97c3 3 // 補間処理で使うフィルタ:直線位相 FIR フィルタ
MikamiUitOpen 0:79c0b1e2fd10 4 //
MikamiUitOpen 0:79c0b1e2fd10 5 // 出力端子: A2 (PA_4)
MikamiUitOpen 0:79c0b1e2fd10 6 //
MikamiUitOpen 12:f7bfe38c93ab 7 // 2021/12/22, Copyright (c) 2021 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 3:59af3dfa0595 22 // コンストラクタ(デフォルトの補間フィルタの係数を使う場合)
MikamiUitOpen 6:202a7610f937 23 // fSampling 入力の標本化周波数 [kHz]
MikamiUitOpen 3:59af3dfa0595 24 // pin 入力ピン(デフォルトは A1)
MikamiUitOpen 3:59af3dfa0595 25 // adc ADC1, ADC2, ADC3 のいずれか
MikamiUitOpen 5:e905fed6b994 26 explicit MultirateLiPh(float fSampling,
MikamiUitOpen 5:e905fed6b994 27 PinName pin = A1, ADC_TypeDef* const adc = ADC2);
MikamiUitOpen 3:59af3dfa0595 28 // コンストラクタ(デフォルト以外の補間フィルタの係数を使う場合)
MikamiUitOpen 3:59af3dfa0595 29 // order 補間フィルタの次数
MikamiUitOpen 3:59af3dfa0595 30 // h1, h2, h3 補間フィルタの係数
MikamiUitOpen 3:59af3dfa0595 31 MultirateLiPh(float fSampling, int order, const float hk1[],
MikamiUitOpen 3:59af3dfa0595 32 const float hk2[], const float hk3[],
MikamiUitOpen 3:59af3dfa0595 33 PinName pin = A1, ADC_TypeDef* const adc = ADC2);
MikamiUitOpen 1:6f582d9e27b4 34
MikamiUitOpen 0:79c0b1e2fd10 35 virtual ~MultirateLiPh() { delete adc_; }
MikamiUitOpen 0:79c0b1e2fd10 36
MikamiUitOpen 0:79c0b1e2fd10 37 // 標本化の実行開始
MikamiUitOpen 0:79c0b1e2fd10 38 // Func ソフトウェア割込みに対する ISR
MikamiUitOpen 3:59af3dfa0595 39 void Start(void (*Func)());
MikamiUitOpen 0:79c0b1e2fd10 40
MikamiUitOpen 0:79c0b1e2fd10 41 // AD変換の結果を取り出す
MikamiUitOpen 6:202a7610f937 42 float Input() const { return xn_; }
MikamiUitOpen 0:79c0b1e2fd10 43
MikamiUitOpen 0:79c0b1e2fd10 44 // 補間用フィルタを実行し,処理結果を出力用バッファへ書き込む
MikamiUitOpen 3:59af3dfa0595 45 void Output(float yn);
MikamiUitOpen 3:59af3dfa0595 46
MikamiUitOpen 0:79c0b1e2fd10 47 private:
MikamiUitOpen 8:356d0c5f97c3 48 static const int UR_ = 4; // アップサンプリング倍率:4 倍
MikamiUitOpen 8:356d0c5f97c3 49 // この倍率は 2 のべき乗にすること
MikamiUitOpen 8:356d0c5f97c3 50 static const int MASK_UR_ = UR_ - 1;
MikamiUitOpen 8:356d0c5f97c3 51 static const int MASK_BUF_ = 2*UR_ - 1;
MikamiUitOpen 0:79c0b1e2fd10 52
MikamiUitOpen 11:91190380ca3c 53 static DspAdcIntr *adc_; // AD変換器のオブジェクトのポインタ
MikamiUitOpen 0:79c0b1e2fd10 54 static DspDac dac_; // DA変換器のオブジェクト
MikamiUitOpen 1:6f582d9e27b4 55
MikamiUitOpen 0:79c0b1e2fd10 56 static Array<float> buf_; // DA変換器に出力するデータ用バッファ
MikamiUitOpen 0:79c0b1e2fd10 57 static int indexR_; // buf_ から読み出す際のインデックス
MikamiUitOpen 0:79c0b1e2fd10 58 static float xn_; // AD変換器から入力されたデータ
MikamiUitOpen 0:79c0b1e2fd10 59 int indexW_; // buf_ へ書き込む際のインデックス
MikamiUitOpen 1:6f582d9e27b4 60
MikamiUitOpen 0:79c0b1e2fd10 61 // 補間用フィルタ用
MikamiUitOpen 0:79c0b1e2fd10 62 const int FIR_LOOP_; // FIR フィルタのループの数
MikamiUitOpen 0:79c0b1e2fd10 63 const int CENTER_; // 補間処理をしない信号の位置
MikamiUitOpen 8:356d0c5f97c3 64 Array<float> vn_; // FIR フィルタの遅延器に対応するバッファ
MikamiUitOpen 3:59af3dfa0595 65 Array<float> h1_, h2_, h3_; // FIR フィルタの係数
MikamiUitOpen 0:79c0b1e2fd10 66
MikamiUitOpen 3:59af3dfa0595 67 // 補間用フィルタ用の係数(デフォルト)
MikamiUitOpen 0:79c0b1e2fd10 68 static const int ORDER_;
MikamiUitOpen 0:79c0b1e2fd10 69 static const float HK1_[], HK2_[], HK3_[];
MikamiUitOpen 0:79c0b1e2fd10 70
MikamiUitOpen 9:9f391b2d51be 71 // 引数を 0 ~ (2*アップサンプリング倍率-1) の間でカウントアップ
MikamiUitOpen 3:59af3dfa0595 72 static inline int ModIndex(int &index)
MikamiUitOpen 3:59af3dfa0595 73 { return ++index & MASK_BUF_; }
MikamiUitOpen 3:59af3dfa0595 74
MikamiUitOpen 0:79c0b1e2fd10 75 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:79c0b1e2fd10 76 static void AdcIsr();
MikamiUitOpen 1:6f582d9e27b4 77
MikamiUitOpen 0:79c0b1e2fd10 78 // 補間用 FIR フィルタ
MikamiUitOpen 8:356d0c5f97c3 79 float Interpolate(const float hk[]) const;
MikamiUitOpen 3:59af3dfa0595 80
MikamiUitOpen 3:59af3dfa0595 81 // ADC の初期化と割込み優先順位の設定
MikamiUitOpen 5:e905fed6b994 82 void Init(float fSampling, PinName pin, ADC_TypeDef* const adc);
MikamiUitOpen 5:e905fed6b994 83
MikamiUitOpen 5:e905fed6b994 84 // コピー・コンストラクタ,代入演算子の禁止のため
MikamiUitOpen 5:e905fed6b994 85 MultirateLiPh(const MultirateLiPh&);
MikamiUitOpen 5:e905fed6b994 86 MultirateLiPh& operator=(const MultirateLiPh&);
MikamiUitOpen 0:79c0b1e2fd10 87 };
MikamiUitOpen 0:79c0b1e2fd10 88 }
MikamiUitOpen 0:79c0b1e2fd10 89 #endif // MULTIRATE_LINEARPHASE_HPP