21template <
class RandIter1,
class RandIter2,
class RandIter3,
class RandIter4>
22void inline IIR_filter(RandIter1 output_begin_iterator,
23 RandIter1 output_end_iterator,
24 const RandIter2 input_begin_iterator,
25 const RandIter2 input_end_iterator,
26 const RandIter3 input_factor_begin_iterator,
27 const RandIter3 input_factor_end_iterator,
28 const RandIter4 pole_begin_iterator,
29 const RandIter4 pole_end_iterator,
30 const bool if_initial_exists)
36 if (if_initial_exists ==
false)
37 *output_begin_iterator = (*input_begin_iterator) * (*input_factor_begin_iterator);
40 typedef typename CastScalarForOperation<typename std::iterator_traits<RandIter1>::value_type>::type cast_type;
42 if (if_initial_exists ==
false)
43 *output_begin_iterator = (*input_begin_iterator) *
static_cast<cast_type
>(*input_factor_begin_iterator);
46 RandIter1 current_output_iterator = output_begin_iterator;
47 RandIter2 current_input_iterator = input_begin_iterator;
49 for (++current_output_iterator, ++current_input_iterator;
50 current_output_iterator != output_end_iterator && current_input_iterator != input_end_iterator;
51 ++current_output_iterator, ++current_input_iterator)
53 RandIter2 current_current_input_iterator = current_input_iterator;
54 for (RandIter3 current_input_factor_iterator = input_factor_begin_iterator;
55 current_input_factor_iterator != input_factor_end_iterator;
56 ++current_input_factor_iterator, --current_current_input_iterator)
59 (*current_output_iterator) += (*current_current_input_iterator) * (*current_input_factor_iterator);
61 (*current_output_iterator)
62 += (*current_current_input_iterator) *
static_cast<cast_type
>(*current_input_factor_iterator);
64 if (current_current_input_iterator == input_begin_iterator)
68 RandIter4 current_pole_iterator = pole_begin_iterator;
69 RandIter1 current_feedback_iterator = current_output_iterator;
71 for (--current_feedback_iterator; current_pole_iterator != pole_end_iterator;
72 ++current_pole_iterator, --current_feedback_iterator)
74 (*current_output_iterator) -=
76 (*current_feedback_iterator) * (*current_pole_iterator);
78 (*current_feedback_iterator) *
static_cast<cast_type
>(*current_pole_iterator);
80 if (current_feedback_iterator == output_begin_iterator)
86template <
class RandIter1,
class RandIter2,
class RandIter3>
87void inline FIR_filter(RandIter1 output_begin_iterator,
88 RandIter1 output_end_iterator,
89 const RandIter2 input_begin_iterator,
90 const RandIter2 input_end_iterator,
91 const RandIter3 input_factor_begin_iterator,
92 const RandIter3 input_factor_end_iterator,
93 const bool if_initial_exists)
95 IIR_filter(output_begin_iterator,
99 input_factor_begin_iterator,
100 input_factor_end_iterator,
101 output_begin_iterator,
102 output_begin_iterator,