ノイズを付加した正弦波発生器 Sinusoidal wave generator with noise.

Dependencies:   F746_GUI F746_SAI_IO Random mbed

Committer:
MikamiUitOpen
Date:
Sun Nov 04 02:41:21 2018 +0000
Revision:
0:31361b0fcdad
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:31361b0fcdad 1 //-----------------------------------------------------------
MikamiUitOpen 0:31361b0fcdad 2 // ディジタルフィルタ実験のためのプラットフォームの
MikamiUitOpen 0:31361b0fcdad 3 // LCD パネル表示と入力信号の周波数設定で使う
MikamiUitOpen 0:31361b0fcdad 4 //
MikamiUitOpen 0:31361b0fcdad 5 // 2018/11/03, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:31361b0fcdad 6 //-----------------------------------------------------------
MikamiUitOpen 0:31361b0fcdad 7
MikamiUitOpen 0:31361b0fcdad 8 #ifndef PANEL_MANIPULATOR_HPP
MikamiUitOpen 0:31361b0fcdad 9 #define PANEL_MANIPULATOR_HPP
MikamiUitOpen 0:31361b0fcdad 10
MikamiUitOpen 0:31361b0fcdad 11 #include "F746_GUI.hpp"
MikamiUitOpen 0:31361b0fcdad 12 #include "NumericUpDown.hpp"
MikamiUitOpen 0:31361b0fcdad 13 #include "Zoom.hpp"
MikamiUitOpen 0:31361b0fcdad 14 #include "WaveformDisplay.hpp"
MikamiUitOpen 0:31361b0fcdad 15 #include "Trigger.hpp"
MikamiUitOpen 0:31361b0fcdad 16
MikamiUitOpen 0:31361b0fcdad 17 namespace Mikami
MikamiUitOpen 0:31361b0fcdad 18 {
MikamiUitOpen 0:31361b0fcdad 19 class LcdPanel
MikamiUitOpen 0:31361b0fcdad 20 {
MikamiUitOpen 0:31361b0fcdad 21 public:
MikamiUitOpen 0:31361b0fcdad 22 // ts : 標本化間隔(単位:μs)
MikamiUitOpen 0:31361b0fcdad 23 LcdPanel(float ts)
MikamiUitOpen 0:31361b0fcdad 24 : TS_(ts), lcd_(GuiBase::GetLcd()),
MikamiUitOpen 0:31361b0fcdad 25 xnD_(N_DISP_BUF_), frq_(1000),
MikamiUitOpen 0:31361b0fcdad 26 dPhi_(PI2_*frq_*TS_), phi_(0), factor_(1),
MikamiUitOpen 0:31361b0fcdad 27 noiseLevel_(0)
MikamiUitOpen 0:31361b0fcdad 28 {
MikamiUitOpen 0:31361b0fcdad 29 Label title(240, 10, "Sin+Noise Generator", Label::CENTER, Font16);
MikamiUitOpen 0:31361b0fcdad 30
MikamiUitOpen 0:31361b0fcdad 31 // 表示するデータ数: 400個
MikamiUitOpen 0:31361b0fcdad 32 waveDisp_ = new WaveformDisplay(lcd_, 30, 90, xnD_, 400, 8,
MikamiUitOpen 0:31361b0fcdad 33 AXIS_COLOR_,
MikamiUitOpen 0:31361b0fcdad 34 LINE_COLOR1_, LINE_COLOR2_,
MikamiUitOpen 0:31361b0fcdad 35 BACK_COLOR_);
MikamiUitOpen 0:31361b0fcdad 36
MikamiUitOpen 0:31361b0fcdad 37 // GUI 設定
MikamiUitOpen 0:31361b0fcdad 38 ud_ = new NumericUpDown(4, 0, 271, frq_, 9999, 100, "Hz");
MikamiUitOpen 0:31361b0fcdad 39 bar_ = new SeekBar(230, 250, 230,
MikamiUitOpen 0:31361b0fcdad 40 log10f(MIN_FRQ_), log10f(MAX_FRQ_), log10f(1000),
MikamiUitOpen 0:31361b0fcdad 41 "0.1", "1.0", "10.0");
MikamiUitOpen 0:31361b0fcdad 42 // ノイズ・レベルの設定用
MikamiUitOpen 0:31361b0fcdad 43 nLevel_ = new SeekBar(270, 185, 190, 0, 1.0f, 0, "0", "0.5", "1.0");
MikamiUitOpen 0:31361b0fcdad 44
MikamiUitOpen 0:31361b0fcdad 45 // 時間軸の拡大率は 8 倍まで
MikamiUitOpen 0:31361b0fcdad 46 zmButton_ = new ZoomButton(180, 170, 30, 30, 8);
MikamiUitOpen 0:31361b0fcdad 47 }
MikamiUitOpen 0:31361b0fcdad 48
MikamiUitOpen 0:31361b0fcdad 49 // 正弦波の発生で使う値の更新し,取得する
MikamiUitOpen 0:31361b0fcdad 50 float GetPhi()
MikamiUitOpen 0:31361b0fcdad 51 {
MikamiUitOpen 0:31361b0fcdad 52 if ((phi_ += dPhi_) > PI2_) phi_ -= PI2_;
MikamiUitOpen 0:31361b0fcdad 53 return phi_;
MikamiUitOpen 0:31361b0fcdad 54 }
MikamiUitOpen 0:31361b0fcdad 55
MikamiUitOpen 0:31361b0fcdad 56 // 周波数設定の更新とズームイン/アウト・ボタンの処理
MikamiUitOpen 0:31361b0fcdad 57 void Update()
MikamiUitOpen 0:31361b0fcdad 58 {
MikamiUitOpen 0:31361b0fcdad 59 if (bar_->Slide()) // 周波数設定用 SeekBar をスライドした場合の処理
MikamiUitOpen 0:31361b0fcdad 60 {
MikamiUitOpen 0:31361b0fcdad 61 frq_ = (int)(powf(10, bar_->GetValue())+0.5f);
MikamiUitOpen 0:31361b0fcdad 62 if (frq_ >= MAX_FRQ_) frq_ = MAX_FRQ_ - 1;
MikamiUitOpen 0:31361b0fcdad 63 ud_->Set(frq_); // SeekBar の数値を NumericUpDown に表示する
MikamiUitOpen 0:31361b0fcdad 64 dPhi_ = PI2_*frq_*TS_;
MikamiUitOpen 0:31361b0fcdad 65 }
MikamiUitOpen 0:31361b0fcdad 66
MikamiUitOpen 0:31361b0fcdad 67 if (nLevel_->Slide()) // ノイズ・レベル設定用 SeekBar をスライドした場合の処理
MikamiUitOpen 0:31361b0fcdad 68 noiseLevel_ = nLevel_->GetValue();
MikamiUitOpen 0:31361b0fcdad 69
MikamiUitOpen 0:31361b0fcdad 70 if (ud_->Touched()) // NumericUpDown をタッチした場合の処理
MikamiUitOpen 0:31361b0fcdad 71 {
MikamiUitOpen 0:31361b0fcdad 72 frq_ = ud_->Get();
MikamiUitOpen 0:31361b0fcdad 73 bar_->Draw(log10f(frq_)); // NumericUpDown の数値で SeekBar のツマミの位置を設定
MikamiUitOpen 0:31361b0fcdad 74 dPhi_ = PI2_*frq_*TS_;
MikamiUitOpen 0:31361b0fcdad 75 }
MikamiUitOpen 0:31361b0fcdad 76
MikamiUitOpen 0:31361b0fcdad 77 zmButton_->Touched(factor_); // ズームインとズームアウト
MikamiUitOpen 0:31361b0fcdad 78 }
MikamiUitOpen 0:31361b0fcdad 79
MikamiUitOpen 0:31361b0fcdad 80 // 入出力信号のデータを表示用バッファへ格納
MikamiUitOpen 0:31361b0fcdad 81 void Store(int16_t xn, int n)
MikamiUitOpen 0:31361b0fcdad 82 {
MikamiUitOpen 0:31361b0fcdad 83 // N_DISP_BUF_ (= 1000) 個を越えたデータは格納しない
MikamiUitOpen 0:31361b0fcdad 84 if (n >= N_DISP_BUF_) return;
MikamiUitOpen 0:31361b0fcdad 85
MikamiUitOpen 0:31361b0fcdad 86 xnD_[n] = xn;
MikamiUitOpen 0:31361b0fcdad 87 }
MikamiUitOpen 0:31361b0fcdad 88
MikamiUitOpen 0:31361b0fcdad 89 // 入出力信号の波形の表示(トリガ条件を満足したところから表示する)
MikamiUitOpen 0:31361b0fcdad 90 void Display() { waveDisp_->Execute(Trigger(xnD_, 1), factor_); }
MikamiUitOpen 0:31361b0fcdad 91
MikamiUitOpen 0:31361b0fcdad 92 // ノイズの大きさの取得
MikamiUitOpen 0:31361b0fcdad 93 float GetNoiseLevel() { return noiseLevel_; }
MikamiUitOpen 0:31361b0fcdad 94
MikamiUitOpen 0:31361b0fcdad 95 private:
MikamiUitOpen 0:31361b0fcdad 96 static const float PI_ = 3.1415926536f;
MikamiUitOpen 0:31361b0fcdad 97 static const float PI2_ = 2.0f*PI_;
MikamiUitOpen 0:31361b0fcdad 98 static const int MIN_FRQ_ = 100; // 発生する周波数の最小値
MikamiUitOpen 0:31361b0fcdad 99 static const int MAX_FRQ_ = 10000; // 発生する周波数の最大値
MikamiUitOpen 0:31361b0fcdad 100 static const uint32_t BACK_COLOR_ = GuiBase::ENUM_BACK;
MikamiUitOpen 0:31361b0fcdad 101 static const uint32_t AXIS_COLOR_ = 0xFFCCFFFF;
MikamiUitOpen 0:31361b0fcdad 102 static const uint32_t LINE_COLOR1_ = LCD_COLOR_CYAN;
MikamiUitOpen 0:31361b0fcdad 103 static const uint32_t LINE_COLOR2_ = LCD_COLOR_MAGENTA;
MikamiUitOpen 0:31361b0fcdad 104 static const int N_DISP_BUF_ = 1000; // 波形表示用のバッファのサイズ
MikamiUitOpen 0:31361b0fcdad 105
MikamiUitOpen 0:31361b0fcdad 106 const float TS_; // 標本化間隔
MikamiUitOpen 0:31361b0fcdad 107
MikamiUitOpen 0:31361b0fcdad 108 LCD_DISCO_F746NG &lcd_;
MikamiUitOpen 0:31361b0fcdad 109 WaveformDisplay *waveDisp_;
MikamiUitOpen 0:31361b0fcdad 110 NumericUpDown *ud_; // 入力信号の周波数設定用(1 Hz 単位での設定用)
MikamiUitOpen 0:31361b0fcdad 111 SeekBar *bar_; // 入力信号の周波数設定用(概略の設定用)
MikamiUitOpen 0:31361b0fcdad 112 SeekBar *nLevel_; // ノイズの大きさの設定用
MikamiUitOpen 0:31361b0fcdad 113 ZoomButton *zmButton_; // 波形表示:ズームイン/アウト用
MikamiUitOpen 0:31361b0fcdad 114
MikamiUitOpen 0:31361b0fcdad 115 Array<int16_t> xnD_; // 波形表示で使うバッファ(入力信号用)
MikamiUitOpen 0:31361b0fcdad 116 int frq_; // 現在の入力信号の周波数,初期値は 1 kHz
MikamiUitOpen 0:31361b0fcdad 117 float dPhi_, phi_; // 入力信号の生成で使う変数
MikamiUitOpen 0:31361b0fcdad 118 int factor_; // 波形表示の際の標本化間隔に対応するピクセル数
MikamiUitOpen 0:31361b0fcdad 119 float noiseLevel_; // ノイズの大きさ
MikamiUitOpen 0:31361b0fcdad 120 };
MikamiUitOpen 0:31361b0fcdad 121 }
MikamiUitOpen 0:31361b0fcdad 122 #endif // PANEL_MANIPULATOR_HPP