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:
Sun Jan 29 09:11:30 2017 +0000
Revision:
0:fa74b1130cc3
Child:
1:b3cf07371911
1

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