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.cpp@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) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 3 | // |
MikamiUitOpen | 0:2eb96a7cf9b9 | 4 | // 2016/03/31, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:2eb96a7cf9b9 | 5 | //----------------------------------------------------------- |
MikamiUitOpen | 0:2eb96a7cf9b9 | 6 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 7 | #include "FrquencyResponseDrawer.hpp" |
MikamiUitOpen | 0:2eb96a7cf9b9 | 8 | #include "NumericLabel.hpp" |
MikamiUitOpen | 0:2eb96a7cf9b9 | 9 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 10 | namespace Mikami |
MikamiUitOpen | 0:2eb96a7cf9b9 | 11 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 12 | // 目盛線の描画 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 13 | void FrqRespDrawer::DrawAxis() |
MikamiUitOpen | 0:2eb96a7cf9b9 | 14 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 15 | uint16_t height = DB1_*(P_.MAX_DB - P_.MIN_DB); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 16 | int logMin = (int)floorf(log10f(P_.MIN)); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 17 | int loop = (int)floorf(log10f(P_.MAX)) - logMin; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 18 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 19 | lcd_->SetTextColor(P_.AXIS_COLOR); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 20 | uint16_t y0 = P_.ORGY- height; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 21 | lcd_->DrawVLine(X(P_.MIN), y0, height); // 最小値に対応する線 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 22 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 23 | float du = powf(10.0, logMin); // 座標値の増分 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 24 | float u1 = (floorf(P_.MIN/du) + 1.0f)*du; // 最小値に対応する線の次の座標値 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 25 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 26 | for (int n=0; n<=loop; n++) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 27 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 28 | float uMax = (10.0f*du < P_.MAX) ? 10.0f*du : P_.MAX; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 29 | for (float u=u1; u<uMax*0.99f; u+=du) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 30 | lcd_->DrawVLine(X(u), y0, height); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 31 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 32 | du = uMax; // 値の増分を 10 倍する |
MikamiUitOpen | 0:2eb96a7cf9b9 | 33 | u1 = du; // 次の for ループ の最初の値 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 34 | } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 35 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 36 | lcd_->DrawVLine(X(P_.MAX), y0, height); // 最大値に対応する線 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 37 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 38 | uint16_t width = X(P_.MAX) - X(P_.MIN); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 39 | for (int n=0; n<= (P_.MAX_DB - P_.MIN_DB)/10; n++) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 40 | lcd_->DrawHLine(X(P_.MIN), P_.ORGY-P_.DB10*n, width); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 41 | } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 42 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 43 | // 縦軸の数値の表示 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 44 | void FrqRespDrawer::DrawNumericY(int offsetX, int offsetY, int count, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 45 | uint16_t d_dB, const char fmt[], sFONT &fonts, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 46 | uint32_t textColor) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 47 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 48 | uint16_t x0 = P_.ORG + offsetX; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 49 | uint16_t y0 = P_.ORGY + offsetY; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 50 | for (int n=0; n<count; n++) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 51 | new NumericLabel<int>(x0, y0-n*d_dB*DB1_, |
MikamiUitOpen | 0:2eb96a7cf9b9 | 52 | fmt, (int)(P_.MIN_DB+d_dB*n)); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 53 | } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 54 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 55 | // 周波数特性のグラフの描画 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 56 | void FrqRespDrawer::DrawGraph() |
MikamiUitOpen | 0:2eb96a7cf9b9 | 57 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 58 | lcd_->SetTextColor(P_.LINE_COLOR); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 59 | uint16_t width = X(P_.MAX) - X(P_.MIN); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 60 | uint16_t x1 = 0; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 61 | uint16_t y1 = 0; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 62 | float pi2FsM = -6.283185f/P_.FS; // -2*PI*Ts |
MikamiUitOpen | 0:2eb96a7cf9b9 | 63 | for (int n=0; n<=width; n++) |
MikamiUitOpen | 0:2eb96a7cf9b9 | 64 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 65 | float frq = PosToFrq(n+P_.ORG); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 66 | uint16_t x2 = X(frq); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 67 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 68 | float absHz = AbsH_z(exp(Complex(0, pi2FsM*frq))); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 69 | float dB = (absHz > 0.001f) ? 20.0f*log10f(absHz) : P_.MIN_DB; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 70 | uint16_t y2 = P_.ORGY - Round((dB - P_.MIN_DB)*DB1_); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 71 | if (y2 > P_.ORGY) y2 = P_.ORGY; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 72 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 73 | if (n != 0) lcd_->DrawLine(x1, y1, x2, y2); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 74 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 75 | x1 = x2; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 76 | y1 = y2; |
MikamiUitOpen | 0:2eb96a7cf9b9 | 77 | } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 78 | lcd_->SetTextColor(P_.AXIS_COLOR); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 79 | lcd_->DrawHLine(X(P_.MIN), P_.ORGY, width); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 80 | } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 81 | |
MikamiUitOpen | 0:2eb96a7cf9b9 | 82 | // 消去 |
MikamiUitOpen | 0:2eb96a7cf9b9 | 83 | void FrqRespDrawer::Erase() |
MikamiUitOpen | 0:2eb96a7cf9b9 | 84 | { |
MikamiUitOpen | 0:2eb96a7cf9b9 | 85 | lcd_->SetTextColor(P_.BACK_COLOR); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 86 | uint16_t height = DB1_*(P_.MAX_DB - P_.MIN_DB); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 87 | lcd_->FillRect(P_.ORG, P_.ORGY- height, X(P_.MAX)-X(P_.MIN)+1, height+1); |
MikamiUitOpen | 0:2eb96a7cf9b9 | 88 | } |
MikamiUitOpen | 0:2eb96a7cf9b9 | 89 | } |