Integrated program of 4 different kinds of application programs for processing sound signal. 4種類のサウンド信号処理を統合したプログラム.

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton UIT_FFT_Real

Committer:
MikamiUitOpen
Date:
Thu Apr 13 23:23:30 2017 +0000
Revision:
15:fac50dd1de44
15

Who changed what in which revision?

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