スペクトログラム このプログラムの説明は,CQ出版社「トランジスタ技術」の2021年10月号から開始された連載記事「STM32マイコンではじめるPC計測」の中にあります.このプログラムといっしょに使うPC側のプログラムについても同誌を参照してください.

Dependencies:   Array_Matrix mbed SerialTxRxIntr DSP_ADDA UIT_FFT_Real Window

Committer:
MikamiUitOpen
Date:
Thu Apr 21 05:45:48 2022 +0000
Revision:
2:2ca9f8a0f6ef
Parent:
1:d4e3f39ce206
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:3bf11d2ab6ad 1 //--------------------------------------------------------
MikamiUitOpen 0:3bf11d2ab6ad 2 // ダブル・バッファの template クラス
MikamiUitOpen 0:3bf11d2ab6ad 3 // バッファに2次元配列(Matrix クラス)を使用
MikamiUitOpen 0:3bf11d2ab6ad 4 //
MikamiUitOpen 1:d4e3f39ce206 5 // 2021/10/22, Copyright (c) 2021 MIKAMI, Naoki
MikamiUitOpen 0:3bf11d2ab6ad 6 //--------------------------------------------------------
MikamiUitOpen 0:3bf11d2ab6ad 7
MikamiUitOpen 0:3bf11d2ab6ad 8 #ifndef DOUBLE_BUFFER_HPP
MikamiUitOpen 0:3bf11d2ab6ad 9 #define DOUBLE_BUFFER_HPP
MikamiUitOpen 0:3bf11d2ab6ad 10
MikamiUitOpen 0:3bf11d2ab6ad 11 #include "Matrix.hpp"
MikamiUitOpen 0:3bf11d2ab6ad 12 using namespace Mikami;
MikamiUitOpen 0:3bf11d2ab6ad 13
MikamiUitOpen 1:d4e3f39ce206 14 class DoubleBuffer
MikamiUitOpen 0:3bf11d2ab6ad 15 {
MikamiUitOpen 0:3bf11d2ab6ad 16 public:
MikamiUitOpen 0:3bf11d2ab6ad 17 // コンストラクタ
MikamiUitOpen 1:d4e3f39ce206 18 explicit DoubleBuffer(int size, float initialValue = 0)
MikamiUitOpen 0:3bf11d2ab6ad 19 : N_(size), buf_(2, size, initialValue), ping_(0), pong_(1),
MikamiUitOpen 0:3bf11d2ab6ad 20 index_(0), full_(false) {}
MikamiUitOpen 0:3bf11d2ab6ad 21
MikamiUitOpen 0:3bf11d2ab6ad 22 // データを格納
MikamiUitOpen 1:d4e3f39ce206 23 void Store(float data) { buf_[ping_][index_++] = data; }
MikamiUitOpen 0:3bf11d2ab6ad 24
MikamiUitOpen 0:3bf11d2ab6ad 25 // 出力バッファからデータの取り出し
MikamiUitOpen 1:d4e3f39ce206 26 float Get(int n) const { return buf_[pong_][n]; }
MikamiUitOpen 0:3bf11d2ab6ad 27
MikamiUitOpen 0:3bf11d2ab6ad 28 // バッファが満杯でバッファを切り替える
MikamiUitOpen 0:3bf11d2ab6ad 29 void IsFullSwitch()
MikamiUitOpen 0:3bf11d2ab6ad 30 {
MikamiUitOpen 0:3bf11d2ab6ad 31 if (index_ < N_) return;
MikamiUitOpen 0:3bf11d2ab6ad 32
MikamiUitOpen 0:3bf11d2ab6ad 33 ping_ ^= 0x1; // バッファ切換えのため
MikamiUitOpen 0:3bf11d2ab6ad 34 pong_ ^= 0x1; // バッファ切換えのため
MikamiUitOpen 0:3bf11d2ab6ad 35 index_ = 0;
MikamiUitOpen 0:3bf11d2ab6ad 36 full_ = true;
MikamiUitOpen 0:3bf11d2ab6ad 37 }
MikamiUitOpen 0:3bf11d2ab6ad 38
MikamiUitOpen 0:3bf11d2ab6ad 39 // バッファが満杯で,true を返す
MikamiUitOpen 0:3bf11d2ab6ad 40 bool IsFull()
MikamiUitOpen 0:3bf11d2ab6ad 41 {
MikamiUitOpen 0:3bf11d2ab6ad 42 bool temp = full_;
MikamiUitOpen 0:3bf11d2ab6ad 43 if (full_) full_ = false;
MikamiUitOpen 0:3bf11d2ab6ad 44 return temp;
MikamiUitOpen 0:3bf11d2ab6ad 45 }
MikamiUitOpen 0:3bf11d2ab6ad 46
MikamiUitOpen 0:3bf11d2ab6ad 47 private:
MikamiUitOpen 0:3bf11d2ab6ad 48 const int N_; // バッファのサイズ
MikamiUitOpen 1:d4e3f39ce206 49 Matrix<float> buf_; // バッファ
MikamiUitOpen 0:3bf11d2ab6ad 50 int ping_, pong_; // バッファ切替用
MikamiUitOpen 0:3bf11d2ab6ad 51 int index_; // 入力データのカウンタ
MikamiUitOpen 0:3bf11d2ab6ad 52 bool full_; // 満杯の場合 true
MikamiUitOpen 0:3bf11d2ab6ad 53
MikamiUitOpen 0:3bf11d2ab6ad 54 // コピー・コンストラクタおよび代入演算子の禁止のため
MikamiUitOpen 0:3bf11d2ab6ad 55 DoubleBuffer(const DoubleBuffer&);
MikamiUitOpen 0:3bf11d2ab6ad 56 DoubleBuffer& operator=(const DoubleBuffer&);
MikamiUitOpen 0:3bf11d2ab6ad 57 };
MikamiUitOpen 0:3bf11d2ab6ad 58 #endif // DOUBLE_BUFFER_HPP