FFT によるスペクトル解析器

Dependencies:   Array_Matrix mbed SerialTxRxIntr UIT_FFT_Real DSP_ADDA

Committer:
MikamiUitOpen
Date:
Fri Jan 08 02:27:46 2021 +0000
Revision:
0:91cc5a03f0ca
1

Who changed what in which revision?

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