Demo program of digital signal processing: Variable LPF/HPF, Vocal canceller, Pitch shifter, Reverbrator. ディジタル信号処理のデモプログラム. 遮断周波数可変 LPF/HPF,ボーカルキャンセラ,ピッチシフタ,残響生成器.

Dependencies:   Array_Matrix F446_AD_DA UIT_AQM1602 mbed

Committer:
MikamiUitOpen
Date:
Mon Jan 30 02:06:57 2017 +0000
Revision:
1:b3cf07371911
Parent:
0:fa74b1130cc3
Child:
2:c7b910e2deca
2

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 0:fa74b1130cc3 27 Through through_; // そのまま出力
MikamiUitOpen 0:fa74b1130cc3 28 VariableLpHp lpf_(10, FS_); // 遮断周波数可変 LPF
MikamiUitOpen 0:fa74b1130cc3 29 VariableLpHp hpf_(10, FS_); // 遮断周波数可変 HPF
MikamiUitOpen 0:fa74b1130cc3 30 VocalCanceller vCancel_; // ボーカルキャンセラ
MikamiUitOpen 0:fa74b1130cc3 31 FrqShifter fShifter_(FS_); // ピッチシフタ
MikamiUitOpen 0:fa74b1130cc3 32 EchoSystem echo_; // 残響生成器
MikamiUitOpen 0:fa74b1130cc3 33 // 割り込みが有効になる前にポインタに割り当てておく必要がある
MikamiUitOpen 0:fa74b1130cc3 34 SignalProcessing *spPtr_ = &through_;
MikamiUitOpen 0:fa74b1130cc3 35
MikamiUitOpen 0:fa74b1130cc3 36 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:fa74b1130cc3 37 void AdcIsr()
MikamiUitOpen 0:fa74b1130cc3 38 {
MikamiUitOpen 0:fa74b1130cc3 39 float xn1, xn2, yn;
MikamiUitOpen 0:fa74b1130cc3 40 myAdc_.Read(xn1, xn2); // 入力
MikamiUitOpen 0:fa74b1130cc3 41 yn = spPtr_->Execute(xn1, xn2); // 信号処理の実行
MikamiUitOpen 0:fa74b1130cc3 42 myDac_.Write(yn, yn); // 出力
MikamiUitOpen 0:fa74b1130cc3 43 }
MikamiUitOpen 0:fa74b1130cc3 44
MikamiUitOpen 0:fa74b1130cc3 45 int main()
MikamiUitOpen 0:fa74b1130cc3 46 {
MikamiUitOpen 0:fa74b1130cc3 47 printf("\r\nDemonstration for digital signal processing\r\n");
MikamiUitOpen 0:fa74b1130cc3 48
MikamiUitOpen 0:fa74b1130cc3 49 BusIn sws(D6, D7, D8, D9); // ロータリ・ディップ・スイッチ用
MikamiUitOpen 0:fa74b1130cc3 50 sws.mode(PullDown);
MikamiUitOpen 0:fa74b1130cc3 51
MikamiUitOpen 0:fa74b1130cc3 52 AnalogIn a3In(A3); // VR からの電圧読み取り用
MikamiUitOpen 0:fa74b1130cc3 53 Aqm1602 lcd; // LCD 表示器
MikamiUitOpen 0:fa74b1130cc3 54
MikamiUitOpen 0:fa74b1130cc3 55 // 出力の LPF の遮断周波数を 10 kHz に設定
MikamiUitOpen 0:fa74b1130cc3 56 myDac_.ScfClock(10000*100);
MikamiUitOpen 0:fa74b1130cc3 57
MikamiUitOpen 0:fa74b1130cc3 58 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン割り当て
MikamiUitOpen 0:fa74b1130cc3 59 myAdc_.SetIntrVec(&AdcIsr);
MikamiUitOpen 0:fa74b1130cc3 60
MikamiUitOpen 0:fa74b1130cc3 61 int kind = -1; // 処理の種類
MikamiUitOpen 0:fa74b1130cc3 62 float frq; // VR で設定された周波数
MikamiUitOpen 0:fa74b1130cc3 63
MikamiUitOpen 0:fa74b1130cc3 64 while (true)
MikamiUitOpen 0:fa74b1130cc3 65 {
MikamiUitOpen 0:fa74b1130cc3 66 int sw; // 現在の機能切り替えスイッチの状態
MikamiUitOpen 0:fa74b1130cc3 67 do
MikamiUitOpen 0:fa74b1130cc3 68 {
MikamiUitOpen 0:fa74b1130cc3 69 sw = sws.read();
MikamiUitOpen 0:fa74b1130cc3 70 wait_ms(50);
MikamiUitOpen 0:fa74b1130cc3 71 } while (sw != sws.read());
MikamiUitOpen 0:fa74b1130cc3 72
MikamiUitOpen 0:fa74b1130cc3 73 switch (sw)
MikamiUitOpen 0:fa74b1130cc3 74 {
MikamiUitOpen 0:fa74b1130cc3 75 case 1: // 遮断周波数可変 LPF
MikamiUitOpen 0:fa74b1130cc3 76 if (FrChange(a3In, 200, 2000, 10, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 77 {
MikamiUitOpen 0:fa74b1130cc3 78 lpf_.Design(frq, BilinearDesign::LPF);
MikamiUitOpen 0:fa74b1130cc3 79 AssignDisplay(lpf_, lcd, "LPF", frq);
MikamiUitOpen 0:fa74b1130cc3 80 }
MikamiUitOpen 0:fa74b1130cc3 81 break;
MikamiUitOpen 0:fa74b1130cc3 82 case 3: // 遮断周波数可変 HPF
MikamiUitOpen 0:fa74b1130cc3 83 if (FrChange(a3In, 200, 2000, 10, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 84 {
MikamiUitOpen 0:fa74b1130cc3 85 hpf_.Design(frq, BilinearDesign::HPF);
MikamiUitOpen 0:fa74b1130cc3 86 AssignDisplay(hpf_, lcd, "HPF", frq);
MikamiUitOpen 0:fa74b1130cc3 87 }
MikamiUitOpen 0:fa74b1130cc3 88 break;
MikamiUitOpen 0:fa74b1130cc3 89 case 5: // ボーカルキャンセラ
MikamiUitOpen 0:fa74b1130cc3 90 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 91 AssignDisplay(vCancel_, lcd, "Vocal Calceller");
MikamiUitOpen 0:fa74b1130cc3 92 break;
MikamiUitOpen 0:fa74b1130cc3 93 case 7: // ピッチシフタ
MikamiUitOpen 0:fa74b1130cc3 94 if (FrChange(a3In, 0, 200, 1, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 95 {
MikamiUitOpen 0:fa74b1130cc3 96 fShifter_.SetFrequensy(frq);
MikamiUitOpen 0:fa74b1130cc3 97 AssignDisplay(fShifter_, lcd, "Pitch Shifter", frq);
MikamiUitOpen 0:fa74b1130cc3 98 }
MikamiUitOpen 0:fa74b1130cc3 99 break;
MikamiUitOpen 0:fa74b1130cc3 100 case 9: // 残響生成器
MikamiUitOpen 0:fa74b1130cc3 101 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 102 AssignDisplay(echo_, lcd, "Reverbrator");
MikamiUitOpen 0:fa74b1130cc3 103 break;
MikamiUitOpen 0:fa74b1130cc3 104 default:
MikamiUitOpen 0:fa74b1130cc3 105 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 106 AssignDisplay(through_, lcd, "Through");
MikamiUitOpen 0:fa74b1130cc3 107 break;
MikamiUitOpen 0:fa74b1130cc3 108 }
MikamiUitOpen 0:fa74b1130cc3 109 kind = sw;
MikamiUitOpen 0:fa74b1130cc3 110 wait(0.2f);
MikamiUitOpen 0:fa74b1130cc3 111 }
MikamiUitOpen 0:fa74b1130cc3 112 }