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