Spectrum analyzer using DISCO-F746NG. Spectrum is calculated by FFT or linear prediction. The vowel data is in "vowel_data.hpp"
Dependencies: BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed BUTTON_GROUP
SpactrumAnalysisClasses/SpectrumDisplay.cpp@6:f385940fbdb1, 2018-10-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Oct 09 10:34:47 2018 +0000
- Revision:
- 6:f385940fbdb1
- Parent:
- 2:4e34945b5c00
7
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:c35b8a23a863 | 1 | //------------------------------------------------------- |
MikamiUitOpen | 0:c35b8a23a863 | 2 | // Class for display spectrum |
MikamiUitOpen | 2:4e34945b5c00 | 3 | // Copyright (c) 2015 MIKAMI, Naoki, 2015/10/27 |
MikamiUitOpen | 0:c35b8a23a863 | 4 | //------------------------------------------------------- |
MikamiUitOpen | 0:c35b8a23a863 | 5 | |
MikamiUitOpen | 0:c35b8a23a863 | 6 | #include "SpectrumDisplay.hpp" |
MikamiUitOpen | 0:c35b8a23a863 | 7 | |
MikamiUitOpen | 0:c35b8a23a863 | 8 | namespace Mikami |
MikamiUitOpen | 0:c35b8a23a863 | 9 | { |
MikamiUitOpen | 0:c35b8a23a863 | 10 | SpectrumDisplay::SpectrumDisplay( |
MikamiUitOpen | 0:c35b8a23a863 | 11 | LCD_DISCO_F746NG &lcd, |
MikamiUitOpen | 0:c35b8a23a863 | 12 | int nFft, int x0, int y0, |
MikamiUitOpen | 0:c35b8a23a863 | 13 | float db1, int bin, float maxDb, int fs) |
MikamiUitOpen | 0:c35b8a23a863 | 14 | : N_FFT_(nFft), X0_(x0), Y0_(y0), |
MikamiUitOpen | 0:c35b8a23a863 | 15 | DB1_(db1), BIN_(bin), MAX_DB_(maxDb), FS_(fs), |
MikamiUitOpen | 0:c35b8a23a863 | 16 | LCD_(&lcd) |
MikamiUitOpen | 0:c35b8a23a863 | 17 | { |
MikamiUitOpen | 0:c35b8a23a863 | 18 | AxisX(); |
MikamiUitOpen | 0:c35b8a23a863 | 19 | AxisY(); |
MikamiUitOpen | 0:c35b8a23a863 | 20 | } |
MikamiUitOpen | 0:c35b8a23a863 | 21 | |
MikamiUitOpen | 0:c35b8a23a863 | 22 | void SpectrumDisplay::BarChart(float db[], uint32_t backColor) |
MikamiUitOpen | 0:c35b8a23a863 | 23 | { |
MikamiUitOpen | 0:c35b8a23a863 | 24 | const float OFFSET = 60.0f; |
MikamiUitOpen | 0:c35b8a23a863 | 25 | for (int n=1; n<=N_FFT_/2; n++) |
MikamiUitOpen | 0:c35b8a23a863 | 26 | { |
MikamiUitOpen | 0:c35b8a23a863 | 27 | float h = ((db[n] + OFFSET) >= 0)? db[n] + OFFSET : 0; |
MikamiUitOpen | 0:c35b8a23a863 | 28 | |
MikamiUitOpen | 0:c35b8a23a863 | 29 | int y = Y0_ - (int)(h*DB1_); |
MikamiUitOpen | 0:c35b8a23a863 | 30 | LCD_->SetTextColor(LCD_COLOR_CYAN); |
MikamiUitOpen | 0:c35b8a23a863 | 31 | LCD_->DrawLine(X0_+n, Y0_-1, X0_+n, y); |
MikamiUitOpen | 0:c35b8a23a863 | 32 | LCD_->SetTextColor(backColor); |
MikamiUitOpen | 0:c35b8a23a863 | 33 | LCD_->DrawLine(X0_+n, y-1, X0_+n, Y0_-(int)(MAX_DB_*DB1_)); |
MikamiUitOpen | 0:c35b8a23a863 | 34 | } |
MikamiUitOpen | 0:c35b8a23a863 | 35 | LCD_->SetTextColor(LCD_COLOR_YELLOW); |
MikamiUitOpen | 0:c35b8a23a863 | 36 | LCD_->DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_); |
MikamiUitOpen | 0:c35b8a23a863 | 37 | } |
MikamiUitOpen | 0:c35b8a23a863 | 38 | |
MikamiUitOpen | 0:c35b8a23a863 | 39 | void SpectrumDisplay::LineChart(float db[], uint32_t backColor) |
MikamiUitOpen | 0:c35b8a23a863 | 40 | { |
MikamiUitOpen | 0:c35b8a23a863 | 41 | const float OFFSET = 60.0f; |
MikamiUitOpen | 0:c35b8a23a863 | 42 | LCD_->SetTextColor(backColor); |
MikamiUitOpen | 0:c35b8a23a863 | 43 | LCD_->FillRect(X0_+1, Y0_-(int)(MAX_DB_*DB1_), |
MikamiUitOpen | 0:c35b8a23a863 | 44 | N_FFT_*BIN_/2, MAX_DB_*DB1_); |
MikamiUitOpen | 0:c35b8a23a863 | 45 | |
MikamiUitOpen | 0:c35b8a23a863 | 46 | float h = ((db[1] + OFFSET) > 0)? db[1] + OFFSET : 0; |
MikamiUitOpen | 0:c35b8a23a863 | 47 | int y1 = Y0_ - (int)(h*DB1_); |
MikamiUitOpen | 0:c35b8a23a863 | 48 | for (int n=1; n<N_FFT_/2; n++) |
MikamiUitOpen | 0:c35b8a23a863 | 49 | { |
MikamiUitOpen | 0:c35b8a23a863 | 50 | float h2 = ((db[n+1] + OFFSET) > 0)? db[n+1] + OFFSET : 0; |
MikamiUitOpen | 0:c35b8a23a863 | 51 | if (h2 > MAX_DB_) h2 = MAX_DB_; |
MikamiUitOpen | 0:c35b8a23a863 | 52 | int y2 = Y0_ - (int)(h2*DB1_); |
MikamiUitOpen | 0:c35b8a23a863 | 53 | LCD_->SetTextColor(LCD_COLOR_CYAN); |
MikamiUitOpen | 0:c35b8a23a863 | 54 | LCD_->DrawLine(X0_+n, y1, X0_+n+1, y2); |
MikamiUitOpen | 0:c35b8a23a863 | 55 | y1 = y2; |
MikamiUitOpen | 0:c35b8a23a863 | 56 | } |
MikamiUitOpen | 0:c35b8a23a863 | 57 | LCD_->SetTextColor(LCD_COLOR_YELLOW); |
MikamiUitOpen | 0:c35b8a23a863 | 58 | LCD_->DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_); |
MikamiUitOpen | 0:c35b8a23a863 | 59 | } |
MikamiUitOpen | 0:c35b8a23a863 | 60 | |
MikamiUitOpen | 0:c35b8a23a863 | 61 | // Clear Spectrum |
MikamiUitOpen | 0:c35b8a23a863 | 62 | void SpectrumDisplay::Clear(uint32_t backColor) |
MikamiUitOpen | 0:c35b8a23a863 | 63 | { |
MikamiUitOpen | 0:c35b8a23a863 | 64 | LCD_->SetTextColor(backColor); |
MikamiUitOpen | 0:c35b8a23a863 | 65 | LCD_->FillRect(X0_+1, Y0_-(int)(MAX_DB_*DB1_), |
MikamiUitOpen | 0:c35b8a23a863 | 66 | N_FFT_*BIN_/2, MAX_DB_*DB1_); |
MikamiUitOpen | 0:c35b8a23a863 | 67 | } |
MikamiUitOpen | 0:c35b8a23a863 | 68 | |
MikamiUitOpen | 0:c35b8a23a863 | 69 | // x-axis |
MikamiUitOpen | 0:c35b8a23a863 | 70 | void SpectrumDisplay::AxisX() |
MikamiUitOpen | 0:c35b8a23a863 | 71 | { |
MikamiUitOpen | 0:c35b8a23a863 | 72 | LCD_->SetFont(&Font12); |
MikamiUitOpen | 0:c35b8a23a863 | 73 | |
MikamiUitOpen | 0:c35b8a23a863 | 74 | LCD_->SetTextColor(LCD_COLOR_YELLOW); |
MikamiUitOpen | 0:c35b8a23a863 | 75 | LCD_->DrawLine(X0_, Y0_, X0_+BIN_*N_FFT_/2, Y0_); |
MikamiUitOpen | 0:c35b8a23a863 | 76 | float dx = BIN_*(N_FFT_*1000.0f)/(float)FS_; |
MikamiUitOpen | 0:c35b8a23a863 | 77 | for (int n=0; n<=(FS_/1000)/2; n++) |
MikamiUitOpen | 0:c35b8a23a863 | 78 | { |
MikamiUitOpen | 0:c35b8a23a863 | 79 | int xTick = X0_ + (int)(dx*n + 0.5f); |
MikamiUitOpen | 0:c35b8a23a863 | 80 | char s[5]; |
MikamiUitOpen | 0:c35b8a23a863 | 81 | sprintf(s, "%d", n); |
MikamiUitOpen | 2:4e34945b5c00 | 82 | LCD_->DisplayStringAt(xTick-3, Y0_+10, (uint8_t *)s, LEFT_MODE); |
MikamiUitOpen | 0:c35b8a23a863 | 83 | LCD_->DrawLine(xTick, Y0_, xTick, Y0_+5); |
MikamiUitOpen | 0:c35b8a23a863 | 84 | } |
MikamiUitOpen | 0:c35b8a23a863 | 85 | LCD_->DisplayStringAt(X0_+74, Y0_+24, (uint8_t *)"Frequency [kHz]", LEFT_MODE); |
MikamiUitOpen | 0:c35b8a23a863 | 86 | } |
MikamiUitOpen | 0:c35b8a23a863 | 87 | |
MikamiUitOpen | 0:c35b8a23a863 | 88 | // y-axis |
MikamiUitOpen | 0:c35b8a23a863 | 89 | void SpectrumDisplay::AxisY() |
MikamiUitOpen | 0:c35b8a23a863 | 90 | { |
MikamiUitOpen | 0:c35b8a23a863 | 91 | LCD_->SetFont(&Font12); |
MikamiUitOpen | 0:c35b8a23a863 | 92 | |
MikamiUitOpen | 0:c35b8a23a863 | 93 | LCD_->SetTextColor(LCD_COLOR_YELLOW); |
MikamiUitOpen | 0:c35b8a23a863 | 94 | LCD_->DrawLine(X0_, Y0_+5, X0_, Y0_-(int)(MAX_DB_*DB1_)); |
MikamiUitOpen | 0:c35b8a23a863 | 95 | for (int n=0; n<=(int)MAX_DB_; n+=20) |
MikamiUitOpen | 0:c35b8a23a863 | 96 | { |
MikamiUitOpen | 0:c35b8a23a863 | 97 | int yTick = Y0_-(int)(DB1_*n); |
MikamiUitOpen | 0:c35b8a23a863 | 98 | char s[5]; |
MikamiUitOpen | 0:c35b8a23a863 | 99 | sprintf(s, "%3d", n-60); |
MikamiUitOpen | 0:c35b8a23a863 | 100 | LCD_->DisplayStringAt(X0_-30, yTick-5, (uint8_t *)s, LEFT_MODE); |
MikamiUitOpen | 0:c35b8a23a863 | 101 | LCD_->DrawLine(X0_-5, yTick, X0_, yTick); |
MikamiUitOpen | 0:c35b8a23a863 | 102 | } |
MikamiUitOpen | 0:c35b8a23a863 | 103 | LCD_->DisplayStringAt(X0_-27, Y0_-(int)(DB1_*MAX_DB_)-18, (uint8_t *)"[dB]", LEFT_MODE); |
MikamiUitOpen | 0:c35b8a23a863 | 104 | } |
MikamiUitOpen | 0:c35b8a23a863 | 105 | } |
MikamiUitOpen | 0:c35b8a23a863 | 106 |