Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: F746_GUI Array_Matrix TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG SDFileSystem_Warning_Fixed FrequencyResponseDrawer F746_SAI_IO
MyClasses_Functions/FrquencyResponseDrawer.cpp@0:04b43b777fae, 2016-04-19 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Apr 19 09:46:11 2016 +0000
- Revision:
- 0:04b43b777fae
- Child:
- 2:2478e7a8e8d5
1
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| MikamiUitOpen | 0:04b43b777fae | 1 | //----------------------------------------------------------- |
| MikamiUitOpen | 0:04b43b777fae | 2 | // 周波数が対数スケールの周波数特性を描画するクラス |
| MikamiUitOpen | 0:04b43b777fae | 3 | // FrqRespDrawer class |
| MikamiUitOpen | 0:04b43b777fae | 4 | // |
| MikamiUitOpen | 0:04b43b777fae | 5 | // 2016/04/18, Copyright (c) 2016 MIKAMI, Naoki |
| MikamiUitOpen | 0:04b43b777fae | 6 | //----------------------------------------------------------- |
| MikamiUitOpen | 0:04b43b777fae | 7 | |
| MikamiUitOpen | 0:04b43b777fae | 8 | #include "FrquencyResponseDrawer.hpp" |
| MikamiUitOpen | 0:04b43b777fae | 9 | |
| MikamiUitOpen | 0:04b43b777fae | 10 | namespace Mikami |
| MikamiUitOpen | 0:04b43b777fae | 11 | { |
| MikamiUitOpen | 0:04b43b777fae | 12 | // 目盛線の描画 |
| MikamiUitOpen | 0:04b43b777fae | 13 | void FrqRespDrawer::DrawAxis() |
| MikamiUitOpen | 0:04b43b777fae | 14 | { |
| MikamiUitOpen | 0:04b43b777fae | 15 | uint16_t height = DB1_*(MAX_DB_ - MIN_DB_); |
| MikamiUitOpen | 0:04b43b777fae | 16 | int logMin = (int)floorf(log10f(MIN_)); |
| MikamiUitOpen | 0:04b43b777fae | 17 | int loop = (int)floorf(log10f(MAX_)) - logMin; |
| MikamiUitOpen | 0:04b43b777fae | 18 | |
| MikamiUitOpen | 0:04b43b777fae | 19 | lcd_->SetTextColor(AXIS_COLOR_); |
| MikamiUitOpen | 0:04b43b777fae | 20 | uint16_t y0 = ORGY_ - height; |
| MikamiUitOpen | 0:04b43b777fae | 21 | lcd_->DrawVLine(X(MIN_), y0, height); // 最小値に対応する線 |
| MikamiUitOpen | 0:04b43b777fae | 22 | |
| MikamiUitOpen | 0:04b43b777fae | 23 | float du = powf(10.0, logMin); // 座標値の増分 |
| MikamiUitOpen | 0:04b43b777fae | 24 | float u1 = (floorf(MIN_/du) + 1.0f)*du; // 最小値に対応する線の次の座標値 |
| MikamiUitOpen | 0:04b43b777fae | 25 | |
| MikamiUitOpen | 0:04b43b777fae | 26 | for (int n=0; n<=loop; n++) |
| MikamiUitOpen | 0:04b43b777fae | 27 | { |
| MikamiUitOpen | 0:04b43b777fae | 28 | float uMax = (10.0f*du < MAX_) ? 10.0f*du : MAX_; |
| MikamiUitOpen | 0:04b43b777fae | 29 | for (float u=u1; u<uMax*0.99f; u+=du) |
| MikamiUitOpen | 0:04b43b777fae | 30 | lcd_->DrawVLine(X(u), y0, height); |
| MikamiUitOpen | 0:04b43b777fae | 31 | |
| MikamiUitOpen | 0:04b43b777fae | 32 | du = uMax; // 値の増分を 10 倍する |
| MikamiUitOpen | 0:04b43b777fae | 33 | u1 = du; // 次の for ループ の最初の値 |
| MikamiUitOpen | 0:04b43b777fae | 34 | } |
| MikamiUitOpen | 0:04b43b777fae | 35 | |
| MikamiUitOpen | 0:04b43b777fae | 36 | lcd_->DrawVLine(X(MAX_), y0, height); // 最大値に対応する線 |
| MikamiUitOpen | 0:04b43b777fae | 37 | |
| MikamiUitOpen | 0:04b43b777fae | 38 | uint16_t width = X(MAX_) - X(MIN_); |
| MikamiUitOpen | 0:04b43b777fae | 39 | for (int n=0; n<= (MAX_DB_ - MIN_DB_)/10; n++) |
| MikamiUitOpen | 0:04b43b777fae | 40 | lcd_->DrawHLine(X(MIN_), ORGY_-DB10_*n, width); |
| MikamiUitOpen | 0:04b43b777fae | 41 | } |
| MikamiUitOpen | 0:04b43b777fae | 42 | |
| MikamiUitOpen | 0:04b43b777fae | 43 | // 横軸の目盛値の表示 |
| MikamiUitOpen | 0:04b43b777fae | 44 | void FrqRespDrawer::DrawNumericX(AxisX_Char xChar[], int nDisp, int offsetY, |
| MikamiUitOpen | 0:04b43b777fae | 45 | string str, sFONT &fonts, uint32_t textColor) |
| MikamiUitOpen | 0:04b43b777fae | 46 | { |
| MikamiUitOpen | 0:04b43b777fae | 47 | for (int n=0; n<nDisp; n++) |
| MikamiUitOpen | 0:04b43b777fae | 48 | Label frq(X(xChar[n].frq), ORGY_+offsetY, |
| MikamiUitOpen | 0:04b43b777fae | 49 | xChar[n].str, Label::CENTER); |
| MikamiUitOpen | 0:04b43b777fae | 50 | uint16_t x0 = ORGX_ + (uint16_t)(DEC_*log10f(MAX_/MIN_))/2; |
| MikamiUitOpen | 0:04b43b777fae | 51 | Label l_frq(x0, ORGY_+20, str, Label::CENTER); |
| MikamiUitOpen | 0:04b43b777fae | 52 | } |
| MikamiUitOpen | 0:04b43b777fae | 53 | |
| MikamiUitOpen | 0:04b43b777fae | 54 | // 縦軸の数値の表示 |
| MikamiUitOpen | 0:04b43b777fae | 55 | void FrqRespDrawer::DrawNumericY(int offsetX, int offsetY, int count, |
| MikamiUitOpen | 0:04b43b777fae | 56 | uint16_t d_dB, const char fmt[], sFONT &fonts, |
| MikamiUitOpen | 0:04b43b777fae | 57 | uint32_t textColor, string str) |
| MikamiUitOpen | 0:04b43b777fae | 58 | { |
| MikamiUitOpen | 0:04b43b777fae | 59 | uint16_t x0 = ORGX_ + offsetX; |
| MikamiUitOpen | 0:04b43b777fae | 60 | uint16_t y0 = ORGY_ + offsetY; |
| MikamiUitOpen | 0:04b43b777fae | 61 | for (int n=0; n<count; n++) |
| MikamiUitOpen | 0:04b43b777fae | 62 | NumericLabel<int> num(x0, y0-n*d_dB*DB1_, |
| MikamiUitOpen | 0:04b43b777fae | 63 | fmt, (int)(MIN_DB_+d_dB*n)); |
| MikamiUitOpen | 0:04b43b777fae | 64 | Label l_dB(x0, y0-(count-1)*d_dB*DB1_-12, str); |
| MikamiUitOpen | 0:04b43b777fae | 65 | } |
| MikamiUitOpen | 0:04b43b777fae | 66 | |
| MikamiUitOpen | 0:04b43b777fae | 67 | // 周波数特性のグラフの描画 |
| MikamiUitOpen | 0:04b43b777fae | 68 | void FrqRespDrawer::DrawGraph(FrequencyResponse &frqResp, uint32_t color) |
| MikamiUitOpen | 0:04b43b777fae | 69 | { |
| MikamiUitOpen | 0:04b43b777fae | 70 | lcd_->SetTextColor(color); |
| MikamiUitOpen | 0:04b43b777fae | 71 | uint16_t width = X(MAX_) - X(MIN_); |
| MikamiUitOpen | 0:04b43b777fae | 72 | uint16_t x1 = 0; |
| MikamiUitOpen | 0:04b43b777fae | 73 | uint16_t y1 = 0; |
| MikamiUitOpen | 0:04b43b777fae | 74 | float pi2FsM = -6.283185f/FS_; // -2*PI*Ts |
| MikamiUitOpen | 0:04b43b777fae | 75 | for (int n=0; n<=width; n++) |
| MikamiUitOpen | 0:04b43b777fae | 76 | { |
| MikamiUitOpen | 0:04b43b777fae | 77 | float frq = PosToFrq(n+ORGX_); |
| MikamiUitOpen | 0:04b43b777fae | 78 | uint16_t x2 = X(frq); |
| MikamiUitOpen | 0:04b43b777fae | 79 | float absHz = frqResp.AbsH_z(exp(Complex(0, pi2FsM*frq))); |
| MikamiUitOpen | 0:04b43b777fae | 80 | float dB = (absHz > 0.001f) ? 20.0f*log10f(absHz) : MIN_DB_; |
| MikamiUitOpen | 0:04b43b777fae | 81 | uint16_t y2 = ORGY_ - Round((dB - MIN_DB_)*DB1_); |
| MikamiUitOpen | 0:04b43b777fae | 82 | if (y2 > ORGY_) y2 = ORGY_; |
| MikamiUitOpen | 0:04b43b777fae | 83 | |
| MikamiUitOpen | 0:04b43b777fae | 84 | if (n != 0) lcd_->DrawLine(x1, y1, x2, y2); |
| MikamiUitOpen | 0:04b43b777fae | 85 | |
| MikamiUitOpen | 0:04b43b777fae | 86 | x1 = x2; |
| MikamiUitOpen | 0:04b43b777fae | 87 | y1 = y2; |
| MikamiUitOpen | 0:04b43b777fae | 88 | } |
| MikamiUitOpen | 0:04b43b777fae | 89 | lcd_->SetTextColor(AXIS_COLOR_); |
| MikamiUitOpen | 0:04b43b777fae | 90 | lcd_->DrawHLine(X(MIN_), ORGY_, width); |
| MikamiUitOpen | 0:04b43b777fae | 91 | } |
| MikamiUitOpen | 0:04b43b777fae | 92 | |
| MikamiUitOpen | 0:04b43b777fae | 93 | // 消去 |
| MikamiUitOpen | 0:04b43b777fae | 94 | void FrqRespDrawer::Erase() |
| MikamiUitOpen | 0:04b43b777fae | 95 | { |
| MikamiUitOpen | 0:04b43b777fae | 96 | lcd_->SetTextColor(BACK_COLOR_); |
| MikamiUitOpen | 0:04b43b777fae | 97 | uint16_t height = DB1_*(MAX_DB_ - MIN_DB_); |
| MikamiUitOpen | 0:04b43b777fae | 98 | lcd_->FillRect(ORGX_, ORGY_- height, X(MAX_)-X(MIN_)+1, height+1); |
| MikamiUitOpen | 0:04b43b777fae | 99 | } |
| MikamiUitOpen | 0:04b43b777fae | 100 | } |
| MikamiUitOpen | 0:04b43b777fae | 101 |