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
Diff: FrquencyResponseDrawer.hpp
- Revision:
- 0:0bc63b49e2a3
- Child:
- 1:19a32f6279e6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FrquencyResponseDrawer.hpp Sun May 01 14:00:06 2016 +0000 @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------ +// ディジタルフィルタの周波数特性を,周波数軸が対数スケールで描画するクラス(ヘッダ) +// FrqRespDrawer class (header) +// +// 2016/05/01, Copyright (c) 2016 MIKAMI, Naoki +//------------------------------------------------------------------------ + +#ifndef F746_FRQ_RESP_DRAWER_HPP +#define F746_FRQ_RESP_DRAWER_HPP + +#include "NumericLabel.hpp" +#include "FrequancyResponseBase.hpp" + +namespace Mikami +{ + class FrqRespDrawer + { + public: + // 横軸の目盛値を描画する際に使う構造体 + struct AxisX_Char { uint16_t frq; string str; }; + + // Constructor + FrqRespDrawer(uint16_t orgX, float min, float max, + uint16_t dec, // 周波数の 10 倍に対応する長さ(ピクセル数) + uint16_t orgY, + float minDb, // 表示する dB 値の最小値 + float maxDb, // 表示する dB 値の最大値 + float db1Pixel, // 1 dB に対応するピクセル数 + float ySpace, // 目盛線の縦方向の間隔(dB 単位) + float fs, + uint32_t lineColor = 0xFF00B0FF, + uint32_t axisColor = LCD_COLOR_LIGHTGRAY, + uint32_t backColor = GuiBase::ENUM_BACK) + : lcd_(GuiBase::GetLcdPtr()), + ORGX_(orgX), MIN_(min), MAX_(max), DEC_(dec), + ORGY_(orgY), MIN_DB_(minDb), MAX_DB_(maxDb), + DB1_(db1Pixel), Y_SPACE_(db1Pixel*ySpace), FS_(fs), + LINE_COLOR_(lineColor), + AXIS_COLOR_(axisColor), + BACK_COLOR_(backColor) {} + + // 周波数に対応する x 座標値の取得 + int X(float frq) + { return Round(ORGX_ + DEC_*log10f(frq/MIN_)); } + + // x 座標値を周波数に変換 + float PosToFrq(uint16_t x) + { return MIN_*powf(10.0f, (x - ORGX_)/(float)DEC_); } + + // 目盛線の描画 + void DrawAxis(); + + // 横軸の目盛値の表示 + void DrawNumericX(AxisX_Char xChar[], int nDisp, int offsetY, + string str, sFONT &fonts = Font12, + uint32_t textColor = LCD_COLOR_WHITE); + + // 縦軸の目盛値の表示 + void DrawNumericY(int offsetX, int offsetY, uint16_t d_dB, + const char fmt[], sFONT &fonts = Font12, + uint32_t textColor = LCD_COLOR_WHITE, + string str = "[dB]"); + + // 周波数特性のグラフの描画 + void DrawGraph(FrequencyResponse *frqResp, uint32_t color); + void DrawGraph(FrequencyResponse *frqResp) + { DrawGraph(frqResp, LINE_COLOR_);} + + // 消去 + // upDb : 消去する範囲の上限(dB 単位) + void Erase(float upDb = 0); + + private: + LCD_DISCO_F746NG *lcd_; + const uint16_t ORGX_; // 横軸の目盛の最小値に対応する位置 + const float MIN_; // 横軸の目盛の最小値 + const float MAX_; // 横軸の目盛の最大値 + const uint16_t DEC_; // 周波数の 10 倍に対応する長さ (pixels) + const uint16_t ORGY_; // 縦軸の目盛の最小値に対応する位置 + const float MIN_DB_; // 縦軸の目盛の最小値 [dB] + const float MAX_DB_; // 縦軸の目盛の最大値 [dB] + const float DB1_; // 1 dB に対応する pixels 数 + const float Y_SPACE_; // 縦軸の目盛線の間隔に対応する pixels 数 + const float FS_; // 標本化周波数 + const uint32_t LINE_COLOR_; + const uint32_t AXIS_COLOR_; + const uint32_t BACK_COLOR_; + + // 丸め + int Round(float x) { return x + 0.5f - (x < 0); } + + // 10 のべき乗かどうかの検査 + bool PowersOf10(float x) + { return fabsf(log10f(x) - Round(log10f(x))) < 0.01f; } + + // disallow copy constructor and assignment operator + FrqRespDrawer(const FrqRespDrawer&); + FrqRespDrawer& operator=(const FrqRespDrawer&); + }; +} +#endif // F746_FRQ_RESP_DRAWER_HPP