Cutoff frequency variable LPF 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:47:04 2014 +0000
Revision:
6:ccd700fb3f3a
Parent:
0:b8bffbcb85fd
7

Who changed what in which revision?

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