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
MultirateLiPh.hpp@9:9f391b2d51be, 2020-12-06 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Dec 06 07:21:23 2020 +0000
- Revision:
- 9:9f391b2d51be
- Parent:
- 8:356d0c5f97c3
- Child:
- 11:91190380ca3c
10
Who changed what in which revision?
User | Revision | Line number | New 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 | 9:9f391b2d51be | 7 | // 2020/12/06, 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 | 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 | 0:79c0b1e2fd10 | 53 | static DspAdc_Intr *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 |