3
* Copyright 2002 Free Software Foundation, Inc.
5
* This file is part of GNU Radio
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)
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.
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.
22
#ifndef _GR_SINGLE_POLE_REC_H_
23
#define _GR_SINGLE_POLE_REC_H_
28
* \brief class template for single pole recursive filter
30
template<class o_type, class i_type, class tap_type>
31
class gr_single_pole_rec {
34
* \brief construct new single pole IIR with given alpha
36
* computes y(i) = alpha * x(i) - (1-alpha) * y(i-1)
38
gr_single_pole_rec (tap_type alpha = 1.0)
45
* \brief compute a single output value.
46
* \returns the filtered input value.
48
o_type filter (const i_type input);
51
* \brief compute an array of N output values.
52
* \p input must have n valid entries.
54
void filterN (o_type output[], const i_type input[], unsigned long n);
57
* \brief install \p alpha as the current taps.
59
void set_taps (tap_type alpha)
61
if (alpha < 0 || alpha > 1)
62
throw std::out_of_range ("Alpha must be in [0, 1]\n");
65
d_one_minus_alpha = 1.0 - alpha;
68
//! reset state to pole
74
tap_type prev_output () { return d_prev_output; }
78
tap_type d_one_minus_alpha;
79
tap_type d_prev_output;
84
// general case. We may want to specialize this
86
template<class o_type, class i_type, class tap_type>
88
gr_single_pole_rec<o_type, i_type, tap_type>::filter (const i_type input)
92
output = d_alpha * input + d_one_minus_alpha * d_prev_output;
93
d_prev_output = output;
95
return (o_type) output;
99
template<class o_type, class i_type, class tap_type>
101
gr_single_pole_rec<o_type, i_type, tap_type>::filterN (o_type output[],
102
const i_type input[],
105
for (unsigned i = 0; i < n; i++)
106
output[i] = filter (input[i]);
110
#endif /* _GR_SINGLE_POLE_REC_H_ */