Interface 2015年4月号 第1部 第5章および第6章のプログラム
Information
FilterTest - Interface 2015年4月号 第1部 第5章 第6章 のソフトウェア
Program for Section 5 and 6 in April 2015 issue of Interface
(Japanese electronics magazine)
概要
このプログラムは、
- ハイパスフィルタ、ローパスフィルタ、ノッチフィルタ
を行うFilterTestクラスと、波形をUSBシリアル通信でホストへ送信するmain関数で構成されています。
FilterTest.h, FilterTest.cpp
- A-Dサンプリング - 1 kSPS
- ハイパスフィルタ(遮断周波数 0.5 Hz、1次バターワース)
- ローパスフィルタ(遮断周波数 30 Hz、2次バターワース)
- ノッチフィルタ(中心周波数 50 Hz、2次)
main.cpp
- データ送信レート - 1 kSPS
- FilterTestクラスのインスタンスを生成
- 処理開始メソッドを実行
- メインループ - ポーリングにより、サンプリング、フィルタ処理完了フラグがセットされたら、
USBシリアル通信経由で、ホストへ送信する
シリアル通信フォーマット
(※)誌面ではパケットサイズ 64 byteとなっていますが、
64 byteでは、PCのUSBドライバが 4096 byteまで保持し、波形が滑らかに描画できないため、
Ver.1.0.2で、32 byteに変更しています。
- 34byte固定長パケット方式
- 波形データパケット1種類
波形データパケット | |
0x00 | パケットヘッダ(固定値0xAA) |
0x01 | データ種別ID(0x01: 波形データ) |
0x02 | パケット番号(0 - 99繰り返し) |
0x03 | ペイロードサイズ(固定値30) |
0x04 - 0x21 | 波形データ(short, big endian) |
Description
This contains FilterTest class and main function.
FilterTest class:
- High pass filter, Low pass, Notch filter
Main function:
- Send waveform to host via USB serial class.
FilterTest.h, FilterTest.cpp
- A-D sampling - 1 kSPS
- High pass filter - Cut off frequency 0.5 Hz, first order butterworth
- Low pass filter - Cut off frequency 30 Hz, second order butterworth
- Notch filter - Center frequency 50 Hz, second order
main.cpp
- Data sending rate - 1 kSPS
- Executing start procedure method
- Main loop - sending waveform data via USB serial interface when detecting ready flag.
Packet format for USB serial interface
- Packet size: 34 bytes(fixed)
- One type of packet waveform packet
Waveform packet | |
0x00 | Packet header (0xAA (fixed)) |
0x01 | Data type ID (0x01: Waveform ID) |
0x02 | Packet number (0 - 99) |
0x03 | Payload size (30 (fixed)) |
0x04 - 0x21 | Waveform data (short, big endian) |
FilterTest.h@2:c9471599e9eb, 2015-07-30 (annotated)
- Committer:
- t_tatsuoka
- Date:
- Thu Jul 30 10:23:54 2015 +0000
- Revision:
- 2:c9471599e9eb
- Parent:
- 0:7a4d80e7ea81
Notch filter 60 Hz version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
t_tatsuoka | 0:7a4d80e7ea81 | 1 | /** |
t_tatsuoka | 0:7a4d80e7ea81 | 2 | * @file FilterTest.h |
t_tatsuoka | 0:7a4d80e7ea81 | 3 | * @brief Header file for FilterTest.cpp |
t_tatsuoka | 2:c9471599e9eb | 4 | * @date 2015.07.30 |
t_tatsuoka | 2:c9471599e9eb | 5 | * @version 1.0.2.1 |
t_tatsuoka | 0:7a4d80e7ea81 | 6 | */ |
t_tatsuoka | 0:7a4d80e7ea81 | 7 | #ifndef _INC_FilterTest |
t_tatsuoka | 0:7a4d80e7ea81 | 8 | #define _INC_FilterTest |
t_tatsuoka | 0:7a4d80e7ea81 | 9 | |
t_tatsuoka | 0:7a4d80e7ea81 | 10 | #include "mbed.h" |
t_tatsuoka | 0:7a4d80e7ea81 | 11 | |
t_tatsuoka | 0:7a4d80e7ea81 | 12 | /* High pass filter fc = 0.5 Hz, fs = 1000 Hz */ |
t_tatsuoka | 0:7a4d80e7ea81 | 13 | #define INIT_HB (0.998431665916719) /* HPF numerator coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 14 | #define INIT_HA (-0.996863331833438) /* HPF denominator coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 15 | |
t_tatsuoka | 0:7a4d80e7ea81 | 16 | /* Low pass filter fc = 30 Hz, fs = 1000 Hz */ |
t_tatsuoka | 0:7a4d80e7ea81 | 17 | #define INIT_LB (0.007820208033497) /* LPF numerator coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 18 | #define INIT_LA1 (-1.734725768809275) /* LPF denominator coefficient 1 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 19 | #define INIT_LA2 (0.766006600943264) /* LPF denominator coefficient 2 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 20 | |
t_tatsuoka | 0:7a4d80e7ea81 | 21 | /* Notch filter fc = 50 Hz, fs = 1000 Hz */ |
t_tatsuoka | 2:c9471599e9eb | 22 | // #define INIT_NB (0.820675769028781) /* BRF numerator coefficient */ |
t_tatsuoka | 2:c9471599e9eb | 23 | // #define INIT_NA1 (-1.561018075800720) /* BRF denominator coefficient 1 */ |
t_tatsuoka | 2:c9471599e9eb | 24 | // #define INIT_NA2 (0.641351538057563) /* BRF denominator coefficient 2 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 25 | |
t_tatsuoka | 0:7a4d80e7ea81 | 26 | // /* Notch filter fc = 60 Hz, fs = 1000 Hz */ |
t_tatsuoka | 2:c9471599e9eb | 27 | #define INIT_NB (0.793459754030595) /* BRF numerator coefficient */ |
t_tatsuoka | 2:c9471599e9eb | 28 | #define INIT_NA1 (-1.475480443592650) /* BRF denominator coefficient 1 */ |
t_tatsuoka | 2:c9471599e9eb | 29 | #define INIT_NA2 (0.586919508061190) /* BRF denominator coefficient 2 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 30 | |
t_tatsuoka | 0:7a4d80e7ea81 | 31 | /** Filter test |
t_tatsuoka | 0:7a4d80e7ea81 | 32 | */ |
t_tatsuoka | 0:7a4d80e7ea81 | 33 | class FilterTest |
t_tatsuoka | 0:7a4d80e7ea81 | 34 | { |
t_tatsuoka | 0:7a4d80e7ea81 | 35 | |
t_tatsuoka | 0:7a4d80e7ea81 | 36 | public: |
t_tatsuoka | 0:7a4d80e7ea81 | 37 | FilterTest(); |
t_tatsuoka | 0:7a4d80e7ea81 | 38 | double calc(double val, int hpf_on, int lpf_on, int brf_on); |
t_tatsuoka | 0:7a4d80e7ea81 | 39 | bool set_hpf_coef(double hb, double ha); |
t_tatsuoka | 0:7a4d80e7ea81 | 40 | bool set_lpf_coef(double lb, double la1, double la2); |
t_tatsuoka | 0:7a4d80e7ea81 | 41 | bool set_brf_coef(double nb, double na1, double na2); |
t_tatsuoka | 0:7a4d80e7ea81 | 42 | |
t_tatsuoka | 0:7a4d80e7ea81 | 43 | private: |
t_tatsuoka | 0:7a4d80e7ea81 | 44 | |
t_tatsuoka | 0:7a4d80e7ea81 | 45 | /* Coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 46 | double _hb; /* High pass filter numerator coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 47 | double _ha; /* High pass filter denominator coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 48 | double _lb; /* Low pass filter numerator coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 49 | double _la1; /* Low pass filter denominator coefficient 1 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 50 | double _la2; /* Low pass filter denominator coefficient 2 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 51 | double _nb; /* Notch filter numerator coefficient */ |
t_tatsuoka | 0:7a4d80e7ea81 | 52 | double _na1; /* Notch filter denominator coefficient 1 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 53 | double _na2; /* Notch filter denominator coefficient 2 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 54 | |
t_tatsuoka | 0:7a4d80e7ea81 | 55 | /* Delay buffer */ |
t_tatsuoka | 0:7a4d80e7ea81 | 56 | double _hw; /* High pass filter delay buffer */ |
t_tatsuoka | 0:7a4d80e7ea81 | 57 | double _lw1; /* Low pass filter delay buffer 1 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 58 | double _lw2; /* Low pass filter delay buffer 2 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 59 | double _nw1; /* Notch filter delay buffer 1 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 60 | double _nw2; /* Notch filter delay buffer 2 */ |
t_tatsuoka | 0:7a4d80e7ea81 | 61 | |
t_tatsuoka | 0:7a4d80e7ea81 | 62 | /* Member functions */ |
t_tatsuoka | 0:7a4d80e7ea81 | 63 | void reset_hpf_buf(); |
t_tatsuoka | 0:7a4d80e7ea81 | 64 | void reset_lpf_buf(); |
t_tatsuoka | 0:7a4d80e7ea81 | 65 | void reset_brf_buf(); |
t_tatsuoka | 0:7a4d80e7ea81 | 66 | double hpf(double x); |
t_tatsuoka | 0:7a4d80e7ea81 | 67 | double lpf(double x); |
t_tatsuoka | 0:7a4d80e7ea81 | 68 | double brf(double x); |
t_tatsuoka | 0:7a4d80e7ea81 | 69 | }; |
t_tatsuoka | 0:7a4d80e7ea81 | 70 | #endif /* INC_FilterTest */ |