Nucleo-F446 によるグラフィック・イコライザ.DA変換器にデータを送る際は 4 倍にアップ・サンプリング.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_Multirate
GraphicEqualizer/GrEqParamsCalculator.cpp@6:7dd696fe86c8, 2019-01-31 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Jan 31 12:40:34 2019 +0000
- Revision:
- 6:7dd696fe86c8
- Parent:
- 0:0312aa1893cf
7
Who changed what in which revision?
User | Revision | Line number | New 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 | } |