Version using MEMS microphone and CODEC for the program "F746_RealtimeSpectrumAnalyzer". "F746_RealtimeSpectrumAnalyzer" の入力を MEMS のマイクと CODEC に変更.このプログラムは Tomona Nanase さんが作成し DISCO-F746NG_Oscilloscope の名前で登録しているプログラムで, CODEC を使って入力する部分を参考にして作成.このプログラムの説明は,CQ出版社のインターフェース誌,2016年4月号に掲載.

Dependencies:   BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed

Committer:
MikamiUitOpen
Date:
Tue Apr 19 09:35:24 2016 +0000
Revision:
8:e7dc8658c5cd
Parent:
4:2cdaad00d208
9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:0e5131366580 1 //-------------------------------------------------------
MikamiUitOpen 0:0e5131366580 2 // Class for display spectrum
MikamiUitOpen 0:0e5131366580 3 //
MikamiUitOpen 4:2cdaad00d208 4 // 2016/01/10, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 0:0e5131366580 5 //-------------------------------------------------------
MikamiUitOpen 0:0e5131366580 6
MikamiUitOpen 0:0e5131366580 7 #include "SpectrumDisplay.hpp"
MikamiUitOpen 0:0e5131366580 8
MikamiUitOpen 0:0e5131366580 9 namespace Mikami
MikamiUitOpen 0:0e5131366580 10 {
MikamiUitOpen 0:0e5131366580 11 SpectrumDisplay::SpectrumDisplay(
MikamiUitOpen 0:0e5131366580 12 LCD_DISCO_F746NG &lcd,
MikamiUitOpen 1:ac0a67a0deec 13 int nFft, int x0, int y0, float offset,
MikamiUitOpen 0:0e5131366580 14 float db1, int bin, float maxDb, int fs,
MikamiUitOpen 0:0e5131366580 15 uint32_t axisColor, uint32_t lineColor,
MikamiUitOpen 0:0e5131366580 16 uint32_t backColor)
MikamiUitOpen 1:ac0a67a0deec 17 : N_FFT_(nFft), X0_(x0), Y0_(y0), OFFSET_(offset),
MikamiUitOpen 0:0e5131366580 18 DB1_(db1), BIN_(bin), MAX_DB_(maxDb),
MikamiUitOpen 0:0e5131366580 19 FS_(fs), AXIS_COLOR_(axisColor),
MikamiUitOpen 0:0e5131366580 20 LINE_COLOR_(lineColor), BACK_COLOR_(backColor),
MikamiUitOpen 0:0e5131366580 21 lcd_(lcd)
MikamiUitOpen 0:0e5131366580 22 {
MikamiUitOpen 0:0e5131366580 23 AxisX();
MikamiUitOpen 0:0e5131366580 24 AxisY();
MikamiUitOpen 0:0e5131366580 25 }
MikamiUitOpen 0:0e5131366580 26
MikamiUitOpen 0:0e5131366580 27 void SpectrumDisplay::Draw(float db[])
MikamiUitOpen 0:0e5131366580 28 {
MikamiUitOpen 4:2cdaad00d208 29 static const int TOP = Y0_ - (int)(MAX_DB_*DB1_);
MikamiUitOpen 0:0e5131366580 30 lcd_.SetTextColor(BACK_COLOR_);
MikamiUitOpen 0:0e5131366580 31 lcd_.FillRect(X0_+1, Y0_-(int)(MAX_DB_*DB1_),
MikamiUitOpen 0:0e5131366580 32 N_FFT_*BIN_/2, MAX_DB_*DB1_);
MikamiUitOpen 0:0e5131366580 33
MikamiUitOpen 1:ac0a67a0deec 34 float h = ((db[1] + OFFSET_) > 0)? db[1] + OFFSET_ : 0;
MikamiUitOpen 4:2cdaad00d208 35 if (h > MAX_DB_) h = MAX_DB_;
MikamiUitOpen 0:0e5131366580 36 int y1 = Y0_ - (int)(h*DB1_);
MikamiUitOpen 4:2cdaad00d208 37 lcd_.SetTextColor(LINE_COLOR_);
MikamiUitOpen 0:0e5131366580 38 for (int n=1; n<N_FFT_/2; n++)
MikamiUitOpen 0:0e5131366580 39 {
MikamiUitOpen 1:ac0a67a0deec 40 float h2 = ((db[n+1] + OFFSET_) > 0)? db[n+1] + OFFSET_ : 0;
MikamiUitOpen 0:0e5131366580 41 if (h2 > MAX_DB_) h2 = MAX_DB_;
MikamiUitOpen 0:0e5131366580 42 int y2 = Y0_ - (int)(h2*DB1_);
MikamiUitOpen 4:2cdaad00d208 43
MikamiUitOpen 4:2cdaad00d208 44 if ( (y1 <= TOP) && (y2 <= TOP) )
MikamiUitOpen 4:2cdaad00d208 45 { // Out of displaying boundaries
MikamiUitOpen 4:2cdaad00d208 46 lcd_.SetTextColor(LCD_COLOR_RED);
MikamiUitOpen 4:2cdaad00d208 47 lcd_.DrawHLine(X0_+n, TOP, 1);
MikamiUitOpen 4:2cdaad00d208 48 lcd_.SetTextColor(LINE_COLOR_);
MikamiUitOpen 4:2cdaad00d208 49 }
MikamiUitOpen 4:2cdaad00d208 50 else
MikamiUitOpen 4:2cdaad00d208 51 lcd_.DrawLine(X0_+n, y1, X0_+n+1, y2);
MikamiUitOpen 4:2cdaad00d208 52 if (y1 <= TOP) lcd_.DrawPixel(X0_+n, y1, LCD_COLOR_RED);
MikamiUitOpen 0:0e5131366580 53 y1 = y2;
MikamiUitOpen 0:0e5131366580 54 }
MikamiUitOpen 0:0e5131366580 55 lcd_.SetTextColor(AXIS_COLOR_);
MikamiUitOpen 0:0e5131366580 56 lcd_.DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_);
MikamiUitOpen 0:0e5131366580 57 }
MikamiUitOpen 0:0e5131366580 58
MikamiUitOpen 0:0e5131366580 59 // Clear Spectrum
MikamiUitOpen 0:0e5131366580 60 void SpectrumDisplay::Clear()
MikamiUitOpen 0:0e5131366580 61 {
MikamiUitOpen 0:0e5131366580 62 lcd_.SetTextColor(BACK_COLOR_);
MikamiUitOpen 0:0e5131366580 63 lcd_.FillRect(X0_+1, Y0_-(int)(MAX_DB_*DB1_),
MikamiUitOpen 0:0e5131366580 64 N_FFT_*BIN_/2, MAX_DB_*DB1_);
MikamiUitOpen 0:0e5131366580 65 }
MikamiUitOpen 0:0e5131366580 66
MikamiUitOpen 0:0e5131366580 67 // x-axis
MikamiUitOpen 0:0e5131366580 68 void SpectrumDisplay::AxisX()
MikamiUitOpen 0:0e5131366580 69 {
MikamiUitOpen 0:0e5131366580 70 lcd_.SetFont(&Font12);
MikamiUitOpen 0:0e5131366580 71
MikamiUitOpen 0:0e5131366580 72 lcd_.SetTextColor(AXIS_COLOR_);
MikamiUitOpen 0:0e5131366580 73 lcd_.DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_);
MikamiUitOpen 0:0e5131366580 74 float dx = BIN_*(N_FFT_*1000.0f)/(float)FS_;
MikamiUitOpen 0:0e5131366580 75 for (int n=0; n<=(FS_/1000)/2; n++)
MikamiUitOpen 0:0e5131366580 76 {
MikamiUitOpen 0:0e5131366580 77 int xTick = X0_ + (int)(dx*n + 0.5f);
MikamiUitOpen 0:0e5131366580 78 char s[5];
MikamiUitOpen 0:0e5131366580 79 sprintf(s, "%d", n);
MikamiUitOpen 0:0e5131366580 80 DrawString(xTick-3, Y0_+10, s);
MikamiUitOpen 0:0e5131366580 81 lcd_.DrawLine(xTick, Y0_, xTick, Y0_+5);
MikamiUitOpen 0:0e5131366580 82 }
MikamiUitOpen 0:0e5131366580 83 DrawString(X0_+74, Y0_+24, "Frequency [kHz]");
MikamiUitOpen 0:0e5131366580 84 }
MikamiUitOpen 0:0e5131366580 85
MikamiUitOpen 0:0e5131366580 86 // y-axis
MikamiUitOpen 0:0e5131366580 87 void SpectrumDisplay::AxisY()
MikamiUitOpen 0:0e5131366580 88 {
MikamiUitOpen 0:0e5131366580 89 lcd_.SetFont(&Font12);
MikamiUitOpen 0:0e5131366580 90
MikamiUitOpen 0:0e5131366580 91 lcd_.SetTextColor(AXIS_COLOR_);
MikamiUitOpen 0:0e5131366580 92 lcd_.DrawLine(X0_, Y0_+5, X0_, Y0_-(int)(MAX_DB_*DB1_));
MikamiUitOpen 0:0e5131366580 93 for (int n=0; n<=(int)MAX_DB_; n+=20)
MikamiUitOpen 0:0e5131366580 94 {
MikamiUitOpen 0:0e5131366580 95 int yTick = Y0_-(int)(DB1_*n);
MikamiUitOpen 0:0e5131366580 96 char s[5];
MikamiUitOpen 0:0e5131366580 97 sprintf(s, "%3d", n);
MikamiUitOpen 0:0e5131366580 98 DrawString(X0_-30, yTick-5, s);
MikamiUitOpen 0:0e5131366580 99 lcd_.DrawLine(X0_-5, yTick, X0_, yTick);
MikamiUitOpen 0:0e5131366580 100 }
MikamiUitOpen 0:0e5131366580 101 DrawString(X0_-27, Y0_-(int)(DB1_*MAX_DB_)-18, "[dB]");
MikamiUitOpen 0:0e5131366580 102 }
MikamiUitOpen 0:0e5131366580 103 }
MikamiUitOpen 1:ac0a67a0deec 104