Interface 2015年4月号 第1部 第5章および第6章のプログラム

Dependencies:   USBDevice mbed

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
0x00Packet header (0xAA (fixed))
0x01Data type ID (0x01: Waveform ID)
0x02Packet number (0 - 99)
0x03Payload size (30 (fixed))
0x04 - 0x21Waveform data (short, big endian)
Committer:
t_tatsuoka
Date:
Sat Feb 21 19:28:57 2015 +0000
Revision:
0:7a4d80e7ea81
Child:
2:c9471599e9eb
Ver. 1.0.1  Published initial version

Who changed what in which revision?

UserRevisionLine numberNew 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 0:7a4d80e7ea81 4 * @date 2015.02.22
t_tatsuoka 0:7a4d80e7ea81 5 * @version 1.0.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 0:7a4d80e7ea81 22 #define INIT_NB (0.820675769028781) /* BRF numerator coefficient */
t_tatsuoka 0:7a4d80e7ea81 23 #define INIT_NA1 (-1.561018075800720) /* BRF denominator coefficient 1 */
t_tatsuoka 0:7a4d80e7ea81 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 0:7a4d80e7ea81 27 // #define INIT_NB (0.793459754030595) /* BRF numerator coefficient */
t_tatsuoka 0:7a4d80e7ea81 28 // #define INIT_NA1 (-1.475480443592650) /* BRF denominator coefficient 1 */
t_tatsuoka 0:7a4d80e7ea81 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 */