sablib
Loading...
Searching...
No Matches
baseline.cpp
Go to the documentation of this file.
1
6
7#include "baseline.h"
8
10#include "../baseline/arpls.h"
11#include "../baseline/asls.h"
12#include "../baseline/backcor.h"
13#include "../baseline/beads.h"
16#include "../baseline/modpoly.h"
18#include "../baseline/psalsa.h"
19#include "../baseline/sma.h"
20#include "../baseline/snip.h"
21#include "../baseline/spline.h"
22
23//
24// Implementation of Sablib_BaselineLinear() function.
25//
26const SABLIB_BASELINE_DATA_PTR Sablib_BaselineLinear(
27 const SABLIB_DATA_PTR y, const unsigned int index1, const unsigned int index2
28)
29{
30 std::vector<double> yy;
31 yy.assign(y->data, y->data + y->size);
32
33 auto result = sablib::BaselineLinear(yy, index1, index2);
34
35 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
36 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
37 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
38
39 return p;
40}
41
42//
43// Implementation of Sablib_BaselinePolynomial() function.
44//
45const SABLIB_BASELINE_DATA_PTR Sablib_BaselinePolynomial(
46 const SABLIB_DATA_PTR y, const unsigned int polyorder, const unsigned int * indices_ptr, const size_t ptr_size
47)
48{
49 std::vector<double> yy;
50 std::vector<unsigned int> indices;
51 yy.assign(y->data, y->data + y->size);
52 indices.assign(indices_ptr, indices_ptr + ptr_size);
53
54 auto result = sablib::BaselinePolynomial(yy, polyorder, indices);
55
56 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
57 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
58 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
59
60 return p;
61}
62
63//
64// Implementation of Sablib_BaselineSpline() function.
65//
66const SABLIB_BASELINE_DATA_PTR Sablib_BaselineSpline(
67 const SABLIB_DATA_PTR y, const unsigned int * indices_ptr, const size_t ptr_size
68)
69{
70 std::vector<double> yy;
71 std::vector<unsigned int> indices;
72 yy.assign(y->data, y->data + y->size);
73 indices.assign(indices_ptr, indices_ptr + ptr_size);
74
75 auto result = sablib::BaselineSpline(yy, indices);
76
77 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
78 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
79 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
80
81 return p;
82}
83
84//
85// Implementation of Sablib_BaselineSMA() function.
86//
87const SABLIB_BASELINE_DATA_PTR Sablib_BaselineSMA(
88 const SABLIB_DATA_PTR y, const unsigned int n, const unsigned int loop
89)
90{
91 std::vector<double> yy;
92 yy.assign(y->data, y->data + y->size);
93
94 auto result = sablib::BaselineSMA(yy, n, loop);
95
96 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
97 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
98 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
99
100 return p;
101}
102
103//
104// Implementation of Sablib_BaselineSnip() function.
105//
106const SABLIB_BASELINE_DATA_PTR Sablib_BaselineSnip(
107 const SABLIB_DATA_PTR y, const unsigned int m, const bool decreasing,
108 const enum Sablib_SnipPreprocess preprocess, const unsigned int loop
109)
110{
112
113 std::vector<double> yy;
114 yy.assign(y->data, y->data + y->size);
115
116 switch(preprocess) {
117 case LL:
119 break;
120 case LLS:
122 break;
123 default:
125 break;
126 };
127
128 auto result = sablib::BaselineSnip(yy, m, decreasing, pp, loop);
129
130 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
131 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
132 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
133
134 return p;
135}
136
137//
138// Implementation of Sablib_BaselineModPoly() function.
139//
140const SABLIB_BASELINE_DATA_PTR Sablib_BaselineModPoly(
141 const SABLIB_DATA_PTR y, const unsigned int polyorder, const unsigned int loop, const double eps
142)
143{
144 std::vector<double> yy;
145 yy.assign(y->data, y->data + y->size);
146
147 auto result = sablib::BaselineModPoly(yy, polyorder, loop, eps);
148
149 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
150 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
151 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
152
153 return p;
154}
155
156//
157// Implementation of Sablib_BaselineIModPoly() function.
158//
159const SABLIB_BASELINE_DATA_PTR Sablib_BaselineIModPoly(
160 const SABLIB_DATA_PTR y, const unsigned int polyorder, const double k,
161 const unsigned int loop, const double eps
162)
163{
164 std::vector<double> yy;
165 yy.assign(y->data, y->data + y->size);
166
167 auto result = sablib::BaselineIModPoly(yy, polyorder, k, loop, eps);
168
169 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
170 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
171 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
172
173 return p;
174}
175
176//
177// Implementation of Sablib_BaselineBackcor() function.
178//
179const SABLIB_BASELINE_DATA_PTR Sablib_BaselineBackcor(
180 const SABLIB_DATA_PTR y, const unsigned int polyorder, const enum Sablib_BackcorFunc func,
181 const double s, const double alpha, const unsigned int loop, const double eps
182)
183{
185
186 std::vector<double> yy;
187 yy.assign(y->data, y->data + y->size);
188
189 switch(func) {
190 case Huber:
192 break;
193 case AHuber:
195 break;
196 case TQuad:
198 break;
199 case Indec:
201 break;
202 case AIndec:
204 break;
205 default:
207 break;
208 }
209
210 auto result = sablib::BaselineBackcor(yy, polyorder, f, s, alpha, loop, eps);
211
212 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
213 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
214 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
215
216 return p;
217}
218
219//
220// Implementation of Sablib_BaselineGoldindec() function.
221//
222const SABLIB_BASELINE_DATA_PTR Sablib_BaselineGoldindec(
223 const SABLIB_DATA_PTR y, const unsigned int polyorder, const double peak_ratio,
224 const double alpha, const unsigned int loop, const double eps,
225 const unsigned int loop_legend, const double eps_legend, const double eps_s
226)
227{
228 std::vector<double> yy;
229 yy.assign(y->data, y->data + y->size);
230
231 auto result = sablib::BaselineGoldindec(
232 yy, polyorder, peak_ratio, alpha, loop, eps, loop_legend, eps_legend, eps_s
233 );
234
235 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
236 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
237 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
238
239 return p;
240}
241
242//
243// Implementation of Sablib_BaselineAsLS() function.
244//
245const SABLIB_BASELINE_DATA_PTR Sablib_BaselineAsLS(
246 const SABLIB_DATA_PTR y, const double lambda, const double p, const unsigned int s,
247 const unsigned int loop, const double eps
248)
249{
250 std::vector<double> yy;
251 yy.assign(y->data, y->data + y->size);
252
253 auto result = sablib::BaselineAsLS(yy, lambda, p, s, loop, eps);
254
255 SABLIB_BASELINE_DATA_PTR ptr = AllocSablibBaselineData(result.baseline.size());
256 std::copy(result.baseline.begin(), result.baseline.end(), ptr->baseline.data);
257 std::copy(result.corrected.begin(), result.corrected.end(), ptr->corrected.data);
258
259 return ptr;
260}
261
262//
263// Implementation of Sablib_BaselineAirPLS() function.
264//
265const SABLIB_BASELINE_DATA_PTR Sablib_BaselineAirPLS(
266 const SABLIB_DATA_PTR y, const double lambda, const unsigned int s,
267 const unsigned int loop, const double eps
268)
269{
270 std::vector<double> yy;
271 yy.assign(y->data, y->data + y->size);
272
273 auto result = sablib::BaselineAirPLS(yy, lambda, s, loop, eps);
274
275 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
276 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
277 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
278
279 return p;
280}
281
282//
283// Implementation of Sablib_BaselineArPLS() function.
284//
285const SABLIB_BASELINE_DATA_PTR Sablib_BaselineArPLS(
286 const SABLIB_DATA_PTR y, const double lambda, const unsigned int s,
287 const unsigned int loop, const double eps
288)
289{
290 std::vector<double> yy;
291 yy.assign(y->data, y->data + y->size);
292
293 auto result = sablib::BaselineArPLS(yy, lambda, s, loop, eps);
294
295 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
296 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
297 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
298
299 return p;
300}
301
302//
303// Implementation of Sablib_BaselinePsalsa() function.
304//
305const SABLIB_BASELINE_DATA_PTR Sablib_BaselinePsalsa(
306 const SABLIB_DATA_PTR y, const double lambda, const double p, const double k,
307 const unsigned int s, const unsigned int loop, const double eps
308)
309{
310 std::vector<double> yy;
311 yy.assign(y->data, y->data + y->size);
312
313 auto result = sablib::BaselinePsalsa(yy, lambda, p, k, s, loop, eps);
314
315 SABLIB_BASELINE_DATA_PTR ptr = AllocSablibBaselineData(result.baseline.size());
316 std::copy(result.baseline.begin(), result.baseline.end(), ptr->baseline.data);
317 std::copy(result.corrected.begin(), result.corrected.end(), ptr->corrected.data);
318
319 return ptr;
320}
321
322//
323// Implementation of Sablib_BaselineBeads() function.
324//
325const SABLIB_BASELINE_DATA_PTR Sablib_BaselineBeads(
326 const SABLIB_DATA_PTR y, const unsigned int s, const double frequency, const double r,
327 const double lambda0, const double lambda1, const double lambda2, const unsigned int loop,
328 const double eps, const enum Sablib_BeadsPenalty penalty
329)
330{
332
333 std::vector<double> yy;
334 yy.assign(y->data, y->data + y->size);
335
336 switch(penalty) {
337 case L1_v1:
339 break;
340 default:
342 break;
343 }
344
345 auto result = sablib::BaselineBeads(yy, s, frequency, r, lambda0, lambda1, lambda2, loop, eps, pen);
346
347 SABLIB_BASELINE_DATA_PTR p = AllocSablibBaselineData(result.baseline.size());
348 std::copy(result.baseline.begin(), result.baseline.end(), p->baseline.data);
349 std::copy(result.corrected.begin(), result.corrected.end(), p->corrected.data);
350
351 return p;
352}
353
354//
355// Implementation of Sablib_BeadsExpandBoundaries() function.
356//
357const SABLIB_DATA_PTR Sablib_BeadsExpandBoundaries(const SABLIB_DATA_PTR y, const unsigned int n)
358{
359 std::vector<double> yy;
360 yy.assign(y->data, y->data + y->size);
361
362 auto result = sablib::BeadsExpandBoundaries(yy, n);
363
364 SABLIB_DATA_PTR p = AllocSablibData(result.size());
365 std::copy(result.begin(), result.end(), p->data);
366
367 return p;
368}
369
370//
371// Implementation of Sablib_BeadsTrimBoundaries() function.
372//
373const SABLIB_DATA_PTR Sablib_BeadsTrimBoundaries(const SABLIB_DATA_PTR y, const unsigned int n)
374{
375 std::vector<double> yy;
376 yy.assign(y->data, y->data + y->size);
377
378 auto result = sablib::BeadsTrimBoundaries(yy, n);
379
380 SABLIB_DATA_PTR p = AllocSablibData(result.size());
381 std::copy(result.begin(), result.end(), p->data);
382
383 return p;
384}
const BaselineResult BaselineAirPLS(const std::vector< double > &y, const double lambda, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using adaptive iteratively reweighted Penalized Least Squares(airPLS).
Definition airpls.cpp:18
Baseline estimation using adaptive iteratively reweighted Penalized Least Squares(airPLS).
const BaselineResult BaselineArPLS(const std::vector< double > &y, const double lambda, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using asymmetrically reweighted Penalized Least Squares(arPLS).
Definition arpls.cpp:18
Baseline estimation using asymmetrically reweighted Penalized Least Squares(arPLS).
const BaselineResult BaselineAsLS(const std::vector< double > &y, const double lambda, const double p, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using Asymmetric Least Squares Smoothing (AsLS).
Definition asls.cpp:16
Baseline estimation using Asymmetric Least Squares Smoothing(AsLS).
const BaselineResult BaselineBackcor(const std::vector< double > &y, const unsigned int polyorder, const BackcorFunc func, const double s, const double alpha, const unsigned int loop, const double eps)
Performs baseline estimation using iterative polynomial fitting with a non-quadratic cost function (B...
Definition backcor.cpp:20
Baseline estimation using iterative polynomial fitting with a non-quadratic cost function(Backcor alg...
BackcorFunc
Cost function types for the Backcor algorithm.
Definition backcor.h:28
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineSnip(const SABLIB_DATA_PTR y, const unsigned int m, const bool decreasing, const enum Sablib_SnipPreprocess preprocess, const unsigned int loop)
Performs baseline estimation using the Statistics-sensitive Non-linear Iterative Peak-clipping (SNIP)...
Definition baseline.cpp:106
const SABLIB_BASELINE_DATA_PTR Sablib_BaselinePsalsa(const SABLIB_DATA_PTR y, const double lambda, const double p, const double k, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using Peaked Signal’s Asymmetric Least Squares Algorithm (psalsa).
Definition baseline.cpp:305
const SABLIB_DATA_PTR Sablib_BeadsTrimBoundaries(const SABLIB_DATA_PTR y, const unsigned int n)
Trims the expanded signal boundaries.
Definition baseline.cpp:373
const SABLIB_BASELINE_DATA_PTR Sablib_BaselinePolynomial(const SABLIB_DATA_PTR y, const unsigned int polyorder, const unsigned int *indices_ptr, const size_t ptr_size)
Performs baseline estimation by fitting a polynomial to specified points.
Definition baseline.cpp:45
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineAsLS(const SABLIB_DATA_PTR y, const double lambda, const double p, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using Asymmetric Least Squares Smoothing (AsLS).
Definition baseline.cpp:245
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineSMA(const SABLIB_DATA_PTR y, const unsigned int n, const unsigned int loop)
Performs background estimation using a simple moving average.
Definition baseline.cpp:87
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineSpline(const SABLIB_DATA_PTR y, const unsigned int *indices_ptr, const size_t ptr_size)
Performs baseline estimation using cubic spline interpolation.
Definition baseline.cpp:66
const SABLIB_DATA_PTR Sablib_BeadsExpandBoundaries(const SABLIB_DATA_PTR y, const unsigned int n)
Expands the signal boundaries by padding with a tapered sequence.
Definition baseline.cpp:357
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineAirPLS(const SABLIB_DATA_PTR y, const double lambda, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using adaptive iteratively reweighted Penalized Least Squares(airPLS).
Definition baseline.cpp:265
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineIModPoly(const SABLIB_DATA_PTR y, const unsigned int polyorder, const double k, const unsigned int loop, const double eps)
Estimates the baseline using the Improved Modified Polynomial (IModPoly) method.
Definition baseline.cpp:159
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineLinear(const SABLIB_DATA_PTR y, const unsigned int index1, const unsigned int index2)
Performs baseline estimation with a linear line between two points.
Definition baseline.cpp:26
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineArPLS(const SABLIB_DATA_PTR y, const double lambda, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using asymmetrically reweighted Penalized Least Squares(arPLS).
Definition baseline.cpp:285
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineBackcor(const SABLIB_DATA_PTR y, const unsigned int polyorder, const enum Sablib_BackcorFunc func, const double s, const double alpha, const unsigned int loop, const double eps)
Performs baseline estimation using iterative polynomial fitting with a non-quadratic cost function (B...
Definition baseline.cpp:179
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineBeads(const SABLIB_DATA_PTR y, const unsigned int s, const double frequency, const double r, const double lambda0, const double lambda1, const double lambda2, const unsigned int loop, const double eps, const enum Sablib_BeadsPenalty penalty)
Performs baseline estimation and denoising using Sparsity (BEADS).
Definition baseline.cpp:325
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineModPoly(const SABLIB_DATA_PTR y, const unsigned int polyorder, const unsigned int loop, const double eps)
Estimates the baseline using the Modified Polynomial (ModPoly) method.
Definition baseline.cpp:140
const SABLIB_BASELINE_DATA_PTR Sablib_BaselineGoldindec(const SABLIB_DATA_PTR y, const unsigned int polyorder, const double peak_ratio, const double alpha, const unsigned int loop, const double eps, const unsigned int loop_legend, const double eps_legend, const double eps_s)
Performs baseline estimation using the Goldindec algorithm.
Definition baseline.cpp:222
The C interface of sablib baseline estimation functions.
Sablib_BackcorFunc
Cost function types for the Backcor algorithm.
Definition baseline.h:24
@ AHuber
Definition baseline.h:26
@ Huber
Definition baseline.h:25
@ Indec
Definition baseline.h:29
@ TQuad
Definition baseline.h:27
@ AIndec
Definition baseline.h:30
Sablib_BeadsPenalty
Penalty types for the BEADS algorithm.
Definition baseline.h:47
@ L1_v1
Definition baseline.h:48
Sablib_SnipPreprocess
Preprocessing types for the SNIP algorithm.
Definition baseline.h:37
@ LLS
Definition baseline.h:40
@ LL
Definition baseline.h:39
const std::vector< double > BeadsTrimBoundaries(const std::vector< double > &y, const unsigned int n)
Trims the expanded signal boundaries.
Definition beads.cpp:285
const BaselineResult BaselineBeads(const std::vector< double > &y, const unsigned int s, const double frequency, const double r, const double lambda0, const double lambda1, const double lambda2, const unsigned int loop, const double eps, const BeadsPenalty penalty)
Performs baseline estimation and denoising using Sparsity (BEADS).
Definition beads.cpp:102
const std::vector< double > BeadsExpandBoundaries(const std::vector< double > &y, const unsigned int n)
Expands the signal boundaries by padding with a tapered sequence.
Definition beads.cpp:260
Baseline estimation and subtraction using Baseline Estimation And Denoising using Sparsity(BEADS).
BeadsPenalty
Penalty types for the BEADS algorithm.(see Table 1 in Duval's paper).
Definition beads.h:26
const SABLIB_DATA_PTR AllocSablibData(const size_t size)
Allocates a SABLIB_DATA structure.
Definition data.cpp:12
const SABLIB_BASELINE_DATA_PTR AllocSablibBaselineData(const size_t size)
Allocates a SABLIB_BASELINE_DATA structure.
Definition data.cpp:37
const BaselineResult BaselineGoldindec(const std::vector< double > &y, const unsigned int polyorder, double peak_ratio, const double alpha, const unsigned int loop, const double eps, const unsigned int loop_legend, const double eps_legend, const double eps_s)
Performs baseline estimation using the Goldindec algorithm.
Definition goldindec.cpp:21
Baseline estimation using the Goldindec algorithm.
const BaselineResult BaselineIModPoly(const std::vector< double > &y, const unsigned int polyorder, const double k, const unsigned int loop, const double eps)
Estimates the baseline using the Improved Modified Polynomial (IModPoly) method.
Definition imodpoly.cpp:19
Baseline estimation using Improved Modified Polynomial(IModPoly) method.
const BaselineResult BaselineModPoly(const std::vector< double > &y, const unsigned int polyorder, const unsigned int loop, const double eps)
Estimates the baseline using the Modified Polynomial (ModPoly) method.
Definition modpoly.cpp:16
Baseline estimation using Modified Polynomial(ModPoly) method.
const BaselineResult BaselineLinear(const std::vector< double > &y, const unsigned int index1, const unsigned int index2)
Performs baseline estimation with a linear line between two points.
const BaselineResult BaselinePolynomial(const std::vector< double > &y, const unsigned int polyorder, const std::vector< unsigned int > &indices)
Performs baseline estimation by fitting a polynomial to specified points.
Baseline estimation with polynomial line.
const BaselineResult BaselinePsalsa(const std::vector< double > &y, const double lambda, const double p, const double k, const unsigned int s, const unsigned int loop, const double eps)
Performs baseline estimation using Peaked Signal’s Asymmetric Least Squares Algorithm (psalsa).
Definition psalsa.cpp:16
Baseline estimation using Peaked Signal’s Asymmetric Least Squares Algorithm(psalsa).
const BaselineResult BaselineSMA(const std::vector< double > &y, const unsigned int n, const unsigned int loop)
Performs background estimation using a simple moving average.
Definition sma.cpp:16
Baseline estimation using simple moving average.
const BaselineResult BaselineSnip(const std::vector< double > &y, const unsigned int m, const bool decreasing, const SnipPreprocess preprocess, const unsigned int loop)
Performs baseline estimation using the Statistics-sensitive Non-linear Iterative Peak-clipping (SNIP)...
Definition snip.cpp:17
Baseline estimation using Statistics-sensitive Non-linear Iterative Peak-clipping(SNIP).
SnipPreprocess
Preprocessing types for the SNIP algorithm.
Definition snip.h:28
const BaselineResult BaselineSpline(const std::vector< double > &y, const std::vector< unsigned int > &indices)
Performs baseline estimation using cubic spline interpolation.
Definition spline.cpp:16
Baseline estimation from cubic spline.
SABLIB_DATA corrected
Definition data.h:31
SABLIB_DATA baseline
Definition data.h:30
size_t size
Definition data.h:21
double * data
Definition data.h:22