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

Revision:
11:769d986c10fa
Parent:
9:fe097e4c9024
--- a/MyClasses_Functions/MyFunctions.cpp	Wed Jun 15 13:16:49 2016 +0000
+++ b/MyClasses_Functions/MyFunctions.cpp	Mon Jul 04 05:59:44 2016 +0000
@@ -1,35 +1,35 @@
 //--------------------------------------------------------------
 //  フィルタ処理付き SD オーディオプレーヤーで使う大域関数(ヘッダ)
 //
-//  2016/05/07, Copyright (c) 2016 MIKAMI, Naoki
+//  2016/07/04, Copyright (c) 2016 MIKAMI, Naoki
 //--------------------------------------------------------------
 
 #include "MyFunctions.hpp"
 
 // 1フレーム分の信号処理 (IIR フィルタ) の実行
 void IIR_Filtering(SD_WavReader &sdReader, SaiIO &mySai,
-                   int16_t sn[], float g0, Biquad hn[],
+                   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, mySai.GetLength());
+    sdReader.ReadAndToMono(sn);
 
     while (!mySai.IsXferred()) {}  // データの転送が終わるまで待つ
     //--------------------------------------------------------------
     // 1フレーム分の信号処理を行い,その結果を出力する
-    for (int n=0; n<mySai.GetLength(); n++)
+    for (int n=0; n<frameSize; 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);    // 音響信号の出力
+        // 縦続形の 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();   // 次のデータ転送に備える
@@ -82,4 +82,3 @@
         }
 }
 
-