~ubuntu-branches/ubuntu/trusty/gnuradio/trusty

« back to all changes in this revision

Viewing changes to gnuradio-core/src/lib/filter/gr_single_pole_rec.h

  • Committer: Bazaar Package Importer
  • Author(s): Kamal Mostafa
  • Date: 2010-03-13 07:46:01 UTC
  • mfrom: (2.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20100313074601-zjsa893a87bozyh7
Tags: 3.2.2.dfsg-1ubuntu1
* Fix build for Ubuntu lucid (LP: #260406)
  - add binary package dep for libusrp0, libusrp2-0: adduser
  - debian/rules clean: remove pre-built Qt moc files

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- c++ -*- */
2
 
/*
3
 
 * Copyright 2002 Free Software Foundation, Inc.
4
 
 * 
5
 
 * This file is part of GNU Radio
6
 
 * 
7
 
 * GNU Radio is free software; you can redistribute it and/or modify
8
 
 * it under the terms of the GNU General Public License as published by
9
 
 * the Free Software Foundation; either version 3, or (at your option)
10
 
 * any later version.
11
 
 * 
12
 
 * GNU Radio is distributed in the hope that it will be useful,
13
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
 * GNU General Public License for more details.
16
 
 * 
17
 
 * You should have received a copy of the GNU General Public License
18
 
 * along with GNU Radio; see the file COPYING.  If not, write to
19
 
 * the Free Software Foundation, Inc., 51 Franklin Street,
20
 
 * Boston, MA 02110-1301, USA.
21
 
 */
22
 
#ifndef _GR_SINGLE_POLE_REC_H_
23
 
#define _GR_SINGLE_POLE_REC_H_
24
 
 
25
 
#include <stdexcept>
26
 
 
27
 
/*!
28
 
 * \brief class template for single pole recursive filter
29
 
 */
30
 
template<class o_type, class i_type, class tap_type> 
31
 
class gr_single_pole_rec {
32
 
public:
33
 
  /*!
34
 
   * \brief construct new single pole IIR with given alpha
35
 
   *
36
 
   * computes y(i) = alpha * x(i) - (1-alpha) * y(i-1)
37
 
   */
38
 
  gr_single_pole_rec (tap_type alpha = 1.0)
39
 
  {
40
 
    d_prev_output = 0;
41
 
    set_taps (alpha);
42
 
  }
43
 
 
44
 
  /*!
45
 
   * \brief compute a single output value.
46
 
   * \returns the filtered input value.
47
 
   */
48
 
  o_type filter (const i_type input);
49
 
 
50
 
  /*!
51
 
   * \brief compute an array of N output values.
52
 
   * \p input must have n valid entries.
53
 
   */
54
 
  void filterN (o_type output[], const i_type input[], unsigned long n);
55
 
 
56
 
  /*!
57
 
   * \brief install \p alpha as the current taps.
58
 
   */
59
 
  void set_taps (tap_type alpha)
60
 
  { 
61
 
    if (alpha < 0 || alpha > 1)
62
 
      throw std::out_of_range ("Alpha must be in [0, 1]\n");
63
 
 
64
 
    d_alpha = alpha;
65
 
    d_one_minus_alpha = 1.0 - alpha;
66
 
  }
67
 
 
68
 
  //! reset state to pole
69
 
  void reset ()
70
 
  {
71
 
    d_prev_output = 0;
72
 
  }
73
 
 
74
 
  tap_type prev_output () { return d_prev_output; }
75
 
    
76
 
protected:
77
 
  tap_type      d_alpha;
78
 
  tap_type      d_one_minus_alpha;
79
 
  tap_type      d_prev_output;
80
 
};
81
 
 
82
 
 
83
 
//
84
 
// general case.  We may want to specialize this
85
 
//
86
 
template<class o_type, class i_type, class tap_type> 
87
 
o_type
88
 
gr_single_pole_rec<o_type, i_type, tap_type>::filter (const i_type input)
89
 
{
90
 
  tap_type      output;
91
 
 
92
 
  output = d_alpha * input + d_one_minus_alpha * d_prev_output;
93
 
  d_prev_output = output;
94
 
 
95
 
  return (o_type) output;
96
 
}
97
 
 
98
 
 
99
 
template<class o_type, class i_type, class tap_type> 
100
 
void 
101
 
gr_single_pole_rec<o_type, i_type, tap_type>::filterN (o_type output[],
102
 
                                                       const i_type input[],
103
 
                                                       unsigned long n)
104
 
{
105
 
  for (unsigned i = 0; i < n; i++)
106
 
    output[i] = filter (input[i]);
107
 
}
108
 
 
109
 
 
110
 
#endif /* _GR_SINGLE_POLE_REC_H_ */