ライブラリ "DSP_MultirateLinearphase" の使用例.

Dependencies:   mbed DSP_MultirateLinearphase

Committer:
MikamiUitOpen
Date:
Wed Dec 22 08:01:53 2021 +0000
Revision:
12:ef52fea50d5e
Parent:
11:fd030cd609ad
13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:84e2360c7442 1 //--------------------------------------------------------------------------
MikamiUitOpen 0:84e2360c7442 2 // NUCLEO-F446RE で,アナログ信号の入出力の際に,出力の標本化周波数を,
MikamiUitOpen 0:84e2360c7442 3 // 入力の標本化周波数の4倍にするクラス MultirateLiPh の使用例
MikamiUitOpen 0:84e2360c7442 4 //
MikamiUitOpen 0:84e2360c7442 5 // MultirateLiPh クラスは出力の補間フィルタに直線位相 FIR フィルタを使用
MikamiUitOpen 0:84e2360c7442 6 //
MikamiUitOpen 0:84e2360c7442 7 // 処理の内容:AD 変換器からの入力をそのまま DA 変換器に出力する
MikamiUitOpen 0:84e2360c7442 8 //
MikamiUitOpen 12:ef52fea50d5e 9 // 2021/12/22, Copyright (c) 2021 MIKAMI, Naoki
MikamiUitOpen 0:84e2360c7442 10 //--------------------------------------------------------------------------
MikamiUitOpen 0:84e2360c7442 11
MikamiUitOpen 0:84e2360c7442 12 #include "MultirateLiPh.hpp" // マルチレート処理用
MikamiUitOpen 0:84e2360c7442 13 using namespace Mikami;
MikamiUitOpen 0:84e2360c7442 14 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:84e2360c7442 15
MikamiUitOpen 12:ef52fea50d5e 16 #define FIR_INTERPOLATOR_DEFAULT
MikamiUitOpen 12:ef52fea50d5e 17 // 補間フィルタの係数として,デフォルト以外の係数を使う場合の例:
MikamiUitOpen 12:ef52fea50d5e 18 // 16 行目の #define 文を無効にし,以下の #define 文のいずれかを有効にする
MikamiUitOpen 12:ef52fea50d5e 19 //#define FIR_INTERPOLATOR_ORDER94 // 94 次のフィルタで補間を行う場合
MikamiUitOpen 12:ef52fea50d5e 20 //#define FIR_INTERPOLATOR_ORDER4 // 補間を行わない場合
MikamiUitOpen 12:ef52fea50d5e 21
MikamiUitOpen 6:fccf13e8e8a5 22 const float FS_ = 10; // 入力の標本化周波数: 10 kHz
MikamiUitOpen 0:84e2360c7442 23
MikamiUitOpen 12:ef52fea50d5e 24 #ifdef FIR_INTERPOLATOR_DEFAULT
MikamiUitOpen 3:d52ea58bea85 25 // 出力標本化周波数を4倍にするオブジェクト(デフォルトの補間フィルタ係数を使う場合)
MikamiUitOpen 3:d52ea58bea85 26 MultirateLiPh myAdDa_(FS_);
MikamiUitOpen 12:ef52fea50d5e 27 #else
MikamiUitOpen 3:d52ea58bea85 28 // 次の行はデフォルト以外の補間用フィルタ係数を使う場合
MikamiUitOpen 12:ef52fea50d5e 29 #include "coefficients.hpp" // デフォルトの補間用フィルタの係数を使う場合は不要
MikamiUitOpen 12:ef52fea50d5e 30 MultirateLiPh myAdDa_(FS_, ORDER_, HK1_, HK2_, HK3_);
MikamiUitOpen 12:ef52fea50d5e 31 #endif // FIR_INTERPOLATOR_DEFAULT
MikamiUitOpen 0:84e2360c7442 32
MikamiUitOpen 9:388a0203ac37 33 // 信号処理に割り当てられる処理時間を見積るために使用
MikamiUitOpen 3:d52ea58bea85 34 // 標本化周波数が 10 kHz の場合
MikamiUitOpen 0:84e2360c7442 35 //int us_ = 50; // OK
MikamiUitOpen 9:388a0203ac37 36 int us_ = 90; // 70 次: OK, 94 次: OK
MikamiUitOpen 9:388a0203ac37 37 //int us_ = 91; // 70 次: OK, 94 次: NG
MikamiUitOpen 9:388a0203ac37 38 //int us_ = 92; // 70 次: NG, 94 次: NG
MikamiUitOpen 0:84e2360c7442 39
MikamiUitOpen 0:84e2360c7442 40 // ソフトウェア割込みに対する割込みサービス・ルーチン
MikamiUitOpen 0:84e2360c7442 41 void SwiIsr()
MikamiUitOpen 0:84e2360c7442 42 {
MikamiUitOpen 0:84e2360c7442 43 float sn = myAdDa_.Input();
MikamiUitOpen 3:d52ea58bea85 44 //-----------------------------------------------------------------
MikamiUitOpen 0:84e2360c7442 45 // 実際には,ここにディジタルフィルタなどの処理を記述する
MikamiUitOpen 9:388a0203ac37 46 wait_us(us_); // 信号処理に許される実行時間を見積るため
MikamiUitOpen 3:d52ea58bea85 47 // ここの処理時間が長すぎる場合はおかしな出力波形になる
MikamiUitOpen 0:84e2360c7442 48 // 実際の信号処理では,この関数は不要
MikamiUitOpen 3:d52ea58bea85 49 //-----------------------------------------------------------------
MikamiUitOpen 0:84e2360c7442 50 myAdDa_.Output(sn);
MikamiUitOpen 0:84e2360c7442 51 }
MikamiUitOpen 0:84e2360c7442 52
MikamiUitOpen 0:84e2360c7442 53 int main()
MikamiUitOpen 0:84e2360c7442 54 {
MikamiUitOpen 0:84e2360c7442 55 printf("\r\nADC の入力をそのまま DAC に出力する際にマルチレート処理を利用する例\r\n");
MikamiUitOpen 0:84e2360c7442 56 printf("wait: %d [μs]\r\n", us_);
MikamiUitOpen 0:84e2360c7442 57
MikamiUitOpen 6:fccf13e8e8a5 58 myAdDa_.Start(&SwiIsr); // 標本化を開始する
MikamiUitOpen 0:84e2360c7442 59
MikamiUitOpen 0:84e2360c7442 60 while (true) {}
MikamiUitOpen 0:84e2360c7442 61 }