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
WindowingDesignLpfHpf/WindowingDesignLH.cpp@6:ccd700fb3f3a, 2014-12-08 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Dec 08 05:47:04 2014 +0000
- Revision:
- 6:ccd700fb3f3a
- Parent:
- 0:b8bffbcb85fd
7
Who changed what in which revision?
User | Revision | Line number | New 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 |