?
MyFunctions.cpp@0:cacfc9e25452, 2019-06-04 (annotated)
- Committer:
- phungductung
- Date:
- Tue Jun 04 21:58:08 2019 +0000
- Revision:
- 0:cacfc9e25452
?;
Who changed what in which revision?
User | Revision | Line number | New 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 |