Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: UIT_ACM1602NI UITDSP_ADDA mbed UIT_AQM1602
WindowingDesign.cpp
00001 //------------------------------------------------------------------------------ 00002 // Design of FIR filter of 4 type passbands using window method 00003 // 00004 // 2014/12/07, Copyright (c) 2014 MIKAMI, Naoki 00005 //------------------------------------------------------------------------------ 00006 00007 #include "WindowingDesign.hpp" 00008 00009 namespace Mikami 00010 { 00011 WindowingDesign::WindowingDesign(int order, float fs) 00012 : FS_(fs), PI_FS_(3.1415926536f/fs) 00013 { 00014 order_ = order; 00015 if ((order % 2) != 0) 00016 { 00017 fprintf(stderr, "order must be even."); 00018 return; 00019 } 00020 hm_ = new float[order/2+1]; 00021 wn_ = new float[order/2+1]; 00022 00023 HammWindow(); 00024 } 00025 00026 void WindowingDesign::Design(int order, Type pb, 00027 float fc1, float fc2, 00028 float hk[]) 00029 { 00030 if (pb == LPF) fC_ = fc1; 00031 if (pb == HPF) fC_ = 0.5f*FS_ - fc1; 00032 00033 float w0 = PI_FS_*(fc1 + fc2); 00034 if ((pb == BPF) || (pb == BRF)) 00035 fC_ = 0.5f*fabs(fc2 - fc1); 00036 00037 if (order != order_) 00038 { 00039 order_ = order_; 00040 if (hm_ != NULL) delete[] hm_; 00041 hm_ = new float[order/2+1]; 00042 if (wn_ != NULL) delete[] wn_; 00043 wn_ = new float[order/2+1]; 00044 HammWindow(); 00045 } 00046 00047 // Calculate coefficients for LPF 00048 LpfCoefficients(); 00049 // If not LPF, transform coefficients 00050 if (pb != LPF) Transform(pb, w0); 00051 00052 for (int k=0; k<=order/2; k++) 00053 hk[k] = hm_[order/2-k]; 00054 } 00055 00056 // Calculation of coefficients for LPF 00057 void WindowingDesign::LpfCoefficients() 00058 { 00059 float w = 2.0f*PI_FS_*fC_; 00060 hm_[0] = 2.0f*fC_/FS_; 00061 for (int k=1; k<=order_/2; k++) 00062 hm_[k] = (sinf(k*w)/(PI_*k))*wn_[k]; 00063 } 00064 00065 // Transform LPF to HPF, BPF, or BRF 00066 void WindowingDesign::Transform(Type pb, float w0) 00067 { 00068 if (pb == HPF) // To HPF 00069 for (int k=1; k<=order_/2; k+=2) 00070 hm_[k] = -hm_[k]; 00071 00072 if (pb == BPF) // To BPF 00073 for (int k=0; k<=order_/2; k++) 00074 hm_[k] = 2.0f*cosf(w0*k)*hm_[k]; 00075 00076 if (pb == BRF) // To BRF 00077 { 00078 hm_[0] = 1.0f - 2.0f*hm_[0]; 00079 for (int k=1; k<=order_/2; k++) 00080 hm_[k] = -2.0*cosf(w0*k)*hm_[k]; 00081 } 00082 } 00083 00084 // Hamming window 00085 void WindowingDesign::HammWindow() 00086 { 00087 float pi2OvM = 2.0f*PI_/(float)(order_ + 1); 00088 for (int n=0; n<=order_/2; n++) 00089 wn_[n] = 0.54f + 0.46f*cosf(pi2OvM*n); 00090 } 00091 }
Generated on Sat Jul 16 2022 00:19:06 by
1.7.2