FrqRespDrawer class to draw frequency response for digital filter. ディジタルフィルタの周波数特性を,周波数軸をログスケールで描画するための FrqRespDrawer クラス. このライブラリを登録した際のプログラム:「F746_FrequencyResponseDrawer_Demo」

Dependents:   F746_SD_WavPlayer F746_SD_GraphicEqualizer_ren0620 F746_FrequencyResponseDrawer_Demo F746_SD_VarableFilter ... more

Committer:
MikamiUitOpen
Date:
Sun May 01 14:00:06 2016 +0000
Revision:
0:0bc63b49e2a3
Child:
1:19a32f6279e6
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:0bc63b49e2a3 1 //------------------------------------------------------------------------
MikamiUitOpen 0:0bc63b49e2a3 2 // ディジタルフィルタの周波数特性を,周波数軸が対数スケールで描画するクラス(ヘッダ)
MikamiUitOpen 0:0bc63b49e2a3 3 // FrqRespDrawer class (header)
MikamiUitOpen 0:0bc63b49e2a3 4 //
MikamiUitOpen 0:0bc63b49e2a3 5 // 2016/05/01, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:0bc63b49e2a3 6 //------------------------------------------------------------------------
MikamiUitOpen 0:0bc63b49e2a3 7
MikamiUitOpen 0:0bc63b49e2a3 8 #ifndef F746_FRQ_RESP_DRAWER_HPP
MikamiUitOpen 0:0bc63b49e2a3 9 #define F746_FRQ_RESP_DRAWER_HPP
MikamiUitOpen 0:0bc63b49e2a3 10
MikamiUitOpen 0:0bc63b49e2a3 11 #include "NumericLabel.hpp"
MikamiUitOpen 0:0bc63b49e2a3 12 #include "FrequancyResponseBase.hpp"
MikamiUitOpen 0:0bc63b49e2a3 13
MikamiUitOpen 0:0bc63b49e2a3 14 namespace Mikami
MikamiUitOpen 0:0bc63b49e2a3 15 {
MikamiUitOpen 0:0bc63b49e2a3 16 class FrqRespDrawer
MikamiUitOpen 0:0bc63b49e2a3 17 {
MikamiUitOpen 0:0bc63b49e2a3 18 public:
MikamiUitOpen 0:0bc63b49e2a3 19 // 横軸の目盛値を描画する際に使う構造体
MikamiUitOpen 0:0bc63b49e2a3 20 struct AxisX_Char { uint16_t frq; string str; };
MikamiUitOpen 0:0bc63b49e2a3 21
MikamiUitOpen 0:0bc63b49e2a3 22 // Constructor
MikamiUitOpen 0:0bc63b49e2a3 23 FrqRespDrawer(uint16_t orgX, float min, float max,
MikamiUitOpen 0:0bc63b49e2a3 24 uint16_t dec, // 周波数の 10 倍に対応する長さ(ピクセル数)
MikamiUitOpen 0:0bc63b49e2a3 25 uint16_t orgY,
MikamiUitOpen 0:0bc63b49e2a3 26 float minDb, // 表示する dB 値の最小値
MikamiUitOpen 0:0bc63b49e2a3 27 float maxDb, // 表示する dB 値の最大値
MikamiUitOpen 0:0bc63b49e2a3 28 float db1Pixel, // 1 dB に対応するピクセル数
MikamiUitOpen 0:0bc63b49e2a3 29 float ySpace, // 目盛線の縦方向の間隔(dB 単位)
MikamiUitOpen 0:0bc63b49e2a3 30 float fs,
MikamiUitOpen 0:0bc63b49e2a3 31 uint32_t lineColor = 0xFF00B0FF,
MikamiUitOpen 0:0bc63b49e2a3 32 uint32_t axisColor = LCD_COLOR_LIGHTGRAY,
MikamiUitOpen 0:0bc63b49e2a3 33 uint32_t backColor = GuiBase::ENUM_BACK)
MikamiUitOpen 0:0bc63b49e2a3 34 : lcd_(GuiBase::GetLcdPtr()),
MikamiUitOpen 0:0bc63b49e2a3 35 ORGX_(orgX), MIN_(min), MAX_(max), DEC_(dec),
MikamiUitOpen 0:0bc63b49e2a3 36 ORGY_(orgY), MIN_DB_(minDb), MAX_DB_(maxDb),
MikamiUitOpen 0:0bc63b49e2a3 37 DB1_(db1Pixel), Y_SPACE_(db1Pixel*ySpace), FS_(fs),
MikamiUitOpen 0:0bc63b49e2a3 38 LINE_COLOR_(lineColor),
MikamiUitOpen 0:0bc63b49e2a3 39 AXIS_COLOR_(axisColor),
MikamiUitOpen 0:0bc63b49e2a3 40 BACK_COLOR_(backColor) {}
MikamiUitOpen 0:0bc63b49e2a3 41
MikamiUitOpen 0:0bc63b49e2a3 42 // 周波数に対応する x 座標値の取得
MikamiUitOpen 0:0bc63b49e2a3 43 int X(float frq)
MikamiUitOpen 0:0bc63b49e2a3 44 { return Round(ORGX_ + DEC_*log10f(frq/MIN_)); }
MikamiUitOpen 0:0bc63b49e2a3 45
MikamiUitOpen 0:0bc63b49e2a3 46 // x 座標値を周波数に変換
MikamiUitOpen 0:0bc63b49e2a3 47 float PosToFrq(uint16_t x)
MikamiUitOpen 0:0bc63b49e2a3 48 { return MIN_*powf(10.0f, (x - ORGX_)/(float)DEC_); }
MikamiUitOpen 0:0bc63b49e2a3 49
MikamiUitOpen 0:0bc63b49e2a3 50 // 目盛線の描画
MikamiUitOpen 0:0bc63b49e2a3 51 void DrawAxis();
MikamiUitOpen 0:0bc63b49e2a3 52
MikamiUitOpen 0:0bc63b49e2a3 53 // 横軸の目盛値の表示
MikamiUitOpen 0:0bc63b49e2a3 54 void DrawNumericX(AxisX_Char xChar[], int nDisp, int offsetY,
MikamiUitOpen 0:0bc63b49e2a3 55 string str, sFONT &fonts = Font12,
MikamiUitOpen 0:0bc63b49e2a3 56 uint32_t textColor = LCD_COLOR_WHITE);
MikamiUitOpen 0:0bc63b49e2a3 57
MikamiUitOpen 0:0bc63b49e2a3 58 // 縦軸の目盛値の表示
MikamiUitOpen 0:0bc63b49e2a3 59 void DrawNumericY(int offsetX, int offsetY, uint16_t d_dB,
MikamiUitOpen 0:0bc63b49e2a3 60 const char fmt[], sFONT &fonts = Font12,
MikamiUitOpen 0:0bc63b49e2a3 61 uint32_t textColor = LCD_COLOR_WHITE,
MikamiUitOpen 0:0bc63b49e2a3 62 string str = "[dB]");
MikamiUitOpen 0:0bc63b49e2a3 63
MikamiUitOpen 0:0bc63b49e2a3 64 // 周波数特性のグラフの描画
MikamiUitOpen 0:0bc63b49e2a3 65 void DrawGraph(FrequencyResponse *frqResp, uint32_t color);
MikamiUitOpen 0:0bc63b49e2a3 66 void DrawGraph(FrequencyResponse *frqResp)
MikamiUitOpen 0:0bc63b49e2a3 67 { DrawGraph(frqResp, LINE_COLOR_);}
MikamiUitOpen 0:0bc63b49e2a3 68
MikamiUitOpen 0:0bc63b49e2a3 69 // 消去
MikamiUitOpen 0:0bc63b49e2a3 70 // upDb : 消去する範囲の上限(dB 単位)
MikamiUitOpen 0:0bc63b49e2a3 71 void Erase(float upDb = 0);
MikamiUitOpen 0:0bc63b49e2a3 72
MikamiUitOpen 0:0bc63b49e2a3 73 private:
MikamiUitOpen 0:0bc63b49e2a3 74 LCD_DISCO_F746NG *lcd_;
MikamiUitOpen 0:0bc63b49e2a3 75 const uint16_t ORGX_; // 横軸の目盛の最小値に対応する位置
MikamiUitOpen 0:0bc63b49e2a3 76 const float MIN_; // 横軸の目盛の最小値
MikamiUitOpen 0:0bc63b49e2a3 77 const float MAX_; // 横軸の目盛の最大値
MikamiUitOpen 0:0bc63b49e2a3 78 const uint16_t DEC_; // 周波数の 10 倍に対応する長さ (pixels)
MikamiUitOpen 0:0bc63b49e2a3 79 const uint16_t ORGY_; // 縦軸の目盛の最小値に対応する位置
MikamiUitOpen 0:0bc63b49e2a3 80 const float MIN_DB_; // 縦軸の目盛の最小値 [dB]
MikamiUitOpen 0:0bc63b49e2a3 81 const float MAX_DB_; // 縦軸の目盛の最大値 [dB]
MikamiUitOpen 0:0bc63b49e2a3 82 const float DB1_; // 1 dB に対応する pixels 数
MikamiUitOpen 0:0bc63b49e2a3 83 const float Y_SPACE_; // 縦軸の目盛線の間隔に対応する pixels 数
MikamiUitOpen 0:0bc63b49e2a3 84 const float FS_; // 標本化周波数
MikamiUitOpen 0:0bc63b49e2a3 85 const uint32_t LINE_COLOR_;
MikamiUitOpen 0:0bc63b49e2a3 86 const uint32_t AXIS_COLOR_;
MikamiUitOpen 0:0bc63b49e2a3 87 const uint32_t BACK_COLOR_;
MikamiUitOpen 0:0bc63b49e2a3 88
MikamiUitOpen 0:0bc63b49e2a3 89 // 丸め
MikamiUitOpen 0:0bc63b49e2a3 90 int Round(float x) { return x + 0.5f - (x < 0); }
MikamiUitOpen 0:0bc63b49e2a3 91
MikamiUitOpen 0:0bc63b49e2a3 92 // 10 のべき乗かどうかの検査
MikamiUitOpen 0:0bc63b49e2a3 93 bool PowersOf10(float x)
MikamiUitOpen 0:0bc63b49e2a3 94 { return fabsf(log10f(x) - Round(log10f(x))) < 0.01f; }
MikamiUitOpen 0:0bc63b49e2a3 95
MikamiUitOpen 0:0bc63b49e2a3 96 // disallow copy constructor and assignment operator
MikamiUitOpen 0:0bc63b49e2a3 97 FrqRespDrawer(const FrqRespDrawer&);
MikamiUitOpen 0:0bc63b49e2a3 98 FrqRespDrawer& operator=(const FrqRespDrawer&);
MikamiUitOpen 0:0bc63b49e2a3 99 };
MikamiUitOpen 0:0bc63b49e2a3 100 }
MikamiUitOpen 0:0bc63b49e2a3 101 #endif // F746_FRQ_RESP_DRAWER_HPP