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

Committer:
MikamiUitOpen
Date:
Thu Apr 07 00:32:00 2016 +0000
Revision:
1:a1be09c2533a
Parent:
0:2eb96a7cf9b9
2

Who changed what in which revision?

UserRevisionLine numberNew 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 }