CW Decoder (Morse code decoder) 1st release version. mbed = 131 revision (Not latest) is used. Only run on DISCO-F746NG mbed board.

Dependencies:   BSP_DISCO_F746NG F746_GUI F746_SAI_IO LCD_DISCO_F746NG TS_DISCO_F746NG UIT_FFT_Real mbed

Base on F746_Spectrogram program created by 不韋 呂-san.
/users/MikamiUitOpen/code/F746_Spectrogram/
Thanks 不韋 呂-san to use fundamental parts such as FFT, SAI, GUI and other useful subroutines.
You do NOT need any modification for mbed hardware and NO additional circuits.
The mbed board read CW tone from your receiver speaker via MEMES microphone (on board) and show it on the screen.

Committer:
kenjiArai
Date:
Sun Feb 05 07:49:54 2017 +0000
Revision:
0:e608fc311e4e
CW Decoder (Morse code decoder) 1st release version. mbed = 131 revision (Not latest) is used. Only run on DISCO-F746NG mbed board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:e608fc311e4e 1 //--------------------------------------------------------------
kenjiArai 0:e608fc311e4e 2 // スペクトログラムで使う大域関数
kenjiArai 0:e608fc311e4e 3 //
kenjiArai 0:e608fc311e4e 4 // 2016/08/11, Copyright (c) 2016 MIKAMI, Naoki
kenjiArai 0:e608fc311e4e 5 //--------------------------------------------------------------
kenjiArai 0:e608fc311e4e 6
kenjiArai 0:e608fc311e4e 7 #ifndef METHOD_COLLECTION_HPP
kenjiArai 0:e608fc311e4e 8 #define METHOD_COLLECTION_HPP
kenjiArai 0:e608fc311e4e 9
kenjiArai 0:e608fc311e4e 10 #include "mbed.h"
kenjiArai 0:e608fc311e4e 11 #include "NumericLabel.hpp"
kenjiArai 0:e608fc311e4e 12 #include "Matrix.hpp"
kenjiArai 0:e608fc311e4e 13 #include "FFT_Analysis.hpp"
kenjiArai 0:e608fc311e4e 14
kenjiArai 0:e608fc311e4e 15 namespace Mikami
kenjiArai 0:e608fc311e4e 16 {
kenjiArai 0:e608fc311e4e 17 // 色相の違いで表示
kenjiArai 0:e608fc311e4e 18 // 0.0 <= x <= 1.0
kenjiArai 0:e608fc311e4e 19 uint32_t HueScale(float x)
kenjiArai 0:e608fc311e4e 20 {
kenjiArai 0:e608fc311e4e 21 if (x >= 1) return LCD_COLOR_WHITE;
kenjiArai 0:e608fc311e4e 22 int r = 0;
kenjiArai 0:e608fc311e4e 23 int b = 0;
kenjiArai 0:e608fc311e4e 24
kenjiArai 0:e608fc311e4e 25 if (x<0.5f) b = (x<0.33f) ? 255 : -(int)(1500.0f*x) + 750;
kenjiArai 0:e608fc311e4e 26 else r = (0.67f<x) ? 255 : (int)(1500.0f*x) - 750;
kenjiArai 0:e608fc311e4e 27 int g = 255 - (int)(1020.0f*(x - 0.5f)*(x - 0.5f));
kenjiArai 0:e608fc311e4e 28
kenjiArai 0:e608fc311e4e 29 return 0xFF000000 | (((r << 8) | g) << 8) | b;
kenjiArai 0:e608fc311e4e 30 }
kenjiArai 0:e608fc311e4e 31
kenjiArai 0:e608fc311e4e 32 // 座標軸
kenjiArai 0:e608fc311e4e 33 void DrawAxis(int x0, int y0, int w0, int h0, uint32_t axisColor,
kenjiArai 0:e608fc311e4e 34 uint16_t ms100, uint16_t px1kHz, LCD_DISCO_F746NG *lcd)
kenjiArai 0:e608fc311e4e 35 {
kenjiArai 0:e608fc311e4e 36 const uint16_t TICK = 5; // 目盛線の長さ
kenjiArai 0:e608fc311e4e 37 // 横標軸
kenjiArai 0:e608fc311e4e 38 lcd->SetTextColor(axisColor);
kenjiArai 0:e608fc311e4e 39 lcd->DrawHLine(x0, y0+TICK, w0);
kenjiArai 0:e608fc311e4e 40 for (int n=0; n<=w0/ms100; n++)
kenjiArai 0:e608fc311e4e 41 if ((n % 10)== 0) lcd->DrawVLine(x0+n*ms100, y0, 5);
kenjiArai 0:e608fc311e4e 42 else lcd->DrawVLine(x0+n*ms100, y0+3, 2);
kenjiArai 0:e608fc311e4e 43 for (int n=0; n<=w0/ms100; n+=10)
kenjiArai 0:e608fc311e4e 44 NumericLabel<int> num(x0+n*ms100, y0+TICK+3,
kenjiArai 0:e608fc311e4e 45 "%1d", (int)(n*0.1f), Label::CENTER);
kenjiArai 0:e608fc311e4e 46 Label time(x0+w0/2, y0+22, "TIME [s]", Label::CENTER);
kenjiArai 0:e608fc311e4e 47
kenjiArai 0:e608fc311e4e 48 // 縦標軸
kenjiArai 0:e608fc311e4e 49 lcd->SetTextColor(axisColor);
kenjiArai 0:e608fc311e4e 50 lcd->DrawVLine(x0-TICK, y0-h0, h0);
kenjiArai 0:e608fc311e4e 51 for (int n=0; n<=h0/px1kHz; n++)
kenjiArai 0:e608fc311e4e 52 lcd->DrawHLine(x0-TICK, y0-n*px1kHz, TICK);
kenjiArai 0:e608fc311e4e 53 for (int n=0; n<=h0/px1kHz; n++)
kenjiArai 0:e608fc311e4e 54 NumericLabel<int> num(x0-TICK-12, y0-n*px1kHz-5, "%1d", n);
kenjiArai 0:e608fc311e4e 55 Label hz(x0-32, y0-5*px1kHz-20, "[kHz]");
kenjiArai 0:e608fc311e4e 56 }
kenjiArai 0:e608fc311e4e 57
kenjiArai 0:e608fc311e4e 58 // 色と dB の関係の表示
kenjiArai 0:e608fc311e4e 59 void ColorDb(int y0, uint32_t axisColor, LCD_DISCO_F746NG *lcd)
kenjiArai 0:e608fc311e4e 60 {
kenjiArai 0:e608fc311e4e 61 lcd->SetTextColor(axisColor);
kenjiArai 0:e608fc311e4e 62 lcd->DrawVLine(455, y0-100, 100);
kenjiArai 0:e608fc311e4e 63 for (int n=0; n<=8; n++)
kenjiArai 0:e608fc311e4e 64 lcd->DrawHLine(455, y0-(n*100)/8, 4);
kenjiArai 0:e608fc311e4e 65 for (int n=0; n<=4; n++)
kenjiArai 0:e608fc311e4e 66 NumericLabel<int> num(440, y0-(n*100)/4-5, "%2d", n*20);
kenjiArai 0:e608fc311e4e 67 Label dB(432, y0-120, "[dB]");
kenjiArai 0:e608fc311e4e 68
kenjiArai 0:e608fc311e4e 69 for (int n=0; n<=100; n++)
kenjiArai 0:e608fc311e4e 70 {
kenjiArai 0:e608fc311e4e 71 lcd->SetTextColor(HueScale(n/100.0f));
kenjiArai 0:e608fc311e4e 72 lcd->DrawHLine(460, y0-n, 16);
kenjiArai 0:e608fc311e4e 73 }
kenjiArai 0:e608fc311e4e 74 }
kenjiArai 0:e608fc311e4e 75
kenjiArai 0:e608fc311e4e 76 // スペクトルの更新
kenjiArai 0:e608fc311e4e 77 void SpectrumUpdate(Matrix<uint32_t> &x, FftAnalyzer &analyzer,
kenjiArai 0:e608fc311e4e 78 const Array<float> &sn, const Array<float> &db)
kenjiArai 0:e608fc311e4e 79 {
kenjiArai 0:e608fc311e4e 80 // 過去のスペクトルを一つずらす
kenjiArai 0:e608fc311e4e 81 for (int n=0; n<x.Rows()-1; n++)
kenjiArai 0:e608fc311e4e 82 for (int k=0; k<x.Cols(); k++)
kenjiArai 0:e608fc311e4e 83 x[n][k] = x[n+1][k];
kenjiArai 0:e608fc311e4e 84
kenjiArai 0:e608fc311e4e 85 // 新しいスペクトル
kenjiArai 0:e608fc311e4e 86 analyzer.Execute(sn, db);
kenjiArai 0:e608fc311e4e 87 const float FACTOR = 1.0f/80.0f; // 表示範囲: 0 ~ 80 dB
kenjiArai 0:e608fc311e4e 88 for (int k=0; k<=x.Cols(); k++)
kenjiArai 0:e608fc311e4e 89 x[x.Rows()-1][k] = HueScale(FACTOR*((db[k] > 20) ? db[k]-20 : 0));
kenjiArai 0:e608fc311e4e 90 }
kenjiArai 0:e608fc311e4e 91
kenjiArai 0:e608fc311e4e 92 // スペクトルの表示
kenjiArai 0:e608fc311e4e 93 void DisplaySpectrum(const Matrix<uint32_t> &x, int x0, int y0,
kenjiArai 0:e608fc311e4e 94 int hBar, LCD_DISCO_F746NG *lcd)
kenjiArai 0:e608fc311e4e 95 {
kenjiArai 0:e608fc311e4e 96 for (int n=0; n<x.Rows(); n++)
kenjiArai 0:e608fc311e4e 97 for (int k=0; k<x.Cols(); k++)
kenjiArai 0:e608fc311e4e 98 {
kenjiArai 0:e608fc311e4e 99 lcd->SetTextColor(x[n][k]);
kenjiArai 0:e608fc311e4e 100 lcd->DrawHLine(x0+n*hBar, y0-k, hBar);
kenjiArai 0:e608fc311e4e 101 }
kenjiArai 0:e608fc311e4e 102 }
kenjiArai 0:e608fc311e4e 103 }
kenjiArai 0:e608fc311e4e 104 #endif // METHOD_COLLECTION_HPP