STIR 6.4.0
BSplines_coef.inl
Go to the documentation of this file.
1/*
2 Copyright (C) 2005-2011, Hammersmith Imanet Ltd
3 This file is part of STIR.
4
5 SPDX-License-Identifier: Apache-2.0
6
7 See STIR/LICENSE.txt for details
8*/
17
18#include "stir/modulo.h"
19#include "stir/assign.h"
21START_NAMESPACE_STIR
22
23namespace BSpline
24{
25
26namespace detail
27{
28template <class IterT, class constantsT>
29inline typename std::iterator_traits<IterT>::value_type
30cplus0(const IterT input_begin_iterator,
31 const IterT input_end_iterator,
32 const constantsT z1,
33 const constantsT precision,
34 const bool periodicity)
35{
36 typedef typename std::iterator_traits<IterT>::value_type out_elemT;
37
38 const int input_size = static_cast<int>(input_end_iterator - input_begin_iterator);
39 // assert(input_size>BSplines_coef_vector.size());
40 out_elemT sum = *input_begin_iterator;
41 for (int i = 1; i < (int)ceil(log(precision) / log(fabs(z1))) && i <= 2 * input_size - 3; ++i)
42 {
43 int index = i;
44 if (periodicity == 0 && i >= input_size)
45 index = 2 * input_size - 2 - i;
46 sum += static_cast<out_elemT>(*(input_begin_iterator + index) * pow(z1, i));
47 }
48 // if (periodicity==1)
49
50 return static_cast<out_elemT>(sum / (1 - pow(z1, 2 * input_size - 2)));
51}
52} // end of namespace detail
53
54template <class RandIterOut, class IterT, class constantsT>
55void
56BSplines_coef(RandIterOut c_begin_iterator,
57 RandIterOut c_end_iterator,
58 IterT input_begin_iterator,
59 IterT input_end_iterator,
60 const constantsT z1,
61 const constantsT z2,
62 const constantsT lamda)
63{
64
65 typedef typename std::iterator_traits<RandIterOut>::value_type out_elemT;
66
67 /*
68 cplus(c_end_iterator-c_begin_iterator, 0)
69 cminus(c_end_iterator-c_begin_iterator, 0),
70 */
71 // const int input_size = c_end_iterator-c_begin_iterator ; //-1; //!!!
72
73 if (z1 == 0 && z2 == 0) // Linear and Nearest Neighbour coefficients are the same to the input data
74 {
75 IterT current_input_iterator = input_begin_iterator;
76 for (RandIterOut current_iterator = c_begin_iterator;
77 current_iterator != c_end_iterator && current_input_iterator != input_end_iterator;
78 ++current_iterator, ++current_input_iterator)
79 *current_iterator = (out_elemT)(*current_input_iterator);
80
81 // copy(input_begin_iterator, input_end_iterator, c_begin_iterator);
82 }
83 else
84 {
85 typedef std::vector<out_elemT> c_vector_type;
86 c_vector_type cplus(c_end_iterator - c_begin_iterator), cminus(c_end_iterator - c_begin_iterator);
87 std::vector<constantsT> input_factor_for_cminus(1, -z1), pole_for_cplus(1, -z1), pole_for_cminus(1, -z1);
88 assign(cplus, 0);
89 assign(cminus, 0);
90 std::vector<constantsT> input_factor_for_cplus(1, (constantsT)1);
91
92 *(cplus.begin()) = detail::cplus0(
93 input_begin_iterator, input_end_iterator, z1, static_cast<constantsT>(.00001), 0); // k or Nmax_precision
94
95 IIR_filter(cplus.begin(),
96 cplus.end(),
97 input_begin_iterator,
98 input_end_iterator,
99 input_factor_for_cplus.begin(),
100 input_factor_for_cplus.end(),
101 pole_for_cplus.begin(),
102 pole_for_cplus.end(),
103 1);
104
105 *(cminus.end() - 1) = static_cast<out_elemT>((*(cplus.end() - 1) + (*(cplus.end() - 2)) * z1) * z1 / (z1 * z1 - 1));
106 IIR_filter(cminus.rbegin(),
107 cminus.rend(),
108 cplus.rbegin(),
109 cplus.rend(),
110 input_factor_for_cminus.begin(),
111 input_factor_for_cminus.end(),
112 pole_for_cminus.begin(),
113 pole_for_cminus.end(),
114 1);
115
116 RandIterOut current_iterator = c_begin_iterator;
117 typename c_vector_type::const_iterator current_cminus_iterator = cminus.begin();
118 for (; current_iterator != c_end_iterator && current_cminus_iterator != cminus.end();
119 ++current_iterator, ++current_cminus_iterator)
120 {
121 *current_iterator = static_cast<out_elemT>(*current_cminus_iterator * lamda);
122 }
123 }
124}
125
126} // namespace BSpline
127
128END_NAMESPACE_STIR
Implementation of the IIR and FIR filters.
defines the stir::assign function to assign values to different data types
elemT sum(IterT start, IterT end, elemT init)
Compute the sum of a sequence using operator+=(), using an initial value.
Definition more_algorithms.inl:52
defines stir::modulo() and related functions
void BSplines_coef(RandIterOut c_begin_iterator, RandIterOut c_end_iterator, IterT input_begin_iterator, IterT input_end_iterator, const constantsT z1, const constantsT z2, const constantsT lambda)
compute BSpline coefficients that gives the BSpline that interpolates the given data
Definition BSplines_coef.inl:56