ライブラリ "DSP_MultirateLinearphase" の使用例.
Dependencies: mbed DSP_MultirateLinearphase
Revision 0:84e2360c7442, committed 2020-05-25
- Comitter:
- MikamiUitOpen
- Date:
- Mon May 25 06:19:22 2020 +0000
- Child:
- 1:6a6927046c8e
- Commit message:
- 1
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DSP_MultirateLinearphase.lib Mon May 25 06:19:22 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/MikamiUitOpen/code/DSP_MultirateLinearphase/#79c0b1e2fd10
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/coefficients.hpp Mon May 25 06:19:22 2020 +0000 @@ -0,0 +1,54 @@ +//------------------------------------------------------------------ +// 補間に使うフィルタの係数としてデフォルト以外の係数を使う場合の定義の例 +// +// デフォルトの係数を使う場合は,このファイルは不要 +// +// このファイルを使ってデフォルト以外の係数を使う場合は,以下のいずれかの +// #define 文を,このファイルをインクルードする前に記述すること +// #define FIR_INTERPOLATOR_ORDER96 +// #define FIR_INTERPOLATOR_ORDER4 +// +// 2020/05/25, Copyright (c) 2020 MIKAMI, Naoki +//------------------------------------------------------------------ + +#include "MultirateLiPh.hpp" +using namespace Mikami; + +#ifdef FIR_INTERPOLATOR_ORDER96 +// 使用窓関数 Kaiser 窓 +// 標本化周波数 (kHz) 40.000000 +// 次数 96 +// 種類 LPF +// 遮断周波数 (kHz) 5.000000 +// 減衰量 (dB) 40.00 +const int MultirateLiPh::ORDER_ = 96; +const float MultirateLiPh::HK1_[] = { +-3.181336E-03f, 5.128636E-03f, -7.675400E-03f, 1.095993E-02f, +-1.517799E-02f, 2.063008E-02f, -2.781909E-02f, 3.767194E-02f, +-5.211612E-02f, 7.591348E-02f, -1.247794E-01f, 2.984461E-01f, + 8.997624E-01f, -1.773076E-01f, 9.513684E-02f, -6.231776E-02f, + 4.412812E-02f, -3.232678E-02f, 2.396353E-02f, -1.772480E-02f, + 1.293674E-02f, -9.214960E-03f, 6.319428E-03f, -4.087220E-03f}; +const float MultirateLiPh::HK2_[] = { +-5.116816E-03f, 8.067276E-03f, -1.190903E-02f, 1.685387E-02f, +-2.320755E-02f, 3.144941E-02f, -4.240016E-02f, 5.761400E-02f, +-8.044372E-02f, 1.196597E-01f, -2.075416E-01f, 6.350536E-01f, + 6.350536E-01f, -2.075416E-01f, 1.196597E-01f, -8.044372E-02f, + 5.761400E-02f, -4.240016E-02f, 3.144941E-02f, -2.320755E-02f, + 1.685387E-02f, -1.190903E-02f, 8.067276E-03f, -5.116816E-03f}; +const float MultirateLiPh::HK3_[] = { +-4.087220E-03f, 6.319428E-03f, -9.214960E-03f, 1.293674E-02f, +-1.772480E-02f, 2.396353E-02f, -3.232678E-02f, 4.412812E-02f, +-6.231776E-02f, 9.513684E-02f, -1.773076E-01f, 8.997624E-01f, + 2.984461E-01f, -1.247794E-01f, 7.591348E-02f, -5.211612E-02f, + 3.767194E-02f, -2.781909E-02f, 2.063008E-02f, -1.517799E-02f, + 1.095993E-02f, -7.675400E-03f, 5.128636E-03f, -3.181336E-03f}; +#endif // FIR_INTERPOLATOR_ORDER96 + +#ifdef FIR_INTERPOLATOR_ORDER4 +// 以下は,出力の際の補間を行わない場合に相当する信号を出力したい場合に使う +const int MultirateLiPh::ORDER_ = 4; +const float MultirateLiPh::HK1_[] = {1}; +const float MultirateLiPh::HK2_[] = {1}; +const float MultirateLiPh::HK3_[] = {1}; +#endif // FIR_INTERPOLATOR_ORDER4 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon May 25 06:19:22 2020 +0000 @@ -0,0 +1,57 @@ +//-------------------------------------------------------------------------- +// NUCLEO-F446RE で,アナログ信号の入出力の際に,出力の標本化周波数を, +// 入力の標本化周波数の4倍にするクラス MultirateLiPh の使用例 +// +// MultirateLiPh クラスは出力の補間フィルタに直線位相 FIR フィルタを使用 +// +// 処理の内容:AD 変換器からの入力をそのまま DA 変換器に出力する +// +// 2020/05/25, Copyright (c) 2020 MIKAMI, Naoki +//-------------------------------------------------------------------------- + +#include "MultirateLiPh.hpp" // マルチレート処理用 + +// 補間フィルタの係数として,デフォルト以外の係数を使う場合の例: +// 以下の #define 文のいずれかを有効にする +// "coefficients.hpp" のインクルードを有効にする +//#define FIR_INTERPOLATOR_ORDER96 // 96 次のフィルタで補間を行う場合 +//#define FIR_INTERPOLATOR_ORDER4 // 補間を行わない場合 +//#include "coefficients.hpp" // デフォルト以外の補間用フィルタの係数 + +using namespace Mikami; +#pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため + +const int FS_ = 10; // 入力の標本化周波数: 10 kHz + +// 出力標本化周波数を4倍にするオブジェクト +MultirateLiPh myAdDa_; + +// 以下の us_ の数値はデフォルトの補完フィルタを使った場合 +//int us_ = 50; // OK +//int us_ = 90; // OK +//int us_ = 99; // NG +//int us_ = 95; // NG +//int us_ = 92; // NG +int us_ = 91; // OK + +// ソフトウェア割込みに対する割込みサービス・ルーチン +void SwiIsr() +{ + float sn = myAdDa_.Input(); + //--------------------------------------------------------- + // 実際には,ここにディジタルフィルタなどの処理を記述する + wait_us(us_); // 信号処理に許される実行時間を見積もるため + // 実際の信号処理では,この関数は不要 + //--------------------------------------------------------- + myAdDa_.Output(sn); +} + +int main() +{ + printf("\r\nADC の入力をそのまま DAC に出力する際にマルチレート処理を利用する例\r\n"); + printf("wait: %d [μs]\r\n", us_); + + myAdDa_.Start(FS_, SwiIsr); // 標本化を開始する + + while (true) {} +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon May 25 06:19:22 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file