![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Output the audio signal with filtering by IIR filter in the *.wav file on the SD card using onboard CODEC. SD カードの *.wav ファイルのオーディオ信号を遮断周波数可変の IIR フィルタを通して,ボードに搭載されているCODEC で出力する.
Dependencies: BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed FrequencyResponseDrawer F746_SAI_IO Array_Matrix
MyClasses_Functions/MyFunctions.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2016-07-04
- Revision:
- 11:769d986c10fa
- Parent:
- 9:fe097e4c9024
File content as of revision 11:769d986c10fa:
//-------------------------------------------------------------- // フィルタ処理付き SD オーディオプレーヤーで使う大域関数(ヘッダ) // // 2016/07/04, Copyright (c) 2016 MIKAMI, Naoki //-------------------------------------------------------------- #include "MyFunctions.hpp" // 1フレーム分の信号処理 (IIR フィルタ) の実行 void IIR_Filtering(SD_WavReader &sdReader, SaiIO &mySai, float g0, Biquad hn[], int order, bool filterOn) { static int32_t frameSize = mySai.GetLength(); static Array<int16_t> sn(frameSize); // フレームバッファ // 1フレーム分のデータを SD から読み込む sdReader.ReadAndToMono(sn); while (!mySai.IsXferred()) {} // データの転送が終わるまで待つ //-------------------------------------------------------------- // 1フレーム分の信号処理を行い,その結果を出力する for (int n=0; n<frameSize; n++) { // 縦続形の IIR フィルタ float yn = g0*sn[n]; for (int k=0; k<order/2; k++) yn = hn[k].Execute(yn); int16_t value = filterOn ? (int16_t)yn : sn[n]; // 音響信号の出力,右チャンネルには出力しない mySai.Output(value, 0); } //-------------------------------------------------------------- mySai.ResetXferred(); // 次のデータ転送に備える } // SD カードのファイルのオープン int32_t SD_Open(SD_WavReader &sdReader, string fileName, int32_t frameSize) { sdReader.Open(fileName); sdReader.IsWavFile(); return sdReader.GetSize()/frameSize; } // ファイルの選択 // selectedName: 選択されたファイル名 void SelectFile(ButtonGroup &menu, FileSelector &selector, Label &msg, string &selectedName) { selector.DisplayFileList(); msg.Draw("Select file"); do { if (selector.Select(selectedName)) menu.Activate(1); // PLAY 有効 wait_ms(200); } while (!menu.Touched(1)); // PLAY がタッチされるまで繰り返す } // フィルタの変更 void ModifyFilter(DesignerDrawer &drawerObj, ButtonGroup &lpHp, ButtonGroup &onOff, Biquad hn[], Biquad::Coefs ck[], float &g0, bool &filterOn) { // フィルタ処理の有効/無効切り替え int sw = 0; if (onOff.GetTouchedNumber(sw)) filterOn = (sw == 0) ? true : false; // フィルタの周波数特性の変更 static int num = 0; lpHp.GetTouchedNumber(num); BilinearDesign::Type typeLH = (BilinearDesign::Type)num; if (drawerObj.ReDesignAndDraw(ck, g0, typeLH)) for (int k=0; k<drawerObj.GetOrder()/2; k++) { hn[k].SetCoefficients(ck[k]); hn[k].Clear(); } }