Realtime spectrum analyzer. Using FFT, linear prediction, or cepstrum smoothing. Version using MEMS microphone and CODEC, named "F746_RealtimeSpectrumAnalyzer_MEMS_Mic" is registered. リアルタイム スペクトル解析器.解析の手法:FFT,線形予測法,ケプストラムによる平滑化の3種類.このプログラムの説明は,CQ出版社のインターフェース誌,2016年4月号に掲載.外付けのマイクまたは他の信号源等を A0 に接続する.線形予測法,ケプストラムは,スペクトル解析の対象を音声信号に想定してパラメータを設定している.MEMS マイクと CODEC を使ったバージョンを "F746_RealtimeSpectrumAnalyzer_MEMS_Mic" として登録.

Dependencies:   BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed

Committer:
MikamiUitOpen
Date:
Mon Feb 22 13:54:51 2016 +0000
Revision:
18:6630d61aeb3c
Parent:
2:095b360e0f54
19

Who changed what in which revision?

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