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

Committer:
MikamiUitOpen
Date:
Tue Oct 09 10:34:47 2018 +0000
Revision:
6:f385940fbdb1
Parent:
2:4e34945b5c00
7

Who changed what in which revision?

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