?

Committer:
phungductung
Date:
Tue Jun 04 21:58:08 2019 +0000
Revision:
0:cacfc9e25452
?;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 0:cacfc9e25452 1 //--------------------------------------------------------------
phungductung 0:cacfc9e25452 2 // フィルタ処理付き SD オーディオプレーヤーで使う大域関数(ヘッダ)
phungductung 0:cacfc9e25452 3 //
phungductung 0:cacfc9e25452 4 // 2016/07/04, Copyright (c) 2016 MIKAMI, Naoki
phungductung 0:cacfc9e25452 5 //--------------------------------------------------------------
phungductung 0:cacfc9e25452 6
phungductung 0:cacfc9e25452 7 #include "MyFunctions.hpp"
phungductung 0:cacfc9e25452 8
phungductung 0:cacfc9e25452 9 // 1フレーム分の信号処理 (IIR フィルタ) の実行
phungductung 0:cacfc9e25452 10 void IIR_Filtering(SD_WavReader &sdReader, SaiIO &mySai,
phungductung 0:cacfc9e25452 11 float g0, Biquad hn[],
phungductung 0:cacfc9e25452 12 int order, bool filterOn)
phungductung 0:cacfc9e25452 13 {
phungductung 0:cacfc9e25452 14 static int32_t frameSize = mySai.GetLength();
phungductung 0:cacfc9e25452 15 static Array<int16_t> sn(frameSize); // フレームバッファ
phungductung 0:cacfc9e25452 16
phungductung 0:cacfc9e25452 17 // 1フレーム分のデータを SD から読み込む
phungductung 0:cacfc9e25452 18 sdReader.ReadAndToMono(sn);
phungductung 0:cacfc9e25452 19
phungductung 0:cacfc9e25452 20 while (!mySai.IsXferred()) {} // データの転送が終わるまで待つ
phungductung 0:cacfc9e25452 21 //--------------------------------------------------------------
phungductung 0:cacfc9e25452 22 // 1フレーム分の信号処理を行い,その結果を出力する
phungductung 0:cacfc9e25452 23 for (int n=0; n<frameSize; n++)
phungductung 0:cacfc9e25452 24 {
phungductung 0:cacfc9e25452 25 // 縦続形の IIR フィルタ
phungductung 0:cacfc9e25452 26 float yn = g0*sn[n];
phungductung 0:cacfc9e25452 27 for (int k=0; k<order/2; k++) yn = hn[k].Execute(yn);
phungductung 0:cacfc9e25452 28
phungductung 0:cacfc9e25452 29 int16_t value = filterOn ? (int16_t)yn : sn[n];
phungductung 0:cacfc9e25452 30
phungductung 0:cacfc9e25452 31 // 音響信号の出力,右チャンネルには出力しない
phungductung 0:cacfc9e25452 32 mySai.Output(value, 0);
phungductung 0:cacfc9e25452 33 }
phungductung 0:cacfc9e25452 34 //--------------------------------------------------------------
phungductung 0:cacfc9e25452 35 mySai.ResetXferred(); // 次のデータ転送に備える
phungductung 0:cacfc9e25452 36 }
phungductung 0:cacfc9e25452 37
phungductung 0:cacfc9e25452 38 // SD カードのファイルのオープン
phungductung 0:cacfc9e25452 39 int32_t SD_Open(SD_WavReader &sdReader,
phungductung 0:cacfc9e25452 40 string fileName, int32_t frameSize)
phungductung 0:cacfc9e25452 41 {
phungductung 0:cacfc9e25452 42 sdReader.Open(fileName);
phungductung 0:cacfc9e25452 43 sdReader.IsWavFile();
phungductung 0:cacfc9e25452 44 return sdReader.GetSize()/frameSize;
phungductung 0:cacfc9e25452 45 }
phungductung 0:cacfc9e25452 46
phungductung 0:cacfc9e25452 47 // ファイルの選択
phungductung 0:cacfc9e25452 48 // selectedName: 選択されたファイル名
phungductung 0:cacfc9e25452 49 void SelectFile(ButtonGroup &menu, FileSelector &selector,
phungductung 0:cacfc9e25452 50 Label &msg, string &selectedName)
phungductung 0:cacfc9e25452 51 {
phungductung 0:cacfc9e25452 52 selector.DisplayFileList();
phungductung 0:cacfc9e25452 53 msg.Draw("Chon File");
phungductung 0:cacfc9e25452 54 do
phungductung 0:cacfc9e25452 55 {
phungductung 0:cacfc9e25452 56 if (selector.Select(selectedName))
phungductung 0:cacfc9e25452 57 menu.Activate(1); // PLAY 有効
phungductung 0:cacfc9e25452 58 wait_ms(200);
phungductung 0:cacfc9e25452 59 } while (!menu.Touched(1)); // PLAY がタッチされるまで繰り返す
phungductung 0:cacfc9e25452 60 }
phungductung 0:cacfc9e25452 61
phungductung 0:cacfc9e25452 62 // フィルタの変更
phungductung 0:cacfc9e25452 63 void ModifyFilter(DesignerDrawer &drawerObj,
phungductung 0:cacfc9e25452 64 ButtonGroup &lpHp, ButtonGroup &onOff,
phungductung 0:cacfc9e25452 65 Biquad hn[], Biquad::Coefs ck[],
phungductung 0:cacfc9e25452 66 float &g0, bool &filterOn)
phungductung 0:cacfc9e25452 67 {
phungductung 0:cacfc9e25452 68 // フィルタ処理の有効/無効切り替え
phungductung 0:cacfc9e25452 69 int sw = 0;
phungductung 0:cacfc9e25452 70 if (onOff.GetTouchedNumber(sw))
phungductung 0:cacfc9e25452 71 filterOn = (sw == 0) ? true : false;
phungductung 0:cacfc9e25452 72
phungductung 0:cacfc9e25452 73 // フィルタの周波数特性の変更
phungductung 0:cacfc9e25452 74 static int num = 0;
phungductung 0:cacfc9e25452 75 lpHp.GetTouchedNumber(num);
phungductung 0:cacfc9e25452 76 BilinearDesign::Type typeLH = (BilinearDesign::Type)num;
phungductung 0:cacfc9e25452 77 if (drawerObj.ReDesignAndDraw(ck, g0, typeLH))
phungductung 0:cacfc9e25452 78 for (int k=0; k<drawerObj.GetOrder()/2; k++)
phungductung 0:cacfc9e25452 79 {
phungductung 0:cacfc9e25452 80 hn[k].SetCoefficients(ck[k]);
phungductung 0:cacfc9e25452 81 hn[k].Clear();
phungductung 0:cacfc9e25452 82 }
phungductung 0:cacfc9e25452 83 }
phungductung 0:cacfc9e25452 84