Output the audio signal with filtering by IIR filter in the Quad-SPI flash memory using onboard CODEC. QSPI フラッシュメモリのオーディオデータを遮断周波数可変の IIR フィルタを通してボードに搭載されているCODEC で出力するプログラム.
Dependencies: BSP_DISCO_F746NG_patch_fixed F746_GUI LCD_DISCO_F746NG QSPI_DISCO_F746NG TS_DISCO_F746NG mbed
MyClasses_Functions/FrquencyResponseDrawer.hpp@1:a1be09c2533a, 2016-04-07 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Apr 07 00:32:00 2016 +0000
- Revision:
- 1:a1be09c2533a
- Parent:
- 0:2eb96a7cf9b9
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:2eb96a7cf9b9 | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:2eb96a7cf9b9 | 2 | // FrqRespDrawer class (Abstract base class) -- Header |
MikamiUitOpen | 0:2eb96a7cf9b9 | 3 | // |
MikamiUitOpen | 0:2eb96a7cf9b9 | 4 | // 2016/03/30, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:2eb96a7cf9b9 | 5 | //----------------------------------------------------------- |
MikamiUitOpen | 0:2eb96a7cf9b9 | 6 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 7 | #ifndef F746_FRQ_RESP_DRAWER_HPP |
MikamiUitOpen | 0:2eb96a7cf9b9 | 8 | #define F746_FRQ_RESP_DRAWER_HPP |
MikamiUitOpen | 0:2eb96a7cf9b9 | 9 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 10 | #include <complex> // requisite for complex |
MikamiUitOpen | 0:2eb96a7cf9b9 | 11 | #include "Label.hpp" |
MikamiUitOpen | 0:2eb96a7cf9b9 | 12 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 13 | namespace Mikami |
MikamiUitOpen | 0:2eb96a7cf9b9 | 14 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 15 | typedef complex<float> Complex; // define "Complex" |
MikamiUitOpen | 0:2eb96a7cf9b9 | 16 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 17 | class FrqRespDrawer |
MikamiUitOpen | 0:2eb96a7cf9b9 | 18 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 19 | public: |
MikamiUitOpen | 0:2eb96a7cf9b9 | 20 | struct Params |
MikamiUitOpen | 0:2eb96a7cf9b9 | 21 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 22 | const uint16_t ORG; // 横軸の目盛の最小値に対応する位置 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 23 | const float MIN; // 横軸の目盛の最小値 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 24 | const float MAX; // 横軸の目盛の最大値 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 25 | const uint16_t DEC; // 周波数の 10 倍に対応する長さ (pixels) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 26 | const uint16_t ORGY; // 縦軸の目盛の最小値に対応する位置 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 27 | const float MIN_DB; // 縦軸の目盛の最小値 [dB] |
MikamiUitOpen | 0:2eb96a7cf9b9 | 28 | const float MAX_DB; // 縦軸の目盛の最大値 [dB] |
MikamiUitOpen | 0:2eb96a7cf9b9 | 29 | const uint16_t DB10; // 10 dB 対応する長さ (pixels) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 30 | const float FS; // 標本化周波数 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 31 | const uint32_t LINE_COLOR; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 32 | const uint32_t AXIS_COLOR; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 33 | const uint32_t BACK_COLOR; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 34 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 35 | Params(uint16_t org, float min, float max, uint16_t dec, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 36 | uint16_t orgY, float minDb, float maxDb, uint16_t db10, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 37 | float fs, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 38 | uint32_t lineColor = 0xFF00B0FF, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 39 | uint32_t axisColor = LCD_COLOR_LIGHTGRAY, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 40 | uint32_t backColor = GuiBase::ENUM_BACK) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 41 | : ORG(org), MIN(min), MAX(max), DEC(dec), |
MikamiUitOpen | 0:2eb96a7cf9b9 | 42 | ORGY(orgY), MIN_DB(minDb), MAX_DB(maxDb), DB10(db10), |
MikamiUitOpen | 0:2eb96a7cf9b9 | 43 | FS(fs), |
MikamiUitOpen | 0:2eb96a7cf9b9 | 44 | LINE_COLOR(lineColor), |
MikamiUitOpen | 0:2eb96a7cf9b9 | 45 | AXIS_COLOR(axisColor), |
MikamiUitOpen | 0:2eb96a7cf9b9 | 46 | BACK_COLOR(backColor) {} |
MikamiUitOpen | 0:2eb96a7cf9b9 | 47 | }; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 48 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 49 | // Constructor |
MikamiUitOpen | 0:2eb96a7cf9b9 | 50 | FrqRespDrawer(Params p) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 51 | : lcd_(GuiBase::GetLcdPtr()), P_(p), DB1_(p.DB10*0.1f) {} |
MikamiUitOpen | 0:2eb96a7cf9b9 | 52 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 53 | // 周波数に対応する x 座標値の取得 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 54 | int X(float frq) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 55 | { return Round(P_.ORG + P_.DEC*log10f(frq/P_.MIN)); } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 56 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 57 | // x 座標値を周波数に変換 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 58 | float PosToFrq(uint16_t x) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 59 | { return P_.MIN*powf(10.0f, (x - P_.ORG)/(float)P_.DEC); } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 60 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 61 | // 目盛線の描画 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 62 | void DrawAxis(); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 63 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 64 | // 横軸の目盛値の表示用 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 65 | void DrawCharX(uint32_t frq, int offsetY, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 66 | const char str[], sFONT &fonts = Font12, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 67 | uint32_t textColor = LCD_COLOR_WHITE) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 68 | { Label frequency(X(frq), P_.ORGY+offsetY, str, Label::CENTER); } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 69 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 70 | // 縦軸の目盛値の表示 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 71 | void DrawNumericY(int offsetX, int offsetY, int count, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 72 | uint16_t d_dB, const char fmt[], sFONT &fonts = Font12, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 73 | uint32_t textColor = LCD_COLOR_WHITE); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 74 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 75 | // 周波数特性のグラフの描画 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 76 | void DrawGraph(); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 77 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 78 | // 周波数応答の絶対値を返す関数, 引数: z^(-1) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 79 | virtual float AbsH_z(Complex u) = 0; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 80 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 81 | // 消去 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 82 | void Erase(); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 83 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 84 | private: |
MikamiUitOpen | 0:2eb96a7cf9b9 | 85 | LCD_DISCO_F746NG *lcd_; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 86 | const Params P_; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 87 | const float DB1_; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 88 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 89 | // 丸め |
MikamiUitOpen | 0:2eb96a7cf9b9 | 90 | int Round(float x) { return x + 0.5f - (x < 0); } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 91 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 92 | // 10 のべき乗かどうかの検査 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 93 | bool PowersOf10(float x) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 94 | { return fabsf(log10f(x) - Round(log10f(x))) < 0.01f; } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 95 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 96 | // disallow copy constructor and assignment operator |
MikamiUitOpen | 0:2eb96a7cf9b9 | 97 | FrqRespDrawer(const FrqRespDrawer&); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 98 | FrqRespDrawer& operator=(const FrqRespDrawer&); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 99 | }; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 100 | } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 101 | #endif // F746_FRQ_RESP_DRAWER_HPP |