CW Decoder (Morse code decoder) 1st release version. Only run on Nucleo-F446RE mbed board.
Dependencies: Array_Matrix F446_AD_DA ST7565_SPI_LCD TextLCD UIT_FFT_Real
Fork of F446_MySoundMachine by
Base on F446_MySoundMachine program created by 不韋 呂-san.
Thanks to 不韋 呂-san making fundamental part such as FFT and ADC high speed interrupt driven program.
I just combined LCD and show CW code.
Diff: MySpectrogram/MethodCollection.hpp
- Revision:
- 6:5e21ac9f0550
diff -r 503bd366fd73 -r 5e21ac9f0550 MySpectrogram/MethodCollection.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MySpectrogram/MethodCollection.hpp Sun Feb 05 08:02:54 2017 +0000 @@ -0,0 +1,104 @@ +//-------------------------------------------------------------- +// スペクトログラムで使う大域関数 +// +// 2016/08/11, Copyright (c) 2016 MIKAMI, Naoki +//-------------------------------------------------------------- + +#ifndef METHOD_COLLECTION_HPP +#define METHOD_COLLECTION_HPP + +#include "mbed.h" +#include "NumericLabel.hpp" +#include "Matrix.hpp" +#include "FFT_Analysis.hpp" + +namespace Mikami +{ + // 色相の違いで表示 + // 0.0 <= x <= 1.0 + uint32_t HueScale(float x) + { + if (x >= 1) return LCD_COLOR_WHITE; + int r = 0; + int b = 0; + + if (x<0.5f) b = (x<0.33f) ? 255 : -(int)(1500.0f*x) + 750; + else r = (0.67f<x) ? 255 : (int)(1500.0f*x) - 750; + int g = 255 - (int)(1020.0f*(x - 0.5f)*(x - 0.5f)); + + return 0xFF000000 | (((r << 8) | g) << 8) | b; + } + + // 座標軸 + void DrawAxis(int x0, int y0, int w0, int h0, uint32_t axisColor, + uint16_t ms100, uint16_t px1kHz, LCD_DISCO_F746NG *lcd) + { + const uint16_t TICK = 5; // 目盛線の長さ + // 横標軸 + lcd->SetTextColor(axisColor); + lcd->DrawHLine(x0, y0+TICK, w0); + for (int n=0; n<=w0/ms100; n++) + if ((n % 10)== 0) lcd->DrawVLine(x0+n*ms100, y0, 5); + else lcd->DrawVLine(x0+n*ms100, y0+3, 2); + for (int n=0; n<=w0/ms100; n+=10) + NumericLabel<int> num(x0+n*ms100, y0+TICK+3, + "%1d", (int)(n*0.1f), Label::CENTER); + Label time(x0+w0/2, y0+22, "TIME [s]", Label::CENTER); + + // 縦標軸 + lcd->SetTextColor(axisColor); + lcd->DrawVLine(x0-TICK, y0-h0, h0); + for (int n=0; n<=h0/px1kHz; n++) + lcd->DrawHLine(x0-TICK, y0-n*px1kHz, TICK); + for (int n=0; n<=h0/px1kHz; n++) + NumericLabel<int> num(x0-TICK-12, y0-n*px1kHz-5, "%1d", n); + Label hz(x0-32, y0-5*px1kHz-20, "[kHz]"); + } + + // 色と dB の関係の表示 + void ColorDb(int y0, uint32_t axisColor, LCD_DISCO_F746NG *lcd) + { + lcd->SetTextColor(axisColor); + lcd->DrawVLine(455, y0-100, 100); + for (int n=0; n<=8; n++) + lcd->DrawHLine(455, y0-(n*100)/8, 4); + for (int n=0; n<=4; n++) + NumericLabel<int> num(440, y0-(n*100)/4-5, "%2d", n*20); + Label dB(432, y0-120, "[dB]"); + + for (int n=0; n<=100; n++) + { + lcd->SetTextColor(HueScale(n/100.0f)); + lcd->DrawHLine(460, y0-n, 16); + } + } + + // スペクトルの更新 + void SpectrumUpdate(Matrix<uint32_t> &x, FftAnalyzer &analyzer, + const Array<float> &sn, const Array<float> &db) + { + // 過去のスペクトルを一つずらす + for (int n=0; n<x.Rows()-1; n++) + for (int k=0; k<x.Cols(); k++) + x[n][k] = x[n+1][k]; + + // 新しいスペクトル + analyzer.Execute(sn, db); + const float FACTOR = 1.0f/80.0f; // 表示範囲: 0 ~ 80 dB + for (int k=0; k<=x.Cols(); k++) + x[x.Rows()-1][k] = HueScale(FACTOR*((db[k] > 20) ? db[k]-20 : 0)); + } + + // スペクトルの表示 + void DisplaySpectrum(const Matrix<uint32_t> &x, int x0, int y0, + int hBar, LCD_DISCO_F746NG *lcd) + { + for (int n=0; n<x.Rows(); n++) + for (int k=0; k<x.Cols(); k++) + { + lcd->SetTextColor(x[n][k]); + lcd->DrawHLine(x0+n*hBar, y0-k, hBar); + } + } +} +#endif // METHOD_COLLECTION_HPP