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:
Tue Feb 21 13:14:47 2017 +0000
Revision:
6:96b4f6ce2dc9
Parent:
5:503bd366fd73
7

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 6:96b4f6ce2dc9 11 // 2017/02/21, 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 6:96b4f6ce2dc9 26 DigitalOut ledG_(D10, 1); // LED 緑色
MikamiUitOpen 6:96b4f6ce2dc9 27 BusIn sws_(D6, D7, D8, D9); // ロータリ・ディップ・スイッチ用
MikamiUitOpen 6:96b4f6ce2dc9 28 Ticker timer_; // LED 点滅用
MikamiUitOpen 0:fa74b1130cc3 29
MikamiUitOpen 2:c7b910e2deca 30 Through through_; // そのまま出力
MikamiUitOpen 2:c7b910e2deca 31 VariableLpHp filter_(10, FS_); // 遮断周波数可変 IIR フィルタ
MikamiUitOpen 2:c7b910e2deca 32 VocalCanceller vCancel_; // ボーカルキャンセラ
MikamiUitOpen 2:c7b910e2deca 33 FrqShifter fShifter_(FS_); // ピッチシフタ
MikamiUitOpen 2:c7b910e2deca 34 EchoSystem echo_; // 残響生成器
MikamiUitOpen 6:96b4f6ce2dc9 35
MikamiUitOpen 0:fa74b1130cc3 36 // 割り込みが有効になる前にポインタに割り当てておく必要がある
MikamiUitOpen 0:fa74b1130cc3 37 SignalProcessing *spPtr_ = &through_;
MikamiUitOpen 0:fa74b1130cc3 38
MikamiUitOpen 6:96b4f6ce2dc9 39 void TimerIsr()
MikamiUitOpen 6:96b4f6ce2dc9 40 {
MikamiUitOpen 6:96b4f6ce2dc9 41 static int count20 = 0;
MikamiUitOpen 6:96b4f6ce2dc9 42
MikamiUitOpen 6:96b4f6ce2dc9 43 int sw = sws_.read();
MikamiUitOpen 6:96b4f6ce2dc9 44 if ( ((sw & 0x01) == 0x01) && (sw < 10) )
MikamiUitOpen 6:96b4f6ce2dc9 45 {
MikamiUitOpen 6:96b4f6ce2dc9 46 if (count20 <= sw) ledG_ = !ledG_;
MikamiUitOpen 6:96b4f6ce2dc9 47 }
MikamiUitOpen 6:96b4f6ce2dc9 48 else
MikamiUitOpen 6:96b4f6ce2dc9 49 {
MikamiUitOpen 6:96b4f6ce2dc9 50 if (count20 < 10) ledG_ = 1;
MikamiUitOpen 6:96b4f6ce2dc9 51 else ledG_ = 0;
MikamiUitOpen 6:96b4f6ce2dc9 52 }
MikamiUitOpen 6:96b4f6ce2dc9 53
MikamiUitOpen 6:96b4f6ce2dc9 54 if (++count20 > 20)
MikamiUitOpen 6:96b4f6ce2dc9 55 {
MikamiUitOpen 6:96b4f6ce2dc9 56 count20 = 0;
MikamiUitOpen 6:96b4f6ce2dc9 57 ledG_ = 0;
MikamiUitOpen 6:96b4f6ce2dc9 58 }
MikamiUitOpen 6:96b4f6ce2dc9 59 }
MikamiUitOpen 6:96b4f6ce2dc9 60
MikamiUitOpen 0:fa74b1130cc3 61 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:fa74b1130cc3 62 void AdcIsr()
MikamiUitOpen 0:fa74b1130cc3 63 {
MikamiUitOpen 0:fa74b1130cc3 64 float xn1, xn2, yn;
MikamiUitOpen 0:fa74b1130cc3 65 myAdc_.Read(xn1, xn2); // 入力
MikamiUitOpen 6:96b4f6ce2dc9 66 yn = spPtr_->Execute(xn1, xn2); // sw の値に応じた信号処理の実行
MikamiUitOpen 0:fa74b1130cc3 67 myDac_.Write(yn, yn); // 出力
MikamiUitOpen 0:fa74b1130cc3 68 }
MikamiUitOpen 0:fa74b1130cc3 69
MikamiUitOpen 0:fa74b1130cc3 70 int main()
MikamiUitOpen 0:fa74b1130cc3 71 {
MikamiUitOpen 0:fa74b1130cc3 72 printf("\r\nDemonstration for digital signal processing\r\n");
MikamiUitOpen 0:fa74b1130cc3 73
MikamiUitOpen 6:96b4f6ce2dc9 74 sws_.mode(PullDown);
MikamiUitOpen 0:fa74b1130cc3 75
MikamiUitOpen 0:fa74b1130cc3 76 AnalogIn a3In(A3); // VR からの電圧読み取り用
MikamiUitOpen 0:fa74b1130cc3 77 Aqm1602 lcd; // LCD 表示器
MikamiUitOpen 0:fa74b1130cc3 78
MikamiUitOpen 0:fa74b1130cc3 79 // 出力の LPF の遮断周波数を 10 kHz に設定
MikamiUitOpen 0:fa74b1130cc3 80 myDac_.ScfClock(10000*100);
MikamiUitOpen 0:fa74b1130cc3 81
MikamiUitOpen 6:96b4f6ce2dc9 82 NVIC_SetPriority(ADC_IRQn, 1);
MikamiUitOpen 6:96b4f6ce2dc9 83 NVIC_SetPriority(TIM5_IRQn, 2); // Ticker の割り込み優先度を ADC より低くする
MikamiUitOpen 6:96b4f6ce2dc9 84
MikamiUitOpen 6:96b4f6ce2dc9 85
MikamiUitOpen 6:96b4f6ce2dc9 86 timer_.attach(&TimerIsr, 0.2f); // タイマ割り込みの設定
MikamiUitOpen 6:96b4f6ce2dc9 87
MikamiUitOpen 0:fa74b1130cc3 88 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン割り当て
MikamiUitOpen 0:fa74b1130cc3 89 myAdc_.SetIntrVec(&AdcIsr);
MikamiUitOpen 0:fa74b1130cc3 90
MikamiUitOpen 0:fa74b1130cc3 91 int kind = -1; // 処理の種類
MikamiUitOpen 0:fa74b1130cc3 92 float frq; // VR で設定された周波数
MikamiUitOpen 0:fa74b1130cc3 93
MikamiUitOpen 0:fa74b1130cc3 94 while (true)
MikamiUitOpen 0:fa74b1130cc3 95 {
MikamiUitOpen 0:fa74b1130cc3 96 int sw; // 現在の機能切り替えスイッチの状態
MikamiUitOpen 0:fa74b1130cc3 97 do
MikamiUitOpen 0:fa74b1130cc3 98 {
MikamiUitOpen 6:96b4f6ce2dc9 99 sw = sws_.read();
MikamiUitOpen 0:fa74b1130cc3 100 wait_ms(50);
MikamiUitOpen 6:96b4f6ce2dc9 101 } while (sw != sws_.read());
MikamiUitOpen 0:fa74b1130cc3 102
MikamiUitOpen 0:fa74b1130cc3 103 switch (sw)
MikamiUitOpen 0:fa74b1130cc3 104 {
MikamiUitOpen 0:fa74b1130cc3 105 case 1: // 遮断周波数可変 LPF
MikamiUitOpen 0:fa74b1130cc3 106 if (FrChange(a3In, 200, 2000, 10, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 107 {
MikamiUitOpen 2:c7b910e2deca 108 filter_.Design(frq, BilinearDesign::LPF);
MikamiUitOpen 2:c7b910e2deca 109 AssignDisplay(filter_, lcd, "LPF", frq);
MikamiUitOpen 0:fa74b1130cc3 110 }
MikamiUitOpen 0:fa74b1130cc3 111 break;
MikamiUitOpen 0:fa74b1130cc3 112 case 3: // 遮断周波数可変 HPF
MikamiUitOpen 0:fa74b1130cc3 113 if (FrChange(a3In, 200, 2000, 10, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 114 {
MikamiUitOpen 2:c7b910e2deca 115 filter_.Design(frq, BilinearDesign::HPF);
MikamiUitOpen 2:c7b910e2deca 116 AssignDisplay(filter_, lcd, "HPF", frq);
MikamiUitOpen 0:fa74b1130cc3 117 }
MikamiUitOpen 0:fa74b1130cc3 118 break;
MikamiUitOpen 0:fa74b1130cc3 119 case 5: // ボーカルキャンセラ
MikamiUitOpen 0:fa74b1130cc3 120 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 121 AssignDisplay(vCancel_, lcd, "Vocal Calceller");
MikamiUitOpen 0:fa74b1130cc3 122 break;
MikamiUitOpen 0:fa74b1130cc3 123 case 7: // ピッチシフタ
MikamiUitOpen 0:fa74b1130cc3 124 if (FrChange(a3In, 0, 200, 1, frq) || (sw != kind))
MikamiUitOpen 0:fa74b1130cc3 125 {
MikamiUitOpen 0:fa74b1130cc3 126 fShifter_.SetFrequensy(frq);
MikamiUitOpen 0:fa74b1130cc3 127 AssignDisplay(fShifter_, lcd, "Pitch Shifter", frq);
MikamiUitOpen 0:fa74b1130cc3 128 }
MikamiUitOpen 0:fa74b1130cc3 129 break;
MikamiUitOpen 0:fa74b1130cc3 130 case 9: // 残響生成器
MikamiUitOpen 0:fa74b1130cc3 131 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 132 AssignDisplay(echo_, lcd, "Reverbrator");
MikamiUitOpen 0:fa74b1130cc3 133 break;
MikamiUitOpen 0:fa74b1130cc3 134 default:
MikamiUitOpen 0:fa74b1130cc3 135 if (sw != kind)
MikamiUitOpen 0:fa74b1130cc3 136 AssignDisplay(through_, lcd, "Through");
MikamiUitOpen 0:fa74b1130cc3 137 break;
MikamiUitOpen 0:fa74b1130cc3 138 }
MikamiUitOpen 0:fa74b1130cc3 139 kind = sw;
MikamiUitOpen 0:fa74b1130cc3 140 wait(0.2f);
MikamiUitOpen 0:fa74b1130cc3 141 }
MikamiUitOpen 0:fa74b1130cc3 142 }
MikamiUitOpen 6:96b4f6ce2dc9 143