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
FrquencyResponseDrawer.hpp@1:19a32f6279e6, 2016-05-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon May 09 05:39:50 2016 +0000
- Revision:
- 1:19a32f6279e6
- Parent:
- 0:0bc63b49e2a3
- Child:
- 2:8bccc97de938
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:0bc63b49e2a3 | 1 | //------------------------------------------------------------------------ |
MikamiUitOpen | 0:0bc63b49e2a3 | 2 | // ディジタルフィルタの周波数特性を,周波数軸が対数スケールで描画するクラス(ヘッダ) |
MikamiUitOpen | 0:0bc63b49e2a3 | 3 | // FrqRespDrawer class (header) |
MikamiUitOpen | 0:0bc63b49e2a3 | 4 | // |
MikamiUitOpen | 1:19a32f6279e6 | 5 | // 2016/05/09, 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 |