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

MyClasses_Functions/MyFunctions.cpp

Committer:
MikamiUitOpen
Date:
2016-04-19
Revision:
0:04b43b777fae
Child:
5:3e8ca1ed31a1

File content as of revision 0:04b43b777fae:

//--------------------------------------------------------------
//  フィルタ処理付き SD オーディオプレーヤーで使う大域関数(ヘッダ)
//
//  2016/04/19, Copyright (c) 2016 MIKAMI, Naoki
//--------------------------------------------------------------

#include "MyFunctions.hpp"

// 1フレーム分の信号処理 (IIR フィルタ) の実行
void ProcessSignal(SD_WavReader &sdReader, SaiIO_O &mySai,
                   int16_t sn[], float g0, Biquad hn[],
                   int order, bool filterOn)
{
    // 1フレーム分のデータを SD から読み込む
    sdReader.ReadAndToMono(sn, mySai.GetLength());

    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_WavReader &sdReader,
                string fileName, int32_t frameSize)
{
    sdReader.Open(fileName);
    sdReader.IsWavFile();
    return sdReader.GetSize()/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();
        }
}