FFT によるスペクトル解析器
Dependencies: Array_Matrix mbed SerialTxRxIntr UIT_FFT_Real DSP_ADDA
DoubleBuffer.hpp@0:91cc5a03f0ca, 2021-01-08 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Fri Jan 08 02:27:46 2021 +0000
- Revision:
- 0:91cc5a03f0ca
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:91cc5a03f0ca | 1 | //-------------------------------------------------------- |
MikamiUitOpen | 0:91cc5a03f0ca | 2 | // ダブル・バッファの template クラス |
MikamiUitOpen | 0:91cc5a03f0ca | 3 | // 内部のバッファは通常の配列を使用 |
MikamiUitOpen | 0:91cc5a03f0ca | 4 | // |
MikamiUitOpen | 0:91cc5a03f0ca | 5 | // 2019/11/22, Copyright (c) 2019 MIKAMI, Naoki |
MikamiUitOpen | 0:91cc5a03f0ca | 6 | //-------------------------------------------------------- |
MikamiUitOpen | 0:91cc5a03f0ca | 7 | |
MikamiUitOpen | 0:91cc5a03f0ca | 8 | #ifndef DOUBLE_BUFFER_2DARRAY_HPP |
MikamiUitOpen | 0:91cc5a03f0ca | 9 | #define DOUBLE_BUFFER_2DARRAY_HPP |
MikamiUitOpen | 0:91cc5a03f0ca | 10 | |
MikamiUitOpen | 0:91cc5a03f0ca | 11 | template<class T, int N> class DoubleBuffer |
MikamiUitOpen | 0:91cc5a03f0ca | 12 | { |
MikamiUitOpen | 0:91cc5a03f0ca | 13 | public: |
MikamiUitOpen | 0:91cc5a03f0ca | 14 | // コンストラクタ |
MikamiUitOpen | 0:91cc5a03f0ca | 15 | explicit DoubleBuffer(T initialValue) |
MikamiUitOpen | 0:91cc5a03f0ca | 16 | : ping_(0), pong_(1), index_(0), full_(false) |
MikamiUitOpen | 0:91cc5a03f0ca | 17 | { |
MikamiUitOpen | 0:91cc5a03f0ca | 18 | for (int k=0; k<2; k++) |
MikamiUitOpen | 0:91cc5a03f0ca | 19 | for (int n=0; n<N; n++) buf_[k][n] = initialValue; |
MikamiUitOpen | 0:91cc5a03f0ca | 20 | } |
MikamiUitOpen | 0:91cc5a03f0ca | 21 | |
MikamiUitOpen | 0:91cc5a03f0ca | 22 | // データを格納 |
MikamiUitOpen | 0:91cc5a03f0ca | 23 | void Store(T data) { buf_[ping_][index_++] = data; } |
MikamiUitOpen | 0:91cc5a03f0ca | 24 | |
MikamiUitOpen | 0:91cc5a03f0ca | 25 | // 出力バッファからデータの取り出し |
MikamiUitOpen | 0:91cc5a03f0ca | 26 | T Get(int n) const { return buf_[pong_][n]; } |
MikamiUitOpen | 0:91cc5a03f0ca | 27 | |
MikamiUitOpen | 0:91cc5a03f0ca | 28 | // バッファが満杯でバッファを切り替える |
MikamiUitOpen | 0:91cc5a03f0ca | 29 | void IfFullSwitch() |
MikamiUitOpen | 0:91cc5a03f0ca | 30 | { |
MikamiUitOpen | 0:91cc5a03f0ca | 31 | if (index_ < N) return; |
MikamiUitOpen | 0:91cc5a03f0ca | 32 | |
MikamiUitOpen | 0:91cc5a03f0ca | 33 | ping_ ^= 0x1; // バッファ切換えのため |
MikamiUitOpen | 0:91cc5a03f0ca | 34 | pong_ ^= 0x1; // バッファ切換えのため |
MikamiUitOpen | 0:91cc5a03f0ca | 35 | index_ = 0; |
MikamiUitOpen | 0:91cc5a03f0ca | 36 | full_ = true; |
MikamiUitOpen | 0:91cc5a03f0ca | 37 | } |
MikamiUitOpen | 0:91cc5a03f0ca | 38 | |
MikamiUitOpen | 0:91cc5a03f0ca | 39 | // バッファが満杯で,true を返す |
MikamiUitOpen | 0:91cc5a03f0ca | 40 | bool IsFull() |
MikamiUitOpen | 0:91cc5a03f0ca | 41 | { |
MikamiUitOpen | 0:91cc5a03f0ca | 42 | bool temp = full_; |
MikamiUitOpen | 0:91cc5a03f0ca | 43 | if (full_) full_ = false; |
MikamiUitOpen | 0:91cc5a03f0ca | 44 | return temp; |
MikamiUitOpen | 0:91cc5a03f0ca | 45 | } |
MikamiUitOpen | 0:91cc5a03f0ca | 46 | |
MikamiUitOpen | 0:91cc5a03f0ca | 47 | private: |
MikamiUitOpen | 0:91cc5a03f0ca | 48 | T buf_[2][N]; // 標本化したデータのバッファ |
MikamiUitOpen | 0:91cc5a03f0ca | 49 | int ping_, pong_; // バッファ切替用 |
MikamiUitOpen | 0:91cc5a03f0ca | 50 | int index_; // 入力データのカウンタ |
MikamiUitOpen | 0:91cc5a03f0ca | 51 | bool full_; // 満杯の場合 true |
MikamiUitOpen | 0:91cc5a03f0ca | 52 | |
MikamiUitOpen | 0:91cc5a03f0ca | 53 | // コピー・コンストラクタおよび代入演算子の禁止のため |
MikamiUitOpen | 0:91cc5a03f0ca | 54 | DoubleBuffer(const DoubleBuffer&); |
MikamiUitOpen | 0:91cc5a03f0ca | 55 | DoubleBuffer& operator=(const DoubleBuffer&); |
MikamiUitOpen | 0:91cc5a03f0ca | 56 | }; |
MikamiUitOpen | 0:91cc5a03f0ca | 57 | #endif // DOUBLE_BUFFER_2DARRAY_HPP |
MikamiUitOpen | 0:91cc5a03f0ca | 58 |