00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #ifndef _GR_SINGLE_POLE_IIR_H_
00023 #define _GR_SINGLE_POLE_IIR_H_
00024 
00025 #include <stdexcept>
00026 
00030 template<class o_type, class i_type, class tap_type> 
00031 class gr_single_pole_iir {
00032 public:
00038   gr_single_pole_iir (tap_type alpha = 1.0)
00039   {
00040     d_prev_output = 0;
00041     set_taps (alpha);
00042   }
00043 
00048   o_type filter (const i_type input);
00049 
00054   void filterN (o_type output[], const i_type input[], unsigned long n);
00055 
00059   void set_taps (tap_type alpha)
00060   { 
00061     if (alpha < 0 || alpha > 1)
00062       throw std::out_of_range ("Alpha must be in [0, 1]\n");
00063 
00064     d_alpha = alpha;
00065     d_one_minus_alpha = 1.0 - alpha;
00066   }
00067 
00069   void reset ()
00070   {
00071     d_prev_output = 0;
00072   }
00073     
00074 protected:
00075   tap_type      d_alpha;
00076   tap_type      d_one_minus_alpha;
00077   tap_type      d_prev_output;
00078 };
00079 
00080 
00081 
00082 
00083 
00084 template<class o_type, class i_type, class tap_type> 
00085 o_type
00086 gr_single_pole_iir<o_type, i_type, tap_type>::filter (const i_type input)
00087 {
00088   tap_type      output;
00089 
00090   output = d_alpha * input + d_one_minus_alpha * d_prev_output;
00091   d_prev_output = output;
00092 
00093   return (o_type) output;
00094 }
00095 
00096 
00097 template<class o_type, class i_type, class tap_type> 
00098 void 
00099 gr_single_pole_iir<o_type, i_type, tap_type>::filterN (o_type output[],
00100                                                        const i_type input[],
00101                                                        unsigned long n)
00102 {
00103   for (unsigned i = 0; i < n; i++)
00104     output[i] = filter (input[i]);
00105 }
00106 
00107 
00108 #endif