27 ASSERT(*min <= *max,
"Lower integration boundary must not be larger than upper boundary. ");
32 T integral = (*(umin + 1) - *umin) * integrand(*umin);
33 while (++umin != max) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
34 integral += (*umin - *(umin - 1)) * integrand(*umin);
35 return 0.5f * integral;
51 ASSERT(min <= *max,
"Lower integration boundary must not be larger than upper boundary. ");
56 T integral = (*umin - min) * integrand(min);
57 integral += (*(umin + 1) - min) * integrand(*umin);
58 while (++umin != max) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
59 integral += (*umin - *(umin - 1)) * integrand(*umin);
60 return 0.5f * integral;
62 else return 0.5f * (*umin - min) * (integrand(min) + integrand(*umin));
76 ASSERT(*min <= max,
"Lower integration boundary must not be larger than upper boundary. ");
82 T integral = (*(umin + 1) - *umin) * integrand(*umin);
83 while (++umin != umax) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
84 integral += (max - *(umin - 1)) * integrand(*umin);
85 integral += (max - *umin) * integrand(max);
86 return 0.5f * integral;
88 else return 0.5f * (max - *umin) * (integrand(max) + integrand(*umin));
103 ASSERT(min <= max,
"Lower integration boundary must not be larger than upper boundary. ");
109 T integral = (*umin - min) * integrand(min);
112 integral += (*(umin + 1) - min) * integrand(*umin);
113 while (++umin != umax) integral += (*(umin + 1) - *(umin - 1)) * integrand(*umin);
114 integral += (max - *(umin - 1)) * integrand(*umin);
116 else integral += (max - min) * integrand(*umin);
117 integral += (max - *umin) * integrand(max);
118 return 0.5f * integral;
120 else return 0.5f * (max - min) * (integrand(max) + integrand(min));
124 namespace ImplicitIntegrator
138 void integrateWithObscureLeftBoundary(
const float min,
const FrequencyIterator max,
const std::function<
void(
float, T &)> &integrand, T &integrandBuffer, T &resultBuffer)
140 ASSERT(&integrandBuffer != &resultBuffer);
141 ASSERT(min <= *max,
"Lower integration boundary must not be larger than upper boundary. ");
143 resultBuffer.reset();
147 integrand(min, integrandBuffer);
148 resultBuffer.multAdd(*umin - min, integrandBuffer);
150 integrand(*umin, integrandBuffer);
151 resultBuffer.multAdd(*(umin + 1) - min, integrandBuffer);
153 while (++umin != max)
155 integrand(*umin, integrandBuffer);
156 resultBuffer.multAdd(*(umin + 1) - *(umin - 1), integrandBuffer);
159 integrand(*umin, integrandBuffer);
160 resultBuffer.multAdd(*umin - *(umin - 1), integrandBuffer);
162 resultBuffer *= 0.5f;
166 integrand(min, integrandBuffer);
167 resultBuffer += integrandBuffer;
169 integrand(*umin, integrandBuffer);
170 resultBuffer += integrandBuffer;
172 resultBuffer *= 0.5f * (*umin - min);
188 void integrateWithObscureRightBoundary(
const FrequencyIterator min,
const float max,
const std::function<
void(
float, T &)> &integrand, T &integrandBuffer, T &resultBuffer)
190 ASSERT(&integrandBuffer != &resultBuffer);
191 ASSERT(*min <= max,
"Lower integration boundary must not be larger than upper boundary. ");
193 resultBuffer.reset();
198 integrand(*umin, integrandBuffer);
199 resultBuffer.multAdd(*(umin + 1) - *umin, integrandBuffer);
201 while (++umin != umax)
203 integrand(*umin, integrandBuffer);
204 resultBuffer.multAdd(*(umin + 1) - *(umin - 1), integrandBuffer);
207 integrand(*umin, integrandBuffer);
208 resultBuffer.multAdd(max - *(umin - 1), integrandBuffer);
210 integrand(max, integrandBuffer);
211 resultBuffer.multAdd(max - *umin, integrandBuffer);
213 resultBuffer *= 0.5f;
217 integrand(max, integrandBuffer);
218 resultBuffer += integrandBuffer;
220 integrand(*umin, integrandBuffer);
221 resultBuffer += integrandBuffer;
223 resultBuffer *= 0.5f * (max - *umin);
239 void integrateWithObscureBoundaries(
const float min,
const float max,
const std::function<
void(
float, T &)> &integrand, T &integrandBuffer, T &resultBuffer)
241 ASSERT(&integrandBuffer != &resultBuffer);
242 ASSERT(min <= max,
"Lower integration boundary must not be larger than upper boundary. ");
244 resultBuffer.reset();
249 integrand(min, integrandBuffer);
250 resultBuffer.multAdd(*umin - min, integrandBuffer);
254 integrand(*umin, integrandBuffer);
255 resultBuffer.multAdd(*(umin + 1) - min, integrandBuffer);
257 while (++umin != umax)
259 integrand(*umin, integrandBuffer);
260 resultBuffer.multAdd(*(umin + 1) - *(umin - 1), integrandBuffer);
263 integrand(*umin, integrandBuffer);
264 resultBuffer.multAdd(max - *(umin - 1), integrandBuffer);
268 integrand(*umin, integrandBuffer);
269 resultBuffer.multAdd(max - min, integrandBuffer);
272 integrand(max, integrandBuffer);
273 resultBuffer.multAdd(max - *umin, integrandBuffer);
275 resultBuffer *= 0.5f;
279 integrand(max, integrandBuffer);
280 resultBuffer += integrandBuffer;
282 integrand(min, integrandBuffer);
283 resultBuffer += integrandBuffer;
285 resultBuffer *= 0.5f * (max - min);