Nucleo-F446 によるグラフィック・イコライザ.DA変換器にデータを送る際は 4 倍にアップ・サンプリング.

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Committer:
MikamiUitOpen
Date:
Thu Jan 31 12:40:34 2019 +0000
Revision:
6:7dd696fe86c8
Parent:
0:0312aa1893cf
7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:0312aa1893cf 1 //------------------------------------------------------------------------------
MikamiUitOpen 0:0312aa1893cf 2 // Parameters calculator class of buquad unit for graphic equalizer
MikamiUitOpen 0:0312aa1893cf 3 // グラフィックイコライザで使う biquad フィルタの係数を計算するクラス
MikamiUitOpen 0:0312aa1893cf 4 //
MikamiUitOpen 0:0312aa1893cf 5 // 2018/06/04, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:0312aa1893cf 6 //------------------------------------------------------------------------------
MikamiUitOpen 0:0312aa1893cf 7
MikamiUitOpen 0:0312aa1893cf 8 #include "GrEqParamsCalculator.hpp"
MikamiUitOpen 0:0312aa1893cf 9
MikamiUitOpen 0:0312aa1893cf 10 namespace Mikami
MikamiUitOpen 0:0312aa1893cf 11 {
MikamiUitOpen 0:0312aa1893cf 12 // 計算した係数を取得する
MikamiUitOpen 0:0312aa1893cf 13 // gDb : 利得(dB単位)
MikamiUitOpen 0:0312aa1893cf 14 BiquadGrEq::Coefs GrEqParams::Get(int band, float f0, float gDb, float qVal)
MikamiUitOpen 0:0312aa1893cf 15 {
MikamiUitOpen 0:0312aa1893cf 16 const float PI = 3.1415926536f;
MikamiUitOpen 0:0312aa1893cf 17 BiquadGrEq::Coefs coefs;
MikamiUitOpen 0:0312aa1893cf 18
MikamiUitOpen 0:0312aa1893cf 19 float gSqrt = sqrtf(powf(10, gDb/20.0f));
MikamiUitOpen 0:0312aa1893cf 20 float w0 = 2.0f*PI*f0/FS_;
MikamiUitOpen 0:0312aa1893cf 21
MikamiUitOpen 0:0312aa1893cf 22 if ( (band != 0) && (band != BANDS_-1) ) // ピーキング・フィルタ
MikamiUitOpen 0:0312aa1893cf 23 {
MikamiUitOpen 0:0312aa1893cf 24 float alpha = sinf(w0)/(2.0f*qVal);
MikamiUitOpen 0:0312aa1893cf 25 float beta = 1.0f + alpha/gSqrt;
MikamiUitOpen 0:0312aa1893cf 26 coefs.a1 = 2.0f*cosf(w0)/beta;
MikamiUitOpen 0:0312aa1893cf 27 coefs.a2 = -(1.0f - alpha/gSqrt)/beta;
MikamiUitOpen 0:0312aa1893cf 28 coefs.b0 = (1.0f + alpha*gSqrt)/beta;
MikamiUitOpen 0:0312aa1893cf 29 coefs.b1 = -coefs.a1;
MikamiUitOpen 0:0312aa1893cf 30 coefs.b2 = (1.0f - alpha*gSqrt)/beta;
MikamiUitOpen 0:0312aa1893cf 31 }
MikamiUitOpen 0:0312aa1893cf 32 else // シェルビング・フィルタ
MikamiUitOpen 0:0312aa1893cf 33 { // Q は固定(1/sqrt(2))
MikamiUitOpen 0:0312aa1893cf 34 w0 = (band == 0) ? w0*1.414214f : w0/1.414214f;
MikamiUitOpen 0:0312aa1893cf 35 float alpha = sinf(w0)/1.414214f;
MikamiUitOpen 0:0312aa1893cf 36 float g_a = sqrtf(gSqrt);
MikamiUitOpen 0:0312aa1893cf 37 float cosW0 = cosf(w0);
MikamiUitOpen 0:0312aa1893cf 38 float gSqrtP1 = gSqrt+1.0f;
MikamiUitOpen 0:0312aa1893cf 39 float gSqrtM1 = gSqrt-1.0f;
MikamiUitOpen 0:0312aa1893cf 40 if (band == 0) // ローシェルビング・フィルタ
MikamiUitOpen 0:0312aa1893cf 41 {
MikamiUitOpen 0:0312aa1893cf 42 float beta = gSqrtP1 + gSqrtM1*cosW0 + 2.0f*g_a*alpha;
MikamiUitOpen 0:0312aa1893cf 43 coefs.a1 = 2.0f*(gSqrtM1 + gSqrtP1*cosW0)/beta;
MikamiUitOpen 0:0312aa1893cf 44 coefs.a2 = -(gSqrtP1 + gSqrtM1*cosW0 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 0:0312aa1893cf 45 coefs.b0 = gSqrt*(gSqrtP1 - gSqrtM1*cosW0 + 2.0f*g_a*alpha)/beta;
MikamiUitOpen 0:0312aa1893cf 46 coefs.b1 = 2.0f*gSqrt*(gSqrtM1 - gSqrtP1*cosW0)/beta;
MikamiUitOpen 0:0312aa1893cf 47 coefs.b2 = gSqrt*(gSqrtP1 - gSqrtM1*cosW0 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 0:0312aa1893cf 48 }
MikamiUitOpen 0:0312aa1893cf 49 else // ハイシェルビング・フィルタ
MikamiUitOpen 0:0312aa1893cf 50 {
MikamiUitOpen 0:0312aa1893cf 51 float beta = gSqrtP1 - gSqrtM1*cosW0 + 2.0f*g_a*alpha;
MikamiUitOpen 0:0312aa1893cf 52 coefs.a1 = -2.0f*(gSqrtM1 - gSqrtP1*cosW0)/beta;
MikamiUitOpen 0:0312aa1893cf 53 coefs.a2 = -(gSqrtP1 - gSqrtM1*cosW0 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 0:0312aa1893cf 54 coefs.b0 = gSqrt*(gSqrtP1 + gSqrtM1*cosW0 + 2.0f*g_a*alpha)/beta;
MikamiUitOpen 0:0312aa1893cf 55 coefs.b1 = -2.0f*gSqrt*(gSqrtM1 + gSqrtP1*cosW0)/beta;
MikamiUitOpen 0:0312aa1893cf 56 coefs.b2 = gSqrt*(gSqrtP1 + gSqrtM1*cosW0 - 2.0f*g_a*alpha)/beta;
MikamiUitOpen 0:0312aa1893cf 57 }
MikamiUitOpen 0:0312aa1893cf 58 }
MikamiUitOpen 0:0312aa1893cf 59
MikamiUitOpen 0:0312aa1893cf 60 return coefs;
MikamiUitOpen 0:0312aa1893cf 61 }
MikamiUitOpen 0:0312aa1893cf 62 }