不韋 呂 / F746_MySoundMachine

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real

Committer:
MikamiUitOpen
Date:
Mon Sep 26 07:07:05 2016 +0000
Revision:
2:fcba17e3d573
Parent:
0:224dccbc4edd
3

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 2:fcba17e3d573 23 // gDb : 利得(dB単位)
MikamiUitOpen 0:224dccbc4edd 24 BiquadGrEq::Coefs Execute(int band, float f0, float gDb, float qVal)
MikamiUitOpen 0:224dccbc4edd 25 {
MikamiUitOpen 0:224dccbc4edd 26 const float PI = 3.1415926536f;
MikamiUitOpen 0:224dccbc4edd 27 BiquadGrEq::Coefs coefs;
MikamiUitOpen 0:224dccbc4edd 28
MikamiUitOpen 0:224dccbc4edd 29 float gSqrt = sqrtf(powf(10, gDb/20.0f));
MikamiUitOpen 0:224dccbc4edd 30 float w0 = 2.0f*PI*f0/FS_;
MikamiUitOpen 0:224dccbc4edd 31
MikamiUitOpen 2:fcba17e3d573 32 if ( (band != 0) && (band != BANDS_-1) ) // ピーキングフィルタ
MikamiUitOpen 0:224dccbc4edd 33 {
MikamiUitOpen 0:224dccbc4edd 34 float alpha = sinf(w0)/(2.0f*qVal);
MikamiUitOpen 2:fcba17e3d573 35 float a00 = 1.0f + alpha/gSqrt;
MikamiUitOpen 2:fcba17e3d573 36 coefs.a1 = 2.0f*cosf(w0)/a00;
MikamiUitOpen 2:fcba17e3d573 37 coefs.a2 = -(1.0f - alpha/gSqrt)/a00;
MikamiUitOpen 2:fcba17e3d573 38 coefs.b0 = (1.0f + alpha*gSqrt)/a00;
MikamiUitOpen 0:224dccbc4edd 39 coefs.b1 = -coefs.a1;
MikamiUitOpen 2:fcba17e3d573 40 coefs.b2 = (1.0f - alpha*gSqrt)/a00;
MikamiUitOpen 0:224dccbc4edd 41 }
MikamiUitOpen 2:fcba17e3d573 42 else // シェルビングフィルタ
MikamiUitOpen 2:fcba17e3d573 43 { // Q は固定
MikamiUitOpen 0:224dccbc4edd 44 w0 = (band == 0) ? w0*1.414f : w0/1.414f;
MikamiUitOpen 0:224dccbc4edd 45 float alpha = sinf(w0)/sqrtf(2.0f); // Q = 1/sqrt(2)
MikamiUitOpen 0:224dccbc4edd 46 float g_a = sqrtf(gSqrt);
MikamiUitOpen 0:224dccbc4edd 47 float cosW0 = cosf(w0);
MikamiUitOpen 0:224dccbc4edd 48 float gSqrtP1 = gSqrt+1.0f;
MikamiUitOpen 0:224dccbc4edd 49 float gSqrtM1 = gSqrt-1.0f;
MikamiUitOpen 0:224dccbc4edd 50 if (band == 0)
MikamiUitOpen 0:224dccbc4edd 51 {
MikamiUitOpen 2:fcba17e3d573 52 float a00 = gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 0:224dccbc4edd 53 + 2.0f*g_a*alpha;
MikamiUitOpen 2:fcba17e3d573 54 coefs.a1 = 2.0f*(gSqrtM1 + gSqrtP1*cosW0)/a00;
MikamiUitOpen 0:224dccbc4edd 55 coefs.a2 = -(gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 2:fcba17e3d573 56 - 2.0f*g_a*alpha)/a00;
MikamiUitOpen 0:224dccbc4edd 57 coefs.b0 = gSqrt*(gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 2:fcba17e3d573 58 + 2.0f*g_a*alpha)/a00;
MikamiUitOpen 0:224dccbc4edd 59 coefs.b1 = 2.0f*gSqrt*(gSqrtM1
MikamiUitOpen 2:fcba17e3d573 60 - gSqrtP1*cosW0)/a00;
MikamiUitOpen 0:224dccbc4edd 61 coefs.b2 = gSqrt*(gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 2:fcba17e3d573 62 - 2.0f*g_a*alpha)/a00;
MikamiUitOpen 0:224dccbc4edd 63 }
MikamiUitOpen 0:224dccbc4edd 64 else
MikamiUitOpen 0:224dccbc4edd 65 {
MikamiUitOpen 2:fcba17e3d573 66 float a00 = gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 0:224dccbc4edd 67 + 2.0f*g_a*alpha;
MikamiUitOpen 2:fcba17e3d573 68 coefs.a1 = -2.0f*(gSqrtM1 - gSqrtP1*cosW0)/a00;
MikamiUitOpen 0:224dccbc4edd 69 coefs.a2 = -(gSqrtP1 - gSqrtM1*cosW0
MikamiUitOpen 2:fcba17e3d573 70 - 2.0f*g_a*alpha)/a00;
MikamiUitOpen 0:224dccbc4edd 71 coefs.b0 = gSqrt*(gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 2:fcba17e3d573 72 + 2.0f*g_a*alpha)/a00;
MikamiUitOpen 2:fcba17e3d573 73 coefs.b1 = -2.0f*gSqrt*(gSqrtM1 + gSqrtP1*cosW0)/a00;
MikamiUitOpen 0:224dccbc4edd 74 coefs.b2 = gSqrt*(gSqrtP1 + gSqrtM1*cosW0
MikamiUitOpen 2:fcba17e3d573 75 - 2.0f*g_a*alpha)/a00;
MikamiUitOpen 0:224dccbc4edd 76 }
MikamiUitOpen 0:224dccbc4edd 77 }
MikamiUitOpen 0:224dccbc4edd 78
MikamiUitOpen 0:224dccbc4edd 79 return coefs;
MikamiUitOpen 0:224dccbc4edd 80 }
MikamiUitOpen 0:224dccbc4edd 81
MikamiUitOpen 0:224dccbc4edd 82 private:
MikamiUitOpen 0:224dccbc4edd 83 const int BANDS_;
MikamiUitOpen 0:224dccbc4edd 84 const float FS_;
MikamiUitOpen 0:224dccbc4edd 85 };
MikamiUitOpen 0:224dccbc4edd 86 }
MikamiUitOpen 0:224dccbc4edd 87 #endif // GRAPHIC_EQALIZER_PARAMETER_CALCULATOR_HPP