Interface 2015年4月号 第1部 第7章のプログラム
Information
FftTest - Interface 2015年4月号 第1部 第7章 のソフトウェア
Program for Section 7 in April 2015 issue of Interface
(Japanese electronics magazine)
概要
このプログラムは、
- ハイパスフィルタ、ローパスフィルタ、ノッチフィルタ
を行うFilterTestクラス、 - FFT (256点)
を行うFftTestクラス、
波形をUSBシリアル通信でホストへ送信するmain関数で構成されています。
FilterTest.h, FilterTest.cpp
- A-Dサンプリング - 1 kSPS
- ハイパスフィルタ(遮断周波数 0.5 Hz、1次バターワース)
- ローパスフィルタ(遮断周波数 30 Hz、2次バターワース)
- ノッチフィルタ(中心周波数 50 Hz、2次)
FftTest.h, FftTest.cpp
- 256点FFT演算 - クーリー-テューキー アルゴリズム 基数-2 時間間引き
- ハン窓(ハニング窓)適用
- パワー値計算
- 振幅値計算
- 振幅値正規化(実効値にスケーリング)
main.cpp
- データ送信レート - 200 SPS
- メインループ - ポーリングにより、サンプリング、フィルタ処理完了フラグがセットされたら、
また、FFT完了フラグがセットされたらUSBシリアル通信経由で、ホストへ送信する
シリアル通信フォーマット
(※)誌面ではパケットサイズ 64 byteとなっていますが、
64 byteでは、PCのUSBドライバが 4096 byteまで保持し、波形が滑らかに描画できないため、
Ver.1.0.2で、32 byteに変更しています。
- 34byte固定長パケット方式
- 波形データパケット、FFTパケットの2種類
波形データパケット | FFTパケット | |
0x00 | パケットヘッダ(固定値0xAA) | パケットヘッダ(固定値0xAA) |
0x01 | データ種別ID(0x01: 波形データ) | (0x02: FFTデータ) |
0x02 | パケット番号(0 - 99繰り返し) | レンジ(0: DC - 23 Hz, 1: 23 - 46 Hz, 2: 46 - 70 Hz) |
0x03 | ペイロードサイズ(固定値30) | ペイロードサイズ(固定値30) |
0x04 - 0x21 | 波形データ(short, big endian) | FFTデータ(unsigned short, big endian) |
Description
This contains FilterTest class, FftTest class and main function.
FilterTest class:
- High pass filter, Low pass, Notch filter
FftTest class:
- FFT (256 points)
Main function:
- Send waveform and FFT data 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
FftTest.h, FftTest.cpp
- 256 points FFT - Cooley-Tukey algorithm Radix-2 Decimation-In-Time
- Apply Hann window
- Calculate power spectrum
- Calculate amplitude spectrum
- Normalize amplitude
main.cpp
- Data sending rate - 200 SPS
- Main loop - sending waveform and FFT data via USB serial interface when detecting ready flag.
Packet format for USB serial interface
- Packet size: 34 bytes(fixed)
- Two types of packet, waveform packet and FFT packet
Waveform packet | FFT packet | |
0x00 | Packet header (0xAA (fixed)) | Packet header (0xAA (fixed)) |
0x01 | Data type ID (0x01: Waveform ID) | (0x02: FFT ID) |
0x02 | Packet number (0 - 99) | Range (0: DC - 23 Hz, 1: 23 - 46 Hz, 2: 46 - 70 Hz) |
0x03 | Payload size (30 (fixed)) | Payload size (30 (fixed)) |
0x04 - 0x21 | Waveform data (short, big endian) | FFT data (unsigned short, big endian) |
FftTest.h@1:537eb14c5332, 2015-07-30 (annotated)
- Committer:
- t_tatsuoka
- Date:
- Thu Jul 30 10:26:38 2015 +0000
- Revision:
- 1:537eb14c5332
- Parent:
- 0:9779b89a8820
Notch filter 60 Hz version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
t_tatsuoka | 0:9779b89a8820 | 1 | /** |
t_tatsuoka | 0:9779b89a8820 | 2 | * @file FftTest.h |
t_tatsuoka | 0:9779b89a8820 | 3 | * @brief Header file for FftTest.cpp |
t_tatsuoka | 0:9779b89a8820 | 4 | * @date 2015.02.24 |
t_tatsuoka | 0:9779b89a8820 | 5 | * @version 1.0.2 |
t_tatsuoka | 0:9779b89a8820 | 6 | */ |
t_tatsuoka | 0:9779b89a8820 | 7 | #ifndef _INC_FftTest |
t_tatsuoka | 0:9779b89a8820 | 8 | #define _INC_FftTest |
t_tatsuoka | 0:9779b89a8820 | 9 | |
t_tatsuoka | 0:9779b89a8820 | 10 | // #define _LARGE_RAM /* Uncomment if using large RAM. */ |
t_tatsuoka | 0:9779b89a8820 | 11 | /* Hann window array and bit reversal array can */ |
t_tatsuoka | 0:9779b89a8820 | 12 | /* be generated dynamically instead of constant. */ |
t_tatsuoka | 0:9779b89a8820 | 13 | |
t_tatsuoka | 0:9779b89a8820 | 14 | #include "mbed.h" |
t_tatsuoka | 0:9779b89a8820 | 15 | |
t_tatsuoka | 0:9779b89a8820 | 16 | /* Constant */ |
t_tatsuoka | 0:9779b89a8820 | 17 | #define PI (3.141592) |
t_tatsuoka | 0:9779b89a8820 | 18 | #define SQRT_2F (1.41421356f) |
t_tatsuoka | 0:9779b89a8820 | 19 | #define DATA_LENGTH (256) |
t_tatsuoka | 0:9779b89a8820 | 20 | |
t_tatsuoka | 0:9779b89a8820 | 21 | /** FFT test |
t_tatsuoka | 0:9779b89a8820 | 22 | */ |
t_tatsuoka | 0:9779b89a8820 | 23 | class FftTest |
t_tatsuoka | 0:9779b89a8820 | 24 | { |
t_tatsuoka | 0:9779b89a8820 | 25 | |
t_tatsuoka | 0:9779b89a8820 | 26 | public: |
t_tatsuoka | 0:9779b89a8820 | 27 | FftTest(); |
t_tatsuoka | 0:9779b89a8820 | 28 | ~FftTest(); |
t_tatsuoka | 0:9779b89a8820 | 29 | void apply_window(float in_data[], float out_data[]); |
t_tatsuoka | 0:9779b89a8820 | 30 | void calc_fft(float in_data[], float out_re_data[], float out_im_data[]); |
t_tatsuoka | 0:9779b89a8820 | 31 | void calc_power(float re_data[], float im_data[], float pow_data[], int32_t dat_len); |
t_tatsuoka | 0:9779b89a8820 | 32 | void calc_amplitude(float pow_data[], float amp_data[], int32_t dat_len); |
t_tatsuoka | 0:9779b89a8820 | 33 | void norm_amplitude(float amp_data[], int32_t dat_len); |
t_tatsuoka | 0:9779b89a8820 | 34 | |
t_tatsuoka | 0:9779b89a8820 | 35 | private: |
t_tatsuoka | 0:9779b89a8820 | 36 | /* Menber variables */ |
t_tatsuoka | 0:9779b89a8820 | 37 | int32_t _dat_len; |
t_tatsuoka | 0:9779b89a8820 | 38 | int32_t _digit_len; |
t_tatsuoka | 0:9779b89a8820 | 39 | #ifdef _LARGE_RAM |
t_tatsuoka | 0:9779b89a8820 | 40 | float* _window_array; |
t_tatsuoka | 0:9779b89a8820 | 41 | int32_t* _br_idx_array; |
t_tatsuoka | 0:9779b89a8820 | 42 | #else |
t_tatsuoka | 0:9779b89a8820 | 43 | static const float _window_array[DATA_LENGTH]; /* Hann window array */ |
t_tatsuoka | 0:9779b89a8820 | 44 | static const int _br_idx_array[DATA_LENGTH]; /* Bit reversal index array */ |
t_tatsuoka | 0:9779b89a8820 | 45 | #endif /* LARGE_RAM */ |
t_tatsuoka | 0:9779b89a8820 | 46 | |
t_tatsuoka | 0:9779b89a8820 | 47 | /* Member functions */ |
t_tatsuoka | 0:9779b89a8820 | 48 | void init(); |
t_tatsuoka | 0:9779b89a8820 | 49 | int32_t get_digit_len(int32_t val); |
t_tatsuoka | 0:9779b89a8820 | 50 | void set_hann_window(); |
t_tatsuoka | 0:9779b89a8820 | 51 | void set_bit_reversal(); |
t_tatsuoka | 0:9779b89a8820 | 52 | }; |
t_tatsuoka | 0:9779b89a8820 | 53 | #endif /* INC_FftTest */ |