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.

Committer:
MikamiUitOpen
Date:
Mon Jan 30 08:18:02 2017 +0000
Revision:
2:c7b910e2deca
Parent:
1:b3cf07371911
Child:
5:503bd366fd73
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:fa74b1130cc3 1 //--------------------------------------------------------
MikamiUitOpen 0:fa74b1130cc3 2 // STM32F446 と信号処理用ボードによる信号処理のデモプログラム
MikamiUitOpen 0:fa74b1130cc3 3 //
MikamiUitOpen 0:fa74b1130cc3 4 // SW: 偶数 入力をそのまま出力
MikamiUitOpen 0:fa74b1130cc3 5 // 1: 遮断周波数可変 LPF
MikamiUitOpen 0:fa74b1130cc3 6 // 3: 遮断周波数可変 HPF
MikamiUitOpen 0:fa74b1130cc3 7 // 5: ボーカルキャンセラ
MikamiUitOpen 0:fa74b1130cc3 8 // 7: ピッチシフタ
MikamiUitOpen 0:fa74b1130cc3 9 // 9: 残響生成器
MikamiUitOpen 0:fa74b1130cc3 10 //
MikamiUitOpen 1:b3cf07371911 11 // 2017/01/30, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:fa74b1130cc3 12 //--------------------------------------------------------
MikamiUitOpen 0:fa74b1130cc3 13
MikamiUitOpen 0:fa74b1130cc3 14 #include "F446_ADC_Interrupt.hpp" // AD, DA
MikamiUitOpen 0:fa74b1130cc3 15 #include "AQM1602.hpp" // LCD 表示器
MikamiUitOpen 0:fa74b1130cc3 16 #include "MyFunctions.hpp" // グローバル関数
MikamiUitOpen 0:fa74b1130cc3 17 #include "SignalProcessing.hpp" // 信号処理の抽象基底クラスなど
MikamiUitOpen 0:fa74b1130cc3 18 #include "VariableLpHp.hpp" // 遮断周波数可変フィルタ
MikamiUitOpen 0:fa74b1130cc3 19 #include "WeaverModulator.hpp" // ピッチシフタ
MikamiUitOpen 0:fa74b1130cc3 20 #include "Reverbrator.hpp" // 残響生成器用
MikamiUitOpen 0:fa74b1130cc3 21 using namespace Mikami;
MikamiUitOpen 0:fa74b1130cc3 22
MikamiUitOpen 0:fa74b1130cc3 23 const int FS_ = 24000; // 標本化周波数: 24 kHz
MikamiUitOpen 0:fa74b1130cc3 24 AdcDual_Intr myAdc_(FS_); // 参照:"F446_ADC_Interrupt.hpp"
MikamiUitOpen 0:fa74b1130cc3 25 DacDual myDac_; // 参照:"F446_DAC.hpp"
MikamiUitOpen 0:fa74b1130cc3 26
MikamiUitOpen 2:c7b910e2deca 27 Through through_; // そのまま出力
MikamiUitOpen 2:c7b910e2deca 28 VariableLpHp filter_(10, FS_); // 遮断周波数可変 IIR フィルタ
MikamiUitOpen 2:c7b910e2deca 29 VocalCanceller vCancel_; // ボーカルキャンセラ
MikamiUitOpen 2:c7b910e2deca 30 FrqShifter fShifter_(FS_); // ピッチシフタ
MikamiUitOpen 2:c7b910e2deca 31 EchoSystem echo_; // 残響生成器
MikamiUitOpen 0:fa74b1130cc3 32 // 割り込みが有効になる前にポインタに割り当てておく必要がある
MikamiUitOpen 0:fa74b1130cc3 33 SignalProcessing *spPtr_ = &through_;
MikamiUitOpen 0:fa74b1130cc3 34
MikamiUitOpen 0:fa74b1130cc3 35 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:fa74b1130cc3 36 void AdcIsr()
MikamiUitOpen 0:fa74b1130cc3 37 {
MikamiUitOpen 0:fa74b1130cc3 38 float xn1, xn2, yn;
MikamiUitOpen 0:fa74b1130cc3 39 myAdc_.Read(xn1, xn2); // 入力
MikamiUitOpen 0:fa74b1130cc3 40 yn = spPtr_->Execute(xn1, xn2); // 信号処理の実行
MikamiUitOpen 0:fa74b1130cc3 41 myDac_.Write(yn, yn); // 出力
MikamiUitOpen 0:fa74b1130cc3 42 }
MikamiUitOpen 0:fa74b1130cc3 43
MikamiUitOpen 0:fa74b1130cc3 44 int main()
MikamiUitOpen 0:fa74b1130cc3 45 {
MikamiUitOpen 0:fa74b1130cc3 46 printf("\r\nDemonstration for digital signal processing\r\n");
MikamiUitOpen 0:fa74b1130cc3 47
MikamiUitOpen 0:fa74b1130cc3 48 BusIn sws(D6, D7, D8, D9); // ロータリ・ディップ・スイッチ用
MikamiUitOpen 0:fa74b1130cc3 49 sws.mode(PullDown);
MikamiUitOpen 0:fa74b1130cc3 50
MikamiUitOpen 0:fa74b1130cc3 51 AnalogIn a3In(A3); // VR からの電圧読み取り用
MikamiUitOpen 0:fa74b1130cc3 52 Aqm1602 lcd; // LCD 表示器
MikamiUitOpen 0:fa74b1130cc3 53
MikamiUitOpen 0:fa74b1130cc3 54 // 出力の LPF の遮断周波数を 10 kHz に設定
MikamiUitOpen 0:fa74b1130cc3 55 myDac_.ScfClock(10000*100);
MikamiUitOpen 0:fa74b1130cc3 56
MikamiUitOpen 0:fa74b1130cc3 57 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン割り当て
MikamiUitOpen 0:fa74b1130cc3 58 myAdc_.SetIntrVec(&AdcIsr);
MikamiUitOpen 0:fa74b1130cc3 59
MikamiUitOpen 0:fa74b1130cc3 60 int kind = -1; // 処理の種類
MikamiUitOpen 0:fa74b1130cc3 61 float frq; // VR で設定された周波数
MikamiUitOpen 0:fa74b1130cc3 62
MikamiUitOpen 0:fa74b1130cc3 63 while (true)
MikamiUitOpen 0:fa74b1130cc3 64 {
MikamiUitOpen 0:fa74b1130cc3 65 int sw; // 現在の機能切り替えスイッチの状態
MikamiUitOpen 0:fa74b1130cc3 66 do
MikamiUitOpen 0:fa74b1130cc3 67 {
MikamiUitOpen 0:fa74b1130cc3 68 sw = sws.read();
MikamiUitOpen 0:fa74b1130cc3 69 wait_ms(50);
MikamiUitOpen 0:fa74b1130cc3 70 } while (sw != sws.read());
MikamiUitOpen 0:fa74b1130cc3 71
MikamiUitOpen 0:fa74b1130cc3 72 switch (sw)
MikamiUitOpen 0:fa74b1130cc3 73 {
MikamiUitOpen 0:fa74b1130cc3 74 case 1: // 遮断周波数可変 LPF
MikamiUitOpen 0:fa74b1130cc3 75 if (FrChange(a3In, 200, 2000, 10, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 76 {
MikamiUitOpen 2:c7b910e2deca 77 filter_.Design(frq, BilinearDesign::LPF);
MikamiUitOpen 2:c7b910e2deca 78 AssignDisplay(filter_, lcd, "LPF", frq);
MikamiUitOpen 0:fa74b1130cc3 79 }
MikamiUitOpen 0:fa74b1130cc3 80 break;
MikamiUitOpen 0:fa74b1130cc3 81 case 3: // 遮断周波数可変 HPF
MikamiUitOpen 0:fa74b1130cc3 82 if (FrChange(a3In, 200, 2000, 10, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 83 {
MikamiUitOpen 2:c7b910e2deca 84 filter_.Design(frq, BilinearDesign::HPF);
MikamiUitOpen 2:c7b910e2deca 85 AssignDisplay(filter_, lcd, "HPF", frq);
MikamiUitOpen 0:fa74b1130cc3 86 }
MikamiUitOpen 0:fa74b1130cc3 87 break;
MikamiUitOpen 0:fa74b1130cc3 88 case 5: // ボーカルキャンセラ
MikamiUitOpen 0:fa74b1130cc3 89 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 90 AssignDisplay(vCancel_, lcd, "Vocal Calceller");
MikamiUitOpen 0:fa74b1130cc3 91 break;
MikamiUitOpen 0:fa74b1130cc3 92 case 7: // ピッチシフタ
MikamiUitOpen 0:fa74b1130cc3 93 if (FrChange(a3In, 0, 200, 1, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 94 {
MikamiUitOpen 0:fa74b1130cc3 95 fShifter_.SetFrequensy(frq);
MikamiUitOpen 0:fa74b1130cc3 96 AssignDisplay(fShifter_, lcd, "Pitch Shifter", frq);
MikamiUitOpen 0:fa74b1130cc3 97 }
MikamiUitOpen 0:fa74b1130cc3 98 break;
MikamiUitOpen 0:fa74b1130cc3 99 case 9: // 残響生成器
MikamiUitOpen 0:fa74b1130cc3 100 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 101 AssignDisplay(echo_, lcd, "Reverbrator");
MikamiUitOpen 0:fa74b1130cc3 102 break;
MikamiUitOpen 0:fa74b1130cc3 103 default:
MikamiUitOpen 0:fa74b1130cc3 104 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 105 AssignDisplay(through_, lcd, "Through");
MikamiUitOpen 0:fa74b1130cc3 106 break;
MikamiUitOpen 0:fa74b1130cc3 107 }
MikamiUitOpen 0:fa74b1130cc3 108 kind = sw;
MikamiUitOpen 0:fa74b1130cc3 109 wait(0.2f);
MikamiUitOpen 0:fa74b1130cc3 110 }
MikamiUitOpen 0:fa74b1130cc3 111 }