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
MyFunctions.cpp
00001 //-------------------------------------------------------------- 00002 // フィルタ処理付き SD オーディオプレーヤーで使う大域関数(ヘッダ) 00003 // 00004 // 2016/04/07, Copyright (c) 2016 MIKAMI, Naoki 00005 //-------------------------------------------------------------- 00006 00007 #include "MyFunctions.hpp" 00008 00009 // 1フレーム分の信号処理 (IIR フィルタ) の実行 00010 void ProcessSignal(SD_BinaryReader &sdReader, SaiIO_O &mySai, 00011 int16_t sn[], float g0, Biquad hn[], 00012 int order, bool filterOn) 00013 { 00014 sdReader.Read(sn, mySai.GetLength()); // 1フレーム分のデータを SD から読み込む 00015 00016 while (!mySai.IsXferred()) {} // データの転送が終わるまで待つ 00017 //-------------------------------------------------------------- 00018 // 1フレーム分の信号処理を行い,その結果を出力する 00019 for (int n=0; n<mySai.GetLength(); n++) 00020 { 00021 int16_t value; 00022 if (filterOn) // フィルタ処理実行 00023 { 00024 // 縦続形の IIR フィルタ 00025 float yn = g0*sn[n]; 00026 for (int k=0; k<order/2; k++) yn = hn[k].Execute(yn); 00027 value = (int16_t)yn; 00028 } 00029 else 00030 value = sn[n]; // フィルタ処理なし 00031 mySai.Output(value, value); // 音響信号の出力 00032 } 00033 //-------------------------------------------------------------- 00034 mySai.ResetXferred(); // 次のデータ転送に備える 00035 } 00036 00037 // SD カードのファイルのオープン 00038 int32_t SD_Open(SD_BinaryReader &sdReader, 00039 string fileName, int32_t frameSize) 00040 { 00041 sdReader.Open(fileName); 00042 return sdReader.ReadSize()/frameSize; 00043 } 00044 00045 // ファイルの選択 00046 // selectedName: 選択されたファイル名 00047 void SelectFile(ButtonGroup &menu, FileSelector &selector, 00048 Label &msg, string &selectedName) 00049 { 00050 msg.Draw("Select file"); 00051 selector.DisplayFileList(); 00052 do 00053 { 00054 if (selector.Select(selectedName)) 00055 menu.Activate(1); // PLAY 有効 00056 wait_ms(200); 00057 } while (!menu.Touched(1)); // PLAY がタッチされるまで繰り返す 00058 } 00059 00060 // フィルタの変更 00061 void ModifyFilter(DesignerDrawer &drawerObj, 00062 ButtonGroup &lpHp, ButtonGroup &onOff, 00063 Biquad hn[], Biquad::Coefs ck[], 00064 float &g0, bool &filterOn) 00065 { 00066 // フィルタ処理の有効/無効切り替え 00067 int sw = 0; 00068 if (onOff.GetTouchedNumber(sw)) 00069 filterOn = (sw == 0) ? true : false; 00070 00071 // フィルタの周波数特性の変更 00072 static int num = 0; 00073 lpHp.GetTouchedNumber(num); 00074 BilinearDesign::Type typeLH = (BilinearDesign::Type)num; 00075 if (drawerObj.ReDesignAndDraw(ck, g0, typeLH)) 00076 for (int k=0; k<drawerObj.GetOrder()/2; k++) 00077 { 00078 hn[k].SetCoefficients(ck[k]); 00079 hn[k].Clear(); 00080 } 00081 }
Generated on Wed Jul 13 2022 03:37:09 by 1.7.2