Chapter003_TRobot
Dependencies: F746_GUI Array_Matrix TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG SDFileSystem_Warning_Fixed FrequencyResponseDrawer F746_SAI_IO
MyClasses_Functions/BilinearDesignLH.cpp
- Committer:
- SanYune
- Date:
- 2019-04-01
- Revision:
- 12:fde5056cec5c
- Parent:
- 0:04b43b777fae
File content as of revision 12:fde5056cec5c:
//------------------------------------------------------------------------------ // Design of Butterworth LPF and HPF using bilinear transform // // 2016/03/31, Copyright (c) 2016 MIKAMI, Naoki //------------------------------------------------------------------------------ #include "BilinearDesignLH.hpp" namespace Mikami { // Execute design // input // fc: Cutoff frequency // pb: Passband (LPF or HPF) // output // c : Coefficients for cascade structure // g : Gain factor for cascade structure void BilinearDesign::Execute(float fc, Type pb, Coefs c[], float& g) { Butterworth(); Bilinear(fc); ToCascade(pb); GetGain(pb); GetCoefs(c, g); } // Get poles for Butterworth characteristics void BilinearDesign::Butterworth() { float pi_2order = PI_/(2.0f*ORDER_); for (int j=0; j<ORDER_/2; j++) // Pole with imaginary part >= 0 { float theta = (2.0f*j + 1.0f)*pi_2order; sP_[j] = Complex(-cosf(theta), sinf(theta)); } } // Bilinear transform // fc: Cutoff frequency void BilinearDesign::Bilinear(float fc) { float wc = tanf(fc*PI_FS_); for (int k=0; k<ORDER_/2; k++) zP_[k] = (1.0f + wc*sP_[k])/(1.0f - wc*sP_[k]); } // Convert to coefficients for cascade structure void BilinearDesign::ToCascade(Type pb) { for (int j=0; j<ORDER_/2; j++) { ck_[j].a1 = 2.0f*real(zP_[j]); // a1m ck_[j].a2 = -norm(zP_[j]); // a2m ck_[j].b1 = (pb == LPF) ? 2.0f : -2.0f; // b1m ck_[j].b2 = 1.0f; // b2m } } // Calculate gain factor void BilinearDesign::GetGain(Type pb) { float u = (pb == LPF) ? 1.0f : -1.0f; float g0 = 1.0f; for (int k=0; k<ORDER_/2; k++) g0 = g0*(1.0f - (ck_[k].a1 + ck_[k].a2*u)*u)/ (1.0f + (ck_[k].b1 + ck_[k].b2*u)*u); gain_ = g0; } // Get coefficients void BilinearDesign::GetCoefs(Coefs c[], float& gain) { for (int k=0; k<ORDER_/2; k++) c[k] = ck_[k]; gain = gain_; } }