Output the audio signal with filtering by graphic equalizer in the *.wav file on the SD card using onboard CODEC. SD カードの *.wav ファイルのオーディオ信号をグラフィック・イコライザを通して,ボードに搭載されているCODEC で出力する.

Dependencies:   F746_GUI F746_SAI_IO SD_PlayerSkeleton FrequencyResponseDrawer

Committer:
MikamiUitOpen
Date:
Mon May 09 08:54:09 2016 +0000
Revision:
8:12aa05f3cc24
8

Who changed what in which revision?

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