Output the audio signal (*.bin) with filtering by IIR filter in the SD card using onboard CODEC. For *.wav file, F746_SD_WavPlayer and F746_SD_GraphicEqualiser are published on mbed. SD カードのオーディオ信号 (*.bin) を遮断周波数可変の IIR フィルタを通して,ボードに搭載されているCODEC で出力する.*.wav 形式のファイル用には,F746_SD_WavPlayer と F746_SD_GraphicEqualiser を mbed で公開している.
Dependencies: BSP_DISCO_F746NG_patch_fixed F746_GUI LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed
Diff: MyClasses_Functions/MyFunctions.cpp
- Revision:
- 0:6748e3332e85
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MyClasses_Functions/MyFunctions.cpp Fri Apr 08 13:11:53 2016 +0000 @@ -0,0 +1,81 @@ +//-------------------------------------------------------------- +// フィルタ処理付き SD オーディオプレーヤーで使う大域関数(ヘッダ) +// +// 2016/04/07, Copyright (c) 2016 MIKAMI, Naoki +//-------------------------------------------------------------- + +#include "MyFunctions.hpp" + +// 1フレーム分の信号処理 (IIR フィルタ) の実行 +void ProcessSignal(SD_BinaryReader &sdReader, SaiIO_O &mySai, + int16_t sn[], float g0, Biquad hn[], + int order, bool filterOn) +{ + sdReader.Read(sn, mySai.GetLength()); // 1フレーム分のデータを SD から読み込む + + while (!mySai.IsXferred()) {} // データの転送が終わるまで待つ + //-------------------------------------------------------------- + // 1フレーム分の信号処理を行い,その結果を出力する + for (int n=0; n<mySai.GetLength(); n++) + { + int16_t value; + if (filterOn) // フィルタ処理実行 + { + // 縦続形の IIR フィルタ + float yn = g0*sn[n]; + for (int k=0; k<order/2; k++) yn = hn[k].Execute(yn); + value = (int16_t)yn; + } + else + value = sn[n]; // フィルタ処理なし + mySai.Output(value, value); // 音響信号の出力 + } + //-------------------------------------------------------------- + mySai.ResetXferred(); // 次のデータ転送に備える +} + +// SD カードのファイルのオープン +int32_t SD_Open(SD_BinaryReader &sdReader, + string fileName, int32_t frameSize) +{ + sdReader.Open(fileName); + return sdReader.ReadSize()/frameSize; +} + +// ファイルの選択 +// selectedName: 選択されたファイル名 +void SelectFile(ButtonGroup &menu, FileSelector &selector, + Label &msg, string &selectedName) +{ + msg.Draw("Select file"); + selector.DisplayFileList(); + 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(); + } +}