Output the audio signal with filtering by graphic equalizer in the *.wav file on the SD card using onboard CODEC. SD カードの *.wav ファイルのオーディオ信号をグラフィック・イコライザを通して,ボードに搭載されているCODEC で出力する.

Dependencies:   F746_GUI F746_SAI_IO SD_PlayerSkeleton FrequencyResponseDrawer

Committer:
MikamiUitOpen
Date:
Tue Mar 28 10:45:48 2017 +0000
Revision:
23:878419f8638b
Parent:
16:cbb726ac20d8
24

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 8:12aa05f3cc24 1 //------------------------------------------------------------------------------
MikamiUitOpen 8:12aa05f3cc24 2 // Parameters calculator class of buquad unit for graphic equalizer
MikamiUitOpen 8:12aa05f3cc24 3 // グラフィックイコライザで使う biquad フィルタの係数を計算するクラス
MikamiUitOpen 8:12aa05f3cc24 4 //
MikamiUitOpen 23:878419f8638b 5 // 2017/03/28, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 8:12aa05f3cc24 6 //------------------------------------------------------------------------------
MikamiUitOpen 8:12aa05f3cc24 7
MikamiUitOpen 8:12aa05f3cc24 8 #ifndef GRAPHIC_EQALIZER_PARAMETER_CALCULATOR_HPP
MikamiUitOpen 8:12aa05f3cc24 9 #define GRAPHIC_EQALIZER_PARAMETER_CALCULATOR_HPP
MikamiUitOpen 8:12aa05f3cc24 10
MikamiUitOpen 8:12aa05f3cc24 11 #include "mbed.h"
MikamiUitOpen 8:12aa05f3cc24 12 #include "BiquadGrEq.hpp"
MikamiUitOpen 8:12aa05f3cc24 13
MikamiUitOpen 8:12aa05f3cc24 14 namespace Mikami
MikamiUitOpen 8:12aa05f3cc24 15 {
MikamiUitOpen 8:12aa05f3cc24 16 class GrEqParams
MikamiUitOpen 8:12aa05f3cc24 17 {
MikamiUitOpen 8:12aa05f3cc24 18 public:
MikamiUitOpen 8:12aa05f3cc24 19 // Constructor
MikamiUitOpen 8:12aa05f3cc24 20 GrEqParams(int bands, float fs) : BANDS_(bands), FS_(fs) {}
MikamiUitOpen 8:12aa05f3cc24 21
MikamiUitOpen 8:12aa05f3cc24 22 // 係数を計算する
MikamiUitOpen 16:cbb726ac20d8 23 // gDb : 利得(dB単位)
MikamiUitOpen 8:12aa05f3cc24 24 BiquadGrEq::Coefs Execute(int band, float f0, float gDb, float qVal)
MikamiUitOpen 8:12aa05f3cc24 25 {
MikamiUitOpen 8:12aa05f3cc24 26 const float PI = 3.1415926536f;
MikamiUitOpen 8:12aa05f3cc24 27 BiquadGrEq::Coefs coefs;
MikamiUitOpen 8:12aa05f3cc24 28
MikamiUitOpen 8:12aa05f3cc24 29 float gSqrt = sqrtf(powf(10, gDb/20.0f));
MikamiUitOpen 8:12aa05f3cc24 30 float w0 = 2.0f*PI*f0/FS_;
MikamiUitOpen 8:12aa05f3cc24 31
MikamiUitOpen 16:cbb726ac20d8 32 if ( (band != 0) && (band != BANDS_-1) ) // ピーキングフィルタ
MikamiUitOpen 8:12aa05f3cc24 33 {
MikamiUitOpen 8:12aa05f3cc24 34 float alpha = sinf(w0)/(2.0f*qVal);
MikamiUitOpen 23:878419f8638b 35 float beta = 1.0f + alpha/gSqrt;
MikamiUitOpen 23:878419f8638b 36 coefs.a1 = 2.0f*cosf(w0)/beta;
MikamiUitOpen 23:878419f8638b 37 coefs.a2 = -(1.0f - alpha/gSqrt)/beta;
MikamiUitOpen 23:878419f8638b 38 coefs.b0 = (1.0f + alpha*gSqrt)/beta;
MikamiUitOpen 8:12aa05f3cc24 39 coefs.b1 = -coefs.a1;
MikamiUitOpen 23:878419f8638b 40 coefs.b2 = (1.0f - alpha*gSqrt)/beta;
MikamiUitOpen 8:12aa05f3cc24 41 }
MikamiUitOpen 16:cbb726ac20d8 42 else // シェルビングフィルタ
MikamiUitOpen 16:cbb726ac20d8 43 { // Q は固定
MikamiUitOpen 8:12aa05f3cc24 44 w0 = (band == 0) ? w0*1.414f : w0/1.414f;
MikamiUitOpen 8:12aa05f3cc24 45 float alpha = sinf(w0)/sqrtf(2.0f); // Q = 1/sqrt(2)
MikamiUitOpen 8:12aa05f3cc24 46 float g_a = sqrtf(gSqrt);
MikamiUitOpen 8:12aa05f3cc24 47 float cosW0 = cosf(w0);
MikamiUitOpen 8:12aa05f3cc24 48 float gSqrtP1 = gSqrt+1.0f;
MikamiUitOpen 8:12aa05f3cc24 49 float gSqrtM1 = gSqrt-1.0f;
MikamiUitOpen 16:cbb726ac20d8 50 if (band == 0) // ローシェルビング
MikamiUitOpen 8:12aa05f3cc24 51 {
MikamiUitOpen 23:878419f8638b 52 float beta = gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 8:12aa05f3cc24 53 + 2.0f*g_a*alpha;
MikamiUitOpen 23:878419f8638b 54 coefs.a1 = 2.0f*(gSqrtM1 + gSqrtP1*cosW0)/beta;
MikamiUitOpen 8:12aa05f3cc24 55 coefs.a2 = -(gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 23:878419f8638b 56 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 8:12aa05f3cc24 57 coefs.b0 = gSqrt*(gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 23:878419f8638b 58 + 2.0f*g_a*alpha)/beta;
MikamiUitOpen 8:12aa05f3cc24 59 coefs.b1 = 2.0f*gSqrt*(gSqrtM1
MikamiUitOpen 23:878419f8638b 60 - gSqrtP1*cosW0)/beta;
MikamiUitOpen 8:12aa05f3cc24 61 coefs.b2 = gSqrt*(gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 23:878419f8638b 62 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 8:12aa05f3cc24 63 }
MikamiUitOpen 16:cbb726ac20d8 64 else // ハイシェルビング
MikamiUitOpen 8:12aa05f3cc24 65 {
MikamiUitOpen 23:878419f8638b 66 float beta = gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 8:12aa05f3cc24 67 + 2.0f*g_a*alpha;
MikamiUitOpen 23:878419f8638b 68 coefs.a1 = -2.0f*(gSqrtM1 - gSqrtP1*cosW0)/beta;
MikamiUitOpen 8:12aa05f3cc24 69 coefs.a2 = -(gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 23:878419f8638b 70 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 8:12aa05f3cc24 71 coefs.b0 = gSqrt*(gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 23:878419f8638b 72 + 2.0f*g_a*alpha)/beta;
MikamiUitOpen 23:878419f8638b 73 coefs.b1 = -2.0f*gSqrt*(gSqrtM1 + gSqrtP1*cosW0)/beta;
MikamiUitOpen 8:12aa05f3cc24 74 coefs.b2 = gSqrt*(gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 23:878419f8638b 75 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 8:12aa05f3cc24 76 }
MikamiUitOpen 8:12aa05f3cc24 77 }
MikamiUitOpen 8:12aa05f3cc24 78
MikamiUitOpen 8:12aa05f3cc24 79 return coefs;
MikamiUitOpen 8:12aa05f3cc24 80 }
MikamiUitOpen 8:12aa05f3cc24 81
MikamiUitOpen 8:12aa05f3cc24 82 private:
MikamiUitOpen 8:12aa05f3cc24 83 const int BANDS_;
MikamiUitOpen 8:12aa05f3cc24 84 const float FS_;
MikamiUitOpen 8:12aa05f3cc24 85 };
MikamiUitOpen 8:12aa05f3cc24 86 }
MikamiUitOpen 8:12aa05f3cc24 87 #endif // GRAPHIC_EQALIZER_PARAMETER_CALCULATOR_HPP