Integrated program of 4 different kinds of application programs for processing sound signal. 4種類のサウンド信号処理を統合したプログラム.
Dependencies: F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real
MyVariableFilter/VariableIirFilter.cpp@16:d60e5187fd31, 2017-04-27 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Apr 27 23:55:53 2017 +0000
- Revision:
- 16:d60e5187fd31
- Parent:
- 15:fac50dd1de44
17
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 15:fac50dd1de44 | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 15:fac50dd1de44 | 2 | // 可変フィルタ用のクラス |
MikamiUitOpen | 15:fac50dd1de44 | 3 | // (SD_PlayerSkeleton の派生クラス) |
MikamiUitOpen | 15:fac50dd1de44 | 4 | // |
MikamiUitOpen | 15:fac50dd1de44 | 5 | // 2017/04/13, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 15:fac50dd1de44 | 6 | //-------------------------------------------------------------- |
MikamiUitOpen | 15:fac50dd1de44 | 7 | |
MikamiUitOpen | 15:fac50dd1de44 | 8 | #include "VariableIirFilter.hpp" |
MikamiUitOpen | 15:fac50dd1de44 | 9 | |
MikamiUitOpen | 15:fac50dd1de44 | 10 | namespace Mikami |
MikamiUitOpen | 15:fac50dd1de44 | 11 | { |
MikamiUitOpen | 15:fac50dd1de44 | 12 | VariableIirFilter::VariableIirFilter(string str, |
MikamiUitOpen | 15:fac50dd1de44 | 13 | BtwthDesignerDrawer &obj) |
MikamiUitOpen | 15:fac50dd1de44 | 14 | : SD_PlayerSkeleton(str, true), // 第2引数は true にする |
MikamiUitOpen | 15:fac50dd1de44 | 15 | lpHp_(BG_LEFT_, 197, BG_WIDTH_/2, BG_HEIGHT_, |
MikamiUitOpen | 15:fac50dd1de44 | 16 | 2, (string[]){"LPF", "HPF"}, 0, 0, 2, 0), |
MikamiUitOpen | 15:fac50dd1de44 | 17 | onOff_(BG_LEFT_, 235, BG_WIDTH_/2, BG_HEIGHT_, |
MikamiUitOpen | 15:fac50dd1de44 | 18 | 2, (string[]){"ON", "OFF"}, 0, 0, 2, 0), |
MikamiUitOpen | 15:fac50dd1de44 | 19 | drawerObj_(obj), |
MikamiUitOpen | 15:fac50dd1de44 | 20 | ORDER2_(drawerObj_.GetOrder()/2), |
MikamiUitOpen | 15:fac50dd1de44 | 21 | ck_(ORDER2_), hn_(ORDER2_), |
MikamiUitOpen | 15:fac50dd1de44 | 22 | typeLH_(BilinearDesign::LPF), on_(true) |
MikamiUitOpen | 15:fac50dd1de44 | 23 | { |
MikamiUitOpen | 15:fac50dd1de44 | 24 | // 周波数特性の描画 |
MikamiUitOpen | 15:fac50dd1de44 | 25 | drawerObj_.DrawResponse(); |
MikamiUitOpen | 15:fac50dd1de44 | 26 | |
MikamiUitOpen | 15:fac50dd1de44 | 27 | // フィルタの準備 |
MikamiUitOpen | 15:fac50dd1de44 | 28 | drawerObj_.GetCoefficients(ck_, g0_); |
MikamiUitOpen | 15:fac50dd1de44 | 29 | for (int k=0; k<ORDER2_; k++) hn_[k] = Biquad(ck_[k]); |
MikamiUitOpen | 15:fac50dd1de44 | 30 | } |
MikamiUitOpen | 15:fac50dd1de44 | 31 | |
MikamiUitOpen | 15:fac50dd1de44 | 32 | // 1ブロック分の信号処理の実行 |
MikamiUitOpen | 15:fac50dd1de44 | 33 | void VariableIirFilter::SignalProcessing() |
MikamiUitOpen | 15:fac50dd1de44 | 34 | { |
MikamiUitOpen | 15:fac50dd1de44 | 35 | // 1ブロック分のデータを SD から読み込む |
MikamiUitOpen | 15:fac50dd1de44 | 36 | sdReader_.ReadAndToMono(sn_); |
MikamiUitOpen | 15:fac50dd1de44 | 37 | |
MikamiUitOpen | 15:fac50dd1de44 | 38 | while (!mySai_.IsXferred()) {} // データの転送が終わるまで待つ |
MikamiUitOpen | 15:fac50dd1de44 | 39 | //-------------------------------------------------------------- |
MikamiUitOpen | 15:fac50dd1de44 | 40 | // 1ブロック分の信号処理を行い,その結果を出力する |
MikamiUitOpen | 15:fac50dd1de44 | 41 | for (int n=0; n<BUFF_SIZE_; n++) |
MikamiUitOpen | 15:fac50dd1de44 | 42 | { |
MikamiUitOpen | 15:fac50dd1de44 | 43 | // 縦続形の IIR フィルタ |
MikamiUitOpen | 15:fac50dd1de44 | 44 | float yn = g0_*sn_[n]; |
MikamiUitOpen | 15:fac50dd1de44 | 45 | for (int k=0; k<ORDER2_; k++) yn = hn_[k].Execute(yn); |
MikamiUitOpen | 15:fac50dd1de44 | 46 | |
MikamiUitOpen | 15:fac50dd1de44 | 47 | // 音響信号の出力,左右チャンネルに同じものを出力する |
MikamiUitOpen | 15:fac50dd1de44 | 48 | int16_t value = on_ ? (int16_t)yn : sn_[n]; |
MikamiUitOpen | 15:fac50dd1de44 | 49 | mySai_.Output(value, value); |
MikamiUitOpen | 15:fac50dd1de44 | 50 | } |
MikamiUitOpen | 15:fac50dd1de44 | 51 | //-------------------------------------------------------------- |
MikamiUitOpen | 15:fac50dd1de44 | 52 | } |
MikamiUitOpen | 15:fac50dd1de44 | 53 | |
MikamiUitOpen | 15:fac50dd1de44 | 54 | // 可変フィルタの遮断周波数変更 |
MikamiUitOpen | 15:fac50dd1de44 | 55 | void VariableIirFilter::Modefy() |
MikamiUitOpen | 15:fac50dd1de44 | 56 | { |
MikamiUitOpen | 15:fac50dd1de44 | 57 | // フィルタ処理の有効/無効切り替え |
MikamiUitOpen | 15:fac50dd1de44 | 58 | if (onOff_.Touched(0)) on_ = true; |
MikamiUitOpen | 15:fac50dd1de44 | 59 | if (onOff_.Touched(1)) on_ = false; |
MikamiUitOpen | 15:fac50dd1de44 | 60 | |
MikamiUitOpen | 15:fac50dd1de44 | 61 | // フィルタの周波数特性の変更 |
MikamiUitOpen | 15:fac50dd1de44 | 62 | int num = 0; |
MikamiUitOpen | 15:fac50dd1de44 | 63 | if (lpHp_.GetTouchedNumber(num)) |
MikamiUitOpen | 15:fac50dd1de44 | 64 | { |
MikamiUitOpen | 15:fac50dd1de44 | 65 | Clear(); |
MikamiUitOpen | 15:fac50dd1de44 | 66 | typeLH_ = (BilinearDesign::Type)num; |
MikamiUitOpen | 15:fac50dd1de44 | 67 | } |
MikamiUitOpen | 15:fac50dd1de44 | 68 | if (drawerObj_.ReDesignAndDraw(ck_, g0_, typeLH_)) |
MikamiUitOpen | 15:fac50dd1de44 | 69 | for (int k=0; k<ORDER2_; k++) |
MikamiUitOpen | 15:fac50dd1de44 | 70 | hn_[k].SetCoefficients(ck_[k]); |
MikamiUitOpen | 15:fac50dd1de44 | 71 | } |
MikamiUitOpen | 15:fac50dd1de44 | 72 | } |