不韋 呂 / Mbed 2 deprecated UIT2_VariableFIR

Dependencies:   UIT_ACM1602NI UITDSP_ADDA mbed UIT_AQM1602

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WindowingDesign.cpp Source File

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 }