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
Diff: MyClasses_Functions/BilinearDesignLH.cpp
- Revision:
- 0:6748e3332e85
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MyClasses_Functions/BilinearDesignLH.cpp Fri Apr 08 13:11:53 2016 +0000 @@ -0,0 +1,76 @@ +//------------------------------------------------------------------------------ +// Design of Butterworth LPF and HPF using bilinear transform +// +// 2016/03/31, Copyright (c) 2016 MIKAMI, Naoki +//------------------------------------------------------------------------------ + +#include "BilinearDesignLH.hpp" + +namespace Mikami +{ + // Execute design + // input + // fc: Cutoff frequency + // pb: Passband (LPF or HPF) + // output + // c : Coefficients for cascade structure + // g : Gain factor for cascade structure + void BilinearDesign::Execute(float fc, Type pb, Coefs c[], float& g) + { + Butterworth(); + Bilinear(fc); + ToCascade(pb); + GetGain(pb); + GetCoefs(c, g); + } + + // Get poles for Butterworth characteristics + void BilinearDesign::Butterworth() + { + float pi_2order = PI_/(2.0f*ORDER_); + for (int j=0; j<ORDER_/2; j++) // Pole with imaginary part >= 0 + { + float theta = (2.0f*j + 1.0f)*pi_2order; + sP_[j] = Complex(-cosf(theta), sinf(theta)); + } + } + + // Bilinear transform + // fc: Cutoff frequency + void BilinearDesign::Bilinear(float fc) + { + float wc = tanf(fc*PI_FS_); + for (int k=0; k<ORDER_/2; k++) + zP_[k] = (1.0f + wc*sP_[k])/(1.0f - wc*sP_[k]); + } + + // Convert to coefficients for cascade structure + void BilinearDesign::ToCascade(Type pb) + { + for (int j=0; j<ORDER_/2; j++) + { + ck_[j].a1 = 2.0f*real(zP_[j]); // a1m + ck_[j].a2 = -norm(zP_[j]); // a2m + ck_[j].b1 = (pb == LPF) ? 2.0f : -2.0f; // b1m + ck_[j].b2 = 1.0f; // b2m + } + } + + // Calculate gain factor + void BilinearDesign::GetGain(Type pb) + { + float u = (pb == LPF) ? 1.0f : -1.0f; + float g0 = 1.0f; + for (int k=0; k<ORDER_/2; k++) + g0 = g0*(1.0f - (ck_[k].a1 + ck_[k].a2*u)*u)/ + (1.0f + (ck_[k].b1 + ck_[k].b2*u)*u); + gain_ = g0; + } + + // Get coefficients + void BilinearDesign::GetCoefs(Coefs c[], float& gain) + { + for (int k=0; k<ORDER_/2; k++) c[k] = ck_[k]; + gain = gain_; + } +}