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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MyFunctions.cpp Source File

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 }