32 #ifndef SPL_Sequence_hpp
33 #define SPL_Sequence_hpp
39 #include <SPL/config.hpp>
91 template <
class Iterator1,
class Iterator2,
class T>
92 T special_inner_product(Iterator1 seqStart, Iterator2 filtStart,
93 Iterator2 filtEnd, T init)
96 while (filtStart != filtEnd) {
99 result += (*seqStart) * (*filtEnd);
110 template <
class T,
class SeqIterator,
class FiltIterator,
class ResultIterator>
111 void convolveHelper(SeqIterator seqStart, SeqIterator seqEnd,
112 FiltIterator filtStart, FiltIterator filtEnd, ResultIterator resultStart,
115 if ((seqEnd - seqStart) >= (filtEnd - filtStart)) {
120 SeqIterator seqStartIter1 = seqStart;
121 FiltIterator filtStartIter1 = filtStart;
122 FiltIterator filtEndIter1 = filtStartIter1 + 1;
123 ResultIterator resultIter = resultStart;
126 int n = (filtEnd - filtStart) - 1;
128 *resultIter = special_inner_product(seqStartIter1, filtStartIter1,
135 n = (seqEnd - seqStart) - (filtEnd - filtStart) + 1;
136 assert(filtStartIter1 == filtStart);
137 assert(filtEndIter1 == filtEnd);
139 *resultIter = special_inner_product(seqStartIter1, filtStartIter1,
146 n = (filtEnd - filtStart) - 1;
148 assert(filtStartIter1 == filtStart + 1);
149 assert(filtEndIter1 == filtEnd);
151 *resultIter = special_inner_product(seqStartIter1, filtStartIter1,
160 convolveHelper(filtStart, filtEnd, seqStart, seqEnd, resultStart, dummy);
172 FiltIterator filtStartIter1 = filtStart;
173 SeqIterator seqStartIter1 = seqStart;
174 SeqIterator seqEndIter1 = seqStartIter1 + 1;
175 ResultIterator resultIter = resultStart;
178 int n = (seqEnd - seqStart) - 1;
180 *resultIter = special_inner_product(filtStartIter1, seqStartIter1,
187 n = (filtEnd - filtStart) - (seqEnd - seqStart) + 1;
188 assert(seqStartIter1 == seqStart);
189 assert(seqEndIter1 == seqEnd);
191 *resultIter = special_inner_product(filtStartIter1, seqStartIter1,
198 n = (seqEnd - seqStart) - 1;
200 assert(seqStartIter1 == seqStart + 1);
201 assert(seqEndIter1 == seqEnd);
203 *resultIter = special_inner_product(filtStartIter1, seqStartIter1,
220 template <
class T,
class SeqIterator,
class FiltIterator,
class ResultIterator>
221 void convolveHelper2(SeqIterator seqStart, SeqIterator seqEnd,
222 FiltIterator filtStart, FiltIterator filtEnd, ResultIterator resultStart,
223 int skip,
int count, T dummy)
228 if ((seqEnd - seqStart) >= (filtEnd - filtStart)) {
229 assert(count >= 0 && count <= (seqEnd - seqStart));
231 SeqIterator seqStartIter1 = seqStart;
232 FiltIterator filtStartIter1 = filtStart;
233 FiltIterator filtEndIter1 = filtStartIter1 + 1;
234 ResultIterator resultIter = resultStart;
237 int n = (filtEnd - filtStart) - 1;
238 int adjust = std::min(n, skip);
242 filtEndIter1 += adjust;
247 *resultIter = special_inner_product(seqStartIter1, filtStartIter1,
254 n = (seqEnd - seqStart) - (filtEnd - filtStart) + 1;
255 filtStartIter1 = filtStart;
256 filtEndIter1 = filtEnd;
257 adjust = std::min(n, skip);
261 seqStartIter1 += adjust;
266 *resultIter = special_inner_product(seqStartIter1, filtStartIter1,
273 n = (filtEnd - filtStart) - 1;
274 filtStartIter1 = filtStart + 1;
275 filtEndIter1 = filtEnd;
276 adjust = std::min(n, skip);
280 filtStartIter1 += adjust;
285 *resultIter = special_inner_product(seqStartIter1, filtStartIter1,
293 convolveHelper2(filtStart, filtEnd, seqStart, seqEnd, resultStart,
296 assert(count >= 0 && count <= (filtEnd - filtStart));
298 FiltIterator filtStartIter1 = filtStart;
299 SeqIterator seqStartIter1 = seqStart;
300 SeqIterator seqEndIter1 = seqStartIter1 + 1;
301 ResultIterator resultIter = resultStart;
304 int n = (seqEnd - seqStart) - 1;
305 int adjust = std::min(n, skip);
309 seqEndIter1 += adjust;
314 *resultIter = special_inner_product(filtStartIter1, seqStartIter1,
321 n = (filtEnd - filtStart) - (seqEnd - seqStart) + 1;
322 seqStartIter1 = seqStart;
323 seqEndIter1 = seqEnd;
324 adjust = std::min(n, skip);
328 filtStartIter1 += adjust;
333 *resultIter = special_inner_product(filtStartIter1, seqStartIter1,
340 n = (seqEnd - seqStart) - 1;
341 seqStartIter1 = seqStart + 1;
342 seqEndIter1 = seqEnd;
343 adjust = std::min(n, skip);
347 seqStartIter1 += adjust;
352 *resultIter = special_inner_product(filtStartIter1, seqStartIter1,
Definition: Arcball.hpp:48
Constants identifying various convolution modes.
Definition: Sequence.hpp:54
static const int full
The full convolution result (i.e., the same as "full" in MATLAB)
Definition: Sequence.hpp:57
static const int sameDomainPerExt
Periodic extension.
Definition: Sequence.hpp:66
static const int sameDomainConstExt
Constant extension.
Definition: Sequence.hpp:63
static const int sameDomainSymExt0
Symmetric periodic extension.
Definition: Sequence.hpp:69
static const int sameDomainZeroExt
The same as "same" in MATLAB.
Definition: Sequence.hpp:60