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

Committer:
MikamiUitOpen
Date:
Sun Apr 17 08:44:43 2016 +0000
Revision:
5:4a99dabc9180
Parent:
0:6748e3332e85
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:6748e3332e85 1 //------------------------------------------------------------------------------
MikamiUitOpen 0:6748e3332e85 2 // Design of Butterworth LPF and HPF using bilinear transform
MikamiUitOpen 0:6748e3332e85 3 //
MikamiUitOpen 0:6748e3332e85 4 // 2016/03/31, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:6748e3332e85 5 //------------------------------------------------------------------------------
MikamiUitOpen 0:6748e3332e85 6
MikamiUitOpen 0:6748e3332e85 7 #include "BilinearDesignLH.hpp"
MikamiUitOpen 0:6748e3332e85 8
MikamiUitOpen 0:6748e3332e85 9 namespace Mikami
MikamiUitOpen 0:6748e3332e85 10 {
MikamiUitOpen 0:6748e3332e85 11 // Execute design
MikamiUitOpen 0:6748e3332e85 12 // input
MikamiUitOpen 0:6748e3332e85 13 // fc: Cutoff frequency
MikamiUitOpen 0:6748e3332e85 14 // pb: Passband (LPF or HPF)
MikamiUitOpen 0:6748e3332e85 15 // output
MikamiUitOpen 0:6748e3332e85 16 // c : Coefficients for cascade structure
MikamiUitOpen 0:6748e3332e85 17 // g : Gain factor for cascade structure
MikamiUitOpen 0:6748e3332e85 18 void BilinearDesign::Execute(float fc, Type pb, Coefs c[], float& g)
MikamiUitOpen 0:6748e3332e85 19 {
MikamiUitOpen 0:6748e3332e85 20 Butterworth();
MikamiUitOpen 0:6748e3332e85 21 Bilinear(fc);
MikamiUitOpen 0:6748e3332e85 22 ToCascade(pb);
MikamiUitOpen 0:6748e3332e85 23 GetGain(pb);
MikamiUitOpen 0:6748e3332e85 24 GetCoefs(c, g);
MikamiUitOpen 0:6748e3332e85 25 }
MikamiUitOpen 0:6748e3332e85 26
MikamiUitOpen 0:6748e3332e85 27 // Get poles for Butterworth characteristics
MikamiUitOpen 0:6748e3332e85 28 void BilinearDesign::Butterworth()
MikamiUitOpen 0:6748e3332e85 29 {
MikamiUitOpen 0:6748e3332e85 30 float pi_2order = PI_/(2.0f*ORDER_);
MikamiUitOpen 0:6748e3332e85 31 for (int j=0; j<ORDER_/2; j++) // Pole with imaginary part >= 0
MikamiUitOpen 0:6748e3332e85 32 {
MikamiUitOpen 0:6748e3332e85 33 float theta = (2.0f*j + 1.0f)*pi_2order;
MikamiUitOpen 0:6748e3332e85 34 sP_[j] = Complex(-cosf(theta), sinf(theta));
MikamiUitOpen 0:6748e3332e85 35 }
MikamiUitOpen 0:6748e3332e85 36 }
MikamiUitOpen 0:6748e3332e85 37
MikamiUitOpen 0:6748e3332e85 38 // Bilinear transform
MikamiUitOpen 0:6748e3332e85 39 // fc: Cutoff frequency
MikamiUitOpen 0:6748e3332e85 40 void BilinearDesign::Bilinear(float fc)
MikamiUitOpen 0:6748e3332e85 41 {
MikamiUitOpen 0:6748e3332e85 42 float wc = tanf(fc*PI_FS_);
MikamiUitOpen 0:6748e3332e85 43 for (int k=0; k<ORDER_/2; k++)
MikamiUitOpen 0:6748e3332e85 44 zP_[k] = (1.0f + wc*sP_[k])/(1.0f - wc*sP_[k]);
MikamiUitOpen 0:6748e3332e85 45 }
MikamiUitOpen 0:6748e3332e85 46
MikamiUitOpen 0:6748e3332e85 47 // Convert to coefficients for cascade structure
MikamiUitOpen 0:6748e3332e85 48 void BilinearDesign::ToCascade(Type pb)
MikamiUitOpen 0:6748e3332e85 49 {
MikamiUitOpen 0:6748e3332e85 50 for (int j=0; j<ORDER_/2; j++)
MikamiUitOpen 0:6748e3332e85 51 {
MikamiUitOpen 0:6748e3332e85 52 ck_[j].a1 = 2.0f*real(zP_[j]); // a1m
MikamiUitOpen 0:6748e3332e85 53 ck_[j].a2 = -norm(zP_[j]); // a2m
MikamiUitOpen 0:6748e3332e85 54 ck_[j].b1 = (pb == LPF) ? 2.0f : -2.0f; // b1m
MikamiUitOpen 0:6748e3332e85 55 ck_[j].b2 = 1.0f; // b2m
MikamiUitOpen 0:6748e3332e85 56 }
MikamiUitOpen 0:6748e3332e85 57 }
MikamiUitOpen 0:6748e3332e85 58
MikamiUitOpen 0:6748e3332e85 59 // Calculate gain factor
MikamiUitOpen 0:6748e3332e85 60 void BilinearDesign::GetGain(Type pb)
MikamiUitOpen 0:6748e3332e85 61 {
MikamiUitOpen 0:6748e3332e85 62 float u = (pb == LPF) ? 1.0f : -1.0f;
MikamiUitOpen 0:6748e3332e85 63 float g0 = 1.0f;
MikamiUitOpen 0:6748e3332e85 64 for (int k=0; k<ORDER_/2; k++)
MikamiUitOpen 0:6748e3332e85 65 g0 = g0*(1.0f - (ck_[k].a1 + ck_[k].a2*u)*u)/
MikamiUitOpen 0:6748e3332e85 66 (1.0f + (ck_[k].b1 + ck_[k].b2*u)*u);
MikamiUitOpen 0:6748e3332e85 67 gain_ = g0;
MikamiUitOpen 0:6748e3332e85 68 }
MikamiUitOpen 0:6748e3332e85 69
MikamiUitOpen 0:6748e3332e85 70 // Get coefficients
MikamiUitOpen 0:6748e3332e85 71 void BilinearDesign::GetCoefs(Coefs c[], float& gain)
MikamiUitOpen 0:6748e3332e85 72 {
MikamiUitOpen 0:6748e3332e85 73 for (int k=0; k<ORDER_/2; k++) c[k] = ck_[k];
MikamiUitOpen 0:6748e3332e85 74 gain = gain_;
MikamiUitOpen 0:6748e3332e85 75 }
MikamiUitOpen 0:6748e3332e85 76 }