Cutoff frequency variable LPF and HPF by 160th-order FIR filter designed by window method usin Hamming window for ST Nucleo F401RE.

Dependencies:   UIT_ACM1602NI UIT_ADDA mbed

Committer:
MikamiUitOpen
Date:
Mon Dec 08 05:46:37 2014 +0000
Revision:
7:46327dcab1bf
7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 7:46327dcab1bf 1 //------------------------------------------------------------------------------
MikamiUitOpen 7:46327dcab1bf 2 // Design of FIR filter of LPF and HPF using window method
MikamiUitOpen 7:46327dcab1bf 3 //
MikamiUitOpen 7:46327dcab1bf 4 // 2014/12/08, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 7:46327dcab1bf 5 //------------------------------------------------------------------------------
MikamiUitOpen 7:46327dcab1bf 6
MikamiUitOpen 7:46327dcab1bf 7 #include "WindowingDesignLH.hpp"
MikamiUitOpen 7:46327dcab1bf 8
MikamiUitOpen 7:46327dcab1bf 9 namespace Mikami
MikamiUitOpen 7:46327dcab1bf 10 {
MikamiUitOpen 7:46327dcab1bf 11 WindowingDesign::WindowingDesign(int order, float fs)
MikamiUitOpen 7:46327dcab1bf 12 : FS_(fs), PI_FS_(3.1415926536f/fs)
MikamiUitOpen 7:46327dcab1bf 13 {
MikamiUitOpen 7:46327dcab1bf 14 order_ = order;
MikamiUitOpen 7:46327dcab1bf 15 if ((order % 2) != 0)
MikamiUitOpen 7:46327dcab1bf 16 {
MikamiUitOpen 7:46327dcab1bf 17 fprintf(stderr, "order must be even.");
MikamiUitOpen 7:46327dcab1bf 18 return;
MikamiUitOpen 7:46327dcab1bf 19 }
MikamiUitOpen 7:46327dcab1bf 20 hm_ = new float[order/2+1];
MikamiUitOpen 7:46327dcab1bf 21 wn_ = new float[order/2+1];
MikamiUitOpen 7:46327dcab1bf 22
MikamiUitOpen 7:46327dcab1bf 23 HammWindow();
MikamiUitOpen 7:46327dcab1bf 24 }
MikamiUitOpen 7:46327dcab1bf 25
MikamiUitOpen 7:46327dcab1bf 26 void WindowingDesign::Design(int order, Type pb, float fc,
MikamiUitOpen 7:46327dcab1bf 27 float hk[])
MikamiUitOpen 7:46327dcab1bf 28 {
MikamiUitOpen 7:46327dcab1bf 29 if (pb == LPF) fC_ = fc;
MikamiUitOpen 7:46327dcab1bf 30 if (pb == HPF) fC_ = 0.5f*FS_ - fc;
MikamiUitOpen 7:46327dcab1bf 31
MikamiUitOpen 7:46327dcab1bf 32 if (order != order_)
MikamiUitOpen 7:46327dcab1bf 33 {
MikamiUitOpen 7:46327dcab1bf 34 order_ = order_;
MikamiUitOpen 7:46327dcab1bf 35 if (hm_ != NULL) delete[] hm_;
MikamiUitOpen 7:46327dcab1bf 36 hm_ = new float[order/2+1];
MikamiUitOpen 7:46327dcab1bf 37 if (wn_ != NULL) delete[] wn_;
MikamiUitOpen 7:46327dcab1bf 38 wn_ = new float[order/2+1];
MikamiUitOpen 7:46327dcab1bf 39 HammWindow();
MikamiUitOpen 7:46327dcab1bf 40 }
MikamiUitOpen 7:46327dcab1bf 41
MikamiUitOpen 7:46327dcab1bf 42 // Calculate coefficients for LPF
MikamiUitOpen 7:46327dcab1bf 43 LpfCoefficients();
MikamiUitOpen 7:46327dcab1bf 44 // If HPF, transform coefficients
MikamiUitOpen 7:46327dcab1bf 45 if (pb != LPF) ToHpf();
MikamiUitOpen 7:46327dcab1bf 46
MikamiUitOpen 7:46327dcab1bf 47 for (int k=0; k<=order/2; k++)
MikamiUitOpen 7:46327dcab1bf 48 hk[k] = hm_[order/2-k];
MikamiUitOpen 7:46327dcab1bf 49 }
MikamiUitOpen 7:46327dcab1bf 50
MikamiUitOpen 7:46327dcab1bf 51 // Calculation of coefficients for LPF
MikamiUitOpen 7:46327dcab1bf 52 void WindowingDesign::LpfCoefficients()
MikamiUitOpen 7:46327dcab1bf 53 {
MikamiUitOpen 7:46327dcab1bf 54 float w = 2.0f*PI_FS_*fC_;
MikamiUitOpen 7:46327dcab1bf 55 hm_[0] = 2.0f*fC_/FS_;
MikamiUitOpen 7:46327dcab1bf 56 for (int k=1; k<=order_/2; k++)
MikamiUitOpen 7:46327dcab1bf 57 hm_[k] = (sinf(k*w)/(PI_*k))*wn_[k];
MikamiUitOpen 7:46327dcab1bf 58 }
MikamiUitOpen 7:46327dcab1bf 59
MikamiUitOpen 7:46327dcab1bf 60 // Transform LPF to HPF
MikamiUitOpen 7:46327dcab1bf 61 void WindowingDesign::ToHpf()
MikamiUitOpen 7:46327dcab1bf 62 {
MikamiUitOpen 7:46327dcab1bf 63 for (int k=1; k<=order_/2; k+=2)
MikamiUitOpen 7:46327dcab1bf 64 hm_[k] = -hm_[k];
MikamiUitOpen 7:46327dcab1bf 65 }
MikamiUitOpen 7:46327dcab1bf 66
MikamiUitOpen 7:46327dcab1bf 67 // Hamming window
MikamiUitOpen 7:46327dcab1bf 68 void WindowingDesign::HammWindow()
MikamiUitOpen 7:46327dcab1bf 69 {
MikamiUitOpen 7:46327dcab1bf 70 float pi2OvM = 2.0f*PI_/(float)(order_ + 1);
MikamiUitOpen 7:46327dcab1bf 71 for (int n=0; n<=order_/2; n++)
MikamiUitOpen 7:46327dcab1bf 72 wn_[n] = 0.54f + 0.46f*cosf(pi2OvM*n);
MikamiUitOpen 7:46327dcab1bf 73 }
MikamiUitOpen 7:46327dcab1bf 74 }
MikamiUitOpen 7:46327dcab1bf 75