STIR 6.4.0
IR_filters.inl
Go to the documentation of this file.
1/*
2 Copyright (C) 2000-2009, Hammersmith Imanet Ltd
3 Copyright (C) 2013, University College London
4 This file is part of STIR.
5
6 SPDX-License-Identifier: Apache-2.0
7
8 See STIR/LICENSE.txt for details
9*/
18
19START_NAMESPACE_STIR
20
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)
31{
32 // The input should be initialised to 0
33 // if(output_begin_iterator==output_end_iterator)
34 // warning("No output signal is given./n");
35#if 1
36 if (if_initial_exists == false)
37 *output_begin_iterator = (*input_begin_iterator) * (*input_factor_begin_iterator);
38#else
39 // an attempt to remove warnings by VC++, but it doesn't work for higher-dimensional arrays
40 typedef typename CastScalarForOperation<typename std::iterator_traits<RandIter1>::value_type>::type cast_type;
41
42 if (if_initial_exists == false)
43 *output_begin_iterator = (*input_begin_iterator) * static_cast<cast_type>(*input_factor_begin_iterator);
44#endif
45
46 RandIter1 current_output_iterator = output_begin_iterator;
47 RandIter2 current_input_iterator = input_begin_iterator;
48
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)
52 {
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)
57 {
58#if 1
59 (*current_output_iterator) += (*current_current_input_iterator) * (*current_input_factor_iterator);
60#else
61 (*current_output_iterator)
62 += (*current_current_input_iterator) * static_cast<cast_type>(*current_input_factor_iterator);
63#endif
64 if (current_current_input_iterator == input_begin_iterator)
65 break;
66 }
67
68 RandIter4 current_pole_iterator = pole_begin_iterator;
69 RandIter1 current_feedback_iterator = current_output_iterator;
70
71 for (--current_feedback_iterator; current_pole_iterator != pole_end_iterator;
72 ++current_pole_iterator, --current_feedback_iterator)
73 {
74 (*current_output_iterator) -=
75#if 1
76 (*current_feedback_iterator) * (*current_pole_iterator);
77#else
78 (*current_feedback_iterator) * static_cast<cast_type>(*current_pole_iterator);
79#endif
80 if (current_feedback_iterator == output_begin_iterator)
81 break;
82 }
83 }
84}
85
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)
94{
95 IIR_filter(output_begin_iterator,
96 output_end_iterator,
97 input_begin_iterator,
98 input_end_iterator,
99 input_factor_begin_iterator,
100 input_factor_end_iterator,
101 output_begin_iterator,
102 output_begin_iterator,
103 if_initial_exists);
104}
105
106END_NAMESPACE_STIR