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

Committer:
MikamiUitOpen
Date:
Mon Jul 04 05:59:44 2016 +0000
Revision:
11:769d986c10fa
Parent:
9:fe097e4c9024
12

Who changed what in which revision?

UserRevisionLine numberNew 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