![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
スペクトログラム このプログラムの説明は,CQ出版社「トランジスタ技術」の2021年10月号から開始された連載記事「STM32マイコンではじめるPC計測」の中にあります.このプログラムといっしょに使うPC側のプログラムについても同誌を参照してください.
Dependencies: Array_Matrix mbed SerialTxRxIntr DSP_ADDA UIT_FFT_Real Window
DoubleBuffer.hpp@2:2ca9f8a0f6ef, 2022-04-21 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Apr 21 05:45:48 2022 +0000
- Revision:
- 2:2ca9f8a0f6ef
- Parent:
- 1:d4e3f39ce206
3
Who changed what in which revision?
User | Revision | Line number | New 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 |