不韋 呂 / F746_MySoundMachine

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real

Committer:
MikamiUitOpen
Date:
Mon Aug 15 07:18:07 2016 +0000
Revision:
0:224dccbc4edd
Child:
2:fcba17e3d573
1

Who changed what in which revision?

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