SD card player with variable cotoff frequency lowpass and highpass IIR filter. SD カードの *.wav ファイルのオーディオ信号を,遮断周波数可変 IIR 低域通過および高域通過フィルタを通して,ボードに搭載されているCODEC で出力する.このプログラムについては,CQ出版社インターフェース誌 2018年8月号で解説している.

Dependencies:   F746_GUI F746_SAI_IO FrequencyResponseDrawer SD_PlayerSkeleton

Committer:
MikamiUitOpen
Date:
Mon Apr 10 01:44:22 2017 +0000
Revision:
11:399670d24ed9
Parent:
10:3532c05aa1a9
12

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 9:c8eb2f013cc2 1 //--------------------------------------------------------------
MikamiUitOpen 9:c8eb2f013cc2 2 // 縦続形 IIR フィルタで使う 1D タイプの 2 次のフィルタ
MikamiUitOpen 9:c8eb2f013cc2 3 // Biquad filter of 1D type for IIR filter of cascade structure
MikamiUitOpen 9:c8eb2f013cc2 4 // このクラスでは,係数は実行中に書き換えられることを想定している
MikamiUitOpen 9:c8eb2f013cc2 5 //
MikamiUitOpen 9:c8eb2f013cc2 6 // u[n] = x[n] + a1*u[n-1] + a2*u[n-2]
MikamiUitOpen 9:c8eb2f013cc2 7 // y[n] = u[n] + b1*u[n-1] + b2*u[n-2]
MikamiUitOpen 9:c8eb2f013cc2 8 // x[n] : input signal
MikamiUitOpen 9:c8eb2f013cc2 9 // y[n] : output signal
MikamiUitOpen 9:c8eb2f013cc2 10 // b0 = 1
MikamiUitOpen 9:c8eb2f013cc2 11 //
MikamiUitOpen 10:3532c05aa1a9 12 // 2017/03/26, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 9:c8eb2f013cc2 13 //--------------------------------------------------------------
MikamiUitOpen 9:c8eb2f013cc2 14
MikamiUitOpen 9:c8eb2f013cc2 15 #ifndef IIR_BIQUAD_HPP
MikamiUitOpen 9:c8eb2f013cc2 16 #define IIR_BIQUAD_HPP
MikamiUitOpen 9:c8eb2f013cc2 17
MikamiUitOpen 9:c8eb2f013cc2 18 #include "mbed.h"
MikamiUitOpen 9:c8eb2f013cc2 19
MikamiUitOpen 9:c8eb2f013cc2 20 // 2nd order IIR filter
MikamiUitOpen 9:c8eb2f013cc2 21 namespace Mikami
MikamiUitOpen 9:c8eb2f013cc2 22 {
MikamiUitOpen 9:c8eb2f013cc2 23 class Biquad
MikamiUitOpen 9:c8eb2f013cc2 24 {
MikamiUitOpen 9:c8eb2f013cc2 25 public:
MikamiUitOpen 9:c8eb2f013cc2 26 struct Coefs { float a1, a2, b1, b2; };
MikamiUitOpen 9:c8eb2f013cc2 27
MikamiUitOpen 9:c8eb2f013cc2 28 Biquad(const Coefs ck = (Coefs){0, 0, 0, 0})
MikamiUitOpen 9:c8eb2f013cc2 29 {
MikamiUitOpen 9:c8eb2f013cc2 30 SetCoefficients(ck);
MikamiUitOpen 9:c8eb2f013cc2 31 Clear();
MikamiUitOpen 9:c8eb2f013cc2 32 }
MikamiUitOpen 9:c8eb2f013cc2 33
MikamiUitOpen 9:c8eb2f013cc2 34 void SetCoefficients(const Coefs cf) { cf_ = cf; }
MikamiUitOpen 9:c8eb2f013cc2 35
MikamiUitOpen 9:c8eb2f013cc2 36 float Execute(float xn)
MikamiUitOpen 9:c8eb2f013cc2 37 {
MikamiUitOpen 9:c8eb2f013cc2 38 float un = xn + cf_.a1*un1_ + cf_.a2*un2_;
MikamiUitOpen 9:c8eb2f013cc2 39 float yn = un + cf_.b1*un1_ + cf_.b2*un2_;
MikamiUitOpen 9:c8eb2f013cc2 40
MikamiUitOpen 9:c8eb2f013cc2 41 un2_ = un1_;
MikamiUitOpen 9:c8eb2f013cc2 42 un1_ = un;
MikamiUitOpen 9:c8eb2f013cc2 43
MikamiUitOpen 9:c8eb2f013cc2 44 return yn;
MikamiUitOpen 9:c8eb2f013cc2 45 }
MikamiUitOpen 9:c8eb2f013cc2 46
MikamiUitOpen 9:c8eb2f013cc2 47 void Clear() { un1_ = un2_ = 0; }
MikamiUitOpen 9:c8eb2f013cc2 48
MikamiUitOpen 9:c8eb2f013cc2 49 private:
MikamiUitOpen 9:c8eb2f013cc2 50 Coefs cf_;
MikamiUitOpen 9:c8eb2f013cc2 51 float un1_, un2_;
MikamiUitOpen 9:c8eb2f013cc2 52
MikamiUitOpen 9:c8eb2f013cc2 53 // disallow copy constructor
MikamiUitOpen 9:c8eb2f013cc2 54 Biquad(const Biquad&);
MikamiUitOpen 9:c8eb2f013cc2 55 };
MikamiUitOpen 9:c8eb2f013cc2 56 }
MikamiUitOpen 9:c8eb2f013cc2 57 #endif // IIR_BIQUAD_HPP