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
MyClasses_Functions/SpectrumDisplay.cpp@8:e7dc8658c5cd, 2016-04-19 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Apr 19 09:35:24 2016 +0000
- Revision:
- 8:e7dc8658c5cd
- Parent:
- 4:2cdaad00d208
9
Who changed what in which revision?
User | Revision | Line number | New 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 |