Interface 2015年4月号 第1部 第7章のプログラム

Dependencies:   USBDevice mbed

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 packetFFT packet
0x00Packet header (0xAA (fixed))Packet header (0xAA (fixed))
0x01Data type ID (0x01: Waveform ID)(0x02: FFT ID)
0x02Packet number (0 - 99)Range (0: DC - 23 Hz, 1: 23 - 46 Hz, 2: 46 - 70 Hz)
0x03Payload size (30 (fixed))Payload size (30 (fixed))
0x04 - 0x21Waveform data (short, big endian)FFT data (unsigned short, big endian)
Committer:
t_tatsuoka
Date:
Mon Feb 23 22:19:58 2015 +0000
Revision:
0:9779b89a8820
Ver. 1.0.2 Initial version

Who changed what in which revision?

UserRevisionLine numberNew 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 */