LibDriver SGP41
Loading...
Searching...
No Matches
driver_sgp41_algorithm.c
Go to the documentation of this file.
1
42
44
48#define DEFAULT_SAMPLING_INTERVAL (1.f)
49#define INITIAL_BLACKOUT (45.f)
50#define INDEX_GAIN (230.f)
51#define SRAW_STD_INITIAL (50.f)
52#define SRAW_STD_BONUS_VOC (220.f)
53#define SRAW_STD_NOX (2000.f)
54#define TAU_MEAN_HOURS (12.f)
55#define TAU_VARIANCE_HOURS (12.f)
56#define TAU_INITIAL_MEAN_VOC (20.f)
57#define TAU_INITIAL_MEAN_NOX (1200.f)
58#define INIT_DURATION_MEAN_VOC ((3600.f * 0.75f))
59#define INIT_DURATION_MEAN_NOX ((3600.f * 4.75f))
60#define INIT_TRANSITION_MEAN (0.01f)
61#define TAU_INITIAL_VARIANCE (2500.f)
62#define INIT_DURATION_VARIANCE_VOC ((3600.f * 1.45f))
63#define INIT_DURATION_VARIANCE_NOX ((3600.f * 5.70f))
64#define INIT_TRANSITION_VARIANCE (0.01f)
65#define GATING_THRESHOLD_VOC (340.f)
66#define GATING_THRESHOLD_NOX (30.f)
67#define GATING_THRESHOLD_INITIAL (510.f)
68#define GATING_THRESHOLD_TRANSITION (0.09f)
69#define GATING_VOC_MAX_DURATION_MINUTES ((60.f * 3.f))
70#define GATING_NOX_MAX_DURATION_MINUTES ((60.f * 12.f))
71#define GATING_MAX_RATIO (0.3f)
72#define SIGMOID_L (500.f)
73#define SIGMOID_K_VOC (-0.0065f)
74#define SIGMOID_X0_VOC (213.f)
75#define SIGMOID_K_NOX (-0.0101f)
76#define SIGMOID_X0_NOX (614.f)
77#define VOC_INDEX_OFFSET_DEFAULT (100.f)
78#define NOX_INDEX_OFFSET_DEFAULT (1.f)
79#define LP_TAU_FAST (20.0f)
80#define LP_TAU_SLOW (500.0f)
81#define LP_ALPHA (-0.2f)
82#define VOC_SRAW_MINIMUM (20000)
83#define NOX_SRAW_MINIMUM (10000)
84#define PERSISTENCE_UPTIME_GAMMA ((3.f * 3600.f))
85#define TUNING_INDEX_OFFSET_MIN (1)
86#define TUNING_INDEX_OFFSET_MAX (250)
87#define TUNING_LEARNING_TIME_OFFSET_HOURS_MIN (1)
88#define TUNING_LEARNING_TIME_OFFSET_HOURS_MAX (1000)
89#define TUNING_LEARNING_TIME_GAIN_HOURS_MIN (1)
90#define TUNING_LEARNING_TIME_GAIN_HOURS_MAX (1000)
91#define TUNING_GATING_MAX_DURATION_MINUTES_MIN (0)
92#define TUNING_GATING_MAX_DURATION_MINUTES_MAX (3000)
93#define TUNING_STD_INITIAL_MIN (10)
94#define TUNING_STD_INITIAL_MAX (5000)
95#define TUNING_GAIN_FACTOR_MIN (1)
96#define TUNING_GAIN_FACTOR_MAX (1000)
97#define MEAN_VARIANCE_ESTIMATOR_GAMMA_SCALING (64.f)
98#define MEAN_VARIANCE_ESTIMATOR_ADDITIONAL_GAMMA_MEAN_SCALING (8.f)
99#define MEAN_VARIANCE_ESTIMATOR_FIX16_MAX (32767.f)
100
106static void a_mean_variance_estimator_set_parameters(sgp41_gas_index_algorithm_t *params)
107{
108 params->m_mean_variance_estimator_initialized = 0; /* init 0 */
109 params->m_mean_variance_estimator_mean = 0.f; /* init mean */
110 params->m_mean_variance_estimator_sraw_offset = 0.f; /* int offset */
111 params->m_mean_variance_estimator_std = params->m_sraw_std_initial; /* int std */
114 (params->m_sampling_interval / 3600.f)) /
115 (params->m_tau_mean_hours + (params->m_sampling_interval / 3600.f))); /* set mean */
117 (params->m_sampling_interval / 3600.f)) /
118 (params->m_tau_variance_hours + (params->m_sampling_interval / 3600.f))); /* set variance */
119 if ((params->m_algorithm_type == SGP41_ALGORITHM_TYPE_NOX)) /* nox */
120 {
123 params->m_sampling_interval) /
125 params->m_sampling_interval)); /* set mean */
126 }
127 else
128 {
131 params->m_sampling_interval) /
133 params->m_sampling_interval)); /* set mean */
134 }
136 params->m_sampling_interval) /
137 (TAU_INITIAL_VARIANCE + params->m_sampling_interval)); /* set variance */
138 params->m_mean_variance_estimator_n_gamma_mean = 0.f; /* init mean */
139 params->m_mean_variance_estimator_n_gamma_variance = 0.f; /* init variance */
140 params->m_mean_variance_estimator_uptime_gamma = 0.f; /* init gamma */
141 params->m_mean_variance_estimator_uptime_gating = 0.f; /* init gating */
142 params->m_mean_variance_estimator_gating_duration_minutes = 0.f; /* init minutes */
143}
144
152static void a_mox_model_set_parameters(sgp41_gas_index_algorithm_t *params, float sraw_std, float sraw_mean)
153{
154 params->m_mox_model_sraw_std = sraw_std; /* set std */
155 params->m_mox_model_sraw_mean = sraw_mean; /* set mean */
156}
157
163static float a_mean_variance_estimator_get_std(const sgp41_gas_index_algorithm_t *params)
164{
165 return params->m_mean_variance_estimator_std; /* return std */
166}
167
173static float a_mean_variance_estimator_get_mean(const sgp41_gas_index_algorithm_t *params)
174{
175 return (params->m_mean_variance_estimator_mean +
176 params->m_mean_variance_estimator_sraw_offset); /* return mean */
177}
178
187static void a_sigmoid_scaled_set_parameters(sgp41_gas_index_algorithm_t *params, float x0, float k, float offset_default)
188{
189 params->m_sigmoid_scaled_k = k; /* set k */
190 params->m_sigmoid_scaled_x0 = x0; /* set x0 */
191 params->m_sigmoid_scaled_offset_default = offset_default; /* set offset default */
192}
193
199static void a_adaptive_lowpass_set_parameters(sgp41_gas_index_algorithm_t *params)
200{
201 params->m_adaptive_lowpass_a1 = (params->m_sampling_interval /
202 (LP_TAU_FAST + params->m_sampling_interval)); /* set a1 */
203 params->m_adaptive_lowpass_a2 = (params->m_sampling_interval /
204 (LP_TAU_SLOW + params->m_sampling_interval)); /* set a2 */
205 params->m_adaptive_lowpass_initialized = 0; /* init 0 */
206}
207
213static void a_init_instances(sgp41_gas_index_algorithm_t *params)
214{
215 a_mean_variance_estimator_set_parameters(params); /* set parameters */
216 a_mox_model_set_parameters(params,
217 a_mean_variance_estimator_get_std(params),
218 a_mean_variance_estimator_get_mean(params)); /* set parameters */
219 if ((params->m_algorithm_type == SGP41_ALGORITHM_TYPE_NOX)) /* nox */
220 {
221 a_sigmoid_scaled_set_parameters(params, SIGMOID_X0_NOX,
223 NOX_INDEX_OFFSET_DEFAULT); /* set parameters */
224 }
225 else /* voc */
226 {
227 a_sigmoid_scaled_set_parameters(params, SIGMOID_X0_VOC,
229 VOC_INDEX_OFFSET_DEFAULT); /* set parameters */
230 }
231 a_adaptive_lowpass_set_parameters(params); /* set parameters */
232}
233
242static void a_mean_variance_estimator_set_states(sgp41_gas_index_algorithm_t *params, float mean,
243 float std, float uptime_gamma)
244{
245 params->m_mean_variance_estimator_mean = mean; /* set mean */
246 params->m_mean_variance_estimator_std = std; /* set std */
247 params->m_mean_variance_estimator_uptime_gamma = uptime_gamma; /* set uptime gamma */
248 params->m_mean_variance_estimator_initialized = 1; /* init 1 */
249}
250
256static uint8_t a_mean_variance_estimator_is_initialized(sgp41_gas_index_algorithm_t *params)
257{
258 return params->m_mean_variance_estimator_initialized; /* return initialized */
259}
260
268static void a_mean_variance_estimator_sigmoid_set_parameters(sgp41_gas_index_algorithm_t *params, float x0, float k)
269{
270 params->m_mean_variance_estimator_sigmoid_k = k; /* set k */
271 params->m_mean_variance_estimator_sigmoid_x0 = x0; /* set x0 */
272}
273
279static float a_mean_variance_estimator_sigmoid_process(sgp41_gas_index_algorithm_t *params, float sample)
280{
281 float x;
282
284 (sample - params->m_mean_variance_estimator_sigmoid_x0)); /* get sigmoid */
285 if ((x < -50.f)) /* check x */
286 {
287 return 1.f; /* return 1.0 */
288 }
289 else if ((x > 50.f)) /* check x */
290 {
291 return 0.f; /* return 0 */
292 }
293 else
294 {
295 return (1.f / (1.f + expf(x))); /* return sigmoid */
296 }
297}
298
304static void a_mean_variance_estimator_calculate_gamma(sgp41_gas_index_algorithm_t *params)
305{
306 float uptime_limit;
307 float sigmoid_gamma_mean;
308 float gamma_mean;
309 float gating_threshold_mean;
310 float sigmoid_gating_mean;
311 float sigmoid_gamma_variance;
312 float gamma_variance;
313 float gating_threshold_variance;
314 float sigmoid_gating_variance;
315
316 uptime_limit = (MEAN_VARIANCE_ESTIMATOR_FIX16_MAX - params->m_sampling_interval); /* set uptime limit */
317 if ((params->m_mean_variance_estimator_uptime_gamma < uptime_limit)) /* set uptime limit */
318 {
320 params->m_sampling_interval); /* set gamma */
321 }
322 if ((params->m_mean_variance_estimator_uptime_gating < uptime_limit)) /* check gating */
323 {
325 params->m_sampling_interval); /* set gating */
326 }
327 a_mean_variance_estimator_sigmoid_set_parameters(params, params->m_init_duration_mean,
328 INIT_TRANSITION_MEAN); /* set parameters */
329 sigmoid_gamma_mean = a_mean_variance_estimator_sigmoid_process(params,
330 params->m_mean_variance_estimator_uptime_gamma); /* set mean */
331 gamma_mean = (params->m_mean_variance_estimator_gamma_mean +
334 sigmoid_gamma_mean)); /* set mean */
335 gating_threshold_mean = (params->m_gating_threshold + ((GATING_THRESHOLD_INITIAL -
336 params->m_gating_threshold) *
337 a_mean_variance_estimator_sigmoid_process(params,
338 params->m_mean_variance_estimator_uptime_gating))); /* set mean */
339 a_mean_variance_estimator_sigmoid_set_parameters(params, gating_threshold_mean,
340 GATING_THRESHOLD_TRANSITION); /* set parameters */
341 sigmoid_gating_mean = a_mean_variance_estimator_sigmoid_process(params, params->m_gas_index); /* set mean */
342 params->m_mean_variance_estimator_n_gamma_mean = (sigmoid_gating_mean * gamma_mean); /* set mean */
343 a_mean_variance_estimator_sigmoid_set_parameters(params, params->m_init_duration_variance,
344 INIT_TRANSITION_VARIANCE); /* set parameters */
345 sigmoid_gamma_variance = a_mean_variance_estimator_sigmoid_process(params,
346 params->m_mean_variance_estimator_uptime_gamma); /* set variance */
347 gamma_variance = (params->m_mean_variance_estimator_gamma_variance +
350 (sigmoid_gamma_variance - sigmoid_gamma_mean))); /* set variance */
351 gating_threshold_variance = (params->m_gating_threshold + ((GATING_THRESHOLD_INITIAL - params->m_gating_threshold) *
352 a_mean_variance_estimator_sigmoid_process(params,
353 params->m_mean_variance_estimator_uptime_gating))); /* set variance */
354 a_mean_variance_estimator_sigmoid_set_parameters(params, gating_threshold_variance,
355 GATING_THRESHOLD_TRANSITION); /* set parameters */
356 sigmoid_gating_variance = a_mean_variance_estimator_sigmoid_process(params, params->m_gas_index); /* set process */
357 params->m_mean_variance_estimator_n_gamma_variance = (sigmoid_gating_variance * gamma_variance); /* set variance */
359 ((params->m_sampling_interval / 60.f) *
360 (((1.f - sigmoid_gating_mean) *
361 (1.f + GATING_MAX_RATIO)) - GATING_MAX_RATIO))); /* set minutes */
362 if ((params->m_mean_variance_estimator_gating_duration_minutes < 0.f)) /* check minutes */
363 {
364 params->m_mean_variance_estimator_gating_duration_minutes = 0.f; /* init minutes */
365 }
367 {
368 params->m_mean_variance_estimator_uptime_gating = 0.f; /* set uptime gating 0 */
369 }
370}
371
378static void a_mean_variance_estimator_process(sgp41_gas_index_algorithm_t *params, float sraw)
379{
380 float delta_sgp;
381 float c;
382 float additional_scaling;
383
384 if ((params->m_mean_variance_estimator_initialized == 0)) /* no inited */
385 {
386 params->m_mean_variance_estimator_initialized = 1; /* set 1 */
387 params->m_mean_variance_estimator_sraw_offset = sraw; /* set raw */
388 params->m_mean_variance_estimator_mean = 0.f; /* init 0 */
389 }
390 else /* inited */
391 {
392 if (((params->m_mean_variance_estimator_mean >= 100.f) ||
393 (params->m_mean_variance_estimator_mean <= -100.f))) /* check mean */
394 {
396 params->m_mean_variance_estimator_mean); /* set offset */
397 params->m_mean_variance_estimator_mean = 0.f; /* init mean */
398 }
399 sraw = (sraw - params->m_mean_variance_estimator_sraw_offset); /* set sraw */
400 a_mean_variance_estimator_calculate_gamma(params); /* set gamma */
401 delta_sgp = ((sraw - params->m_mean_variance_estimator_mean) /
403 if ((delta_sgp < 0.f)) /* check sgp */
404 {
405 c = (params->m_mean_variance_estimator_std - delta_sgp); /* get c */
406 }
407 else
408 {
409 c = (params->m_mean_variance_estimator_std + delta_sgp); /* get c */
410 }
411 additional_scaling = 1.f; /* set scaling */
412 if ((c > 1440.f)) /* check c */
413 {
414 additional_scaling = ((c / 1440.f) * (c / 1440.f)); /* set scaling */
415 }
417 (sqrtf((additional_scaling *
420 sqrtf(((params->m_mean_variance_estimator_std *
422 (MEAN_VARIANCE_ESTIMATOR_GAMMA_SCALING * additional_scaling))) +
424 delta_sgp) / additional_scaling) * delta_sgp)))); /* set std */
427 delta_sgp) /
429 }
430}
431
438static float a_mox_model_process(sgp41_gas_index_algorithm_t *params, float sraw)
439{
440 if ((params->m_algorithm_type == SGP41_ALGORITHM_TYPE_NOX)) /* nox */
441 {
442 return (((sraw - params->m_mox_model_sraw_mean) /
443 SRAW_STD_NOX) *
444 params->m_index_gain); /* return raw */
445 }
446 else /* voc */
447 {
448 return (((sraw - params->m_mox_model_sraw_mean) /
449 (-1.f * (params->m_mox_model_sraw_std +
450 SRAW_STD_BONUS_VOC))) * params->m_index_gain); /* return raw */
451 }
452}
453
460static float a_sigmoid_scaled_process(sgp41_gas_index_algorithm_t *params, float sample)
461{
462 float x;
463 float shift;
464
465 x = (params->m_sigmoid_scaled_k * (sample - params->m_sigmoid_scaled_x0)); /* get x */
466 if ((x < -50.f)) /* check x */
467 {
468 return SIGMOID_L; /* return sigmoid */
469 }
470 else if ((x > 50.f)) /* check x */
471 {
472 return 0.f; /* return 0 */
473 }
474 else
475 {
476 if ((sample >= 0.f)) /* check sample */
477 {
478 if ((params->m_sigmoid_scaled_offset_default == 1.f)) /* check default */
479 {
480 shift = ((500.f / 499.f) * (1.f - params->m_index_offset)); /* set shift */
481 }
482 else
483 {
484 shift = ((SIGMOID_L - (5.f * params->m_index_offset)) / 4.f); /* set shift */
485 }
486
487 return (((SIGMOID_L + shift) / (1.f + expf(x))) - shift); /* return sigmoid */
488 }
489 else
490 {
491 return ((params->m_index_offset /
493 (SIGMOID_L / (1.f + expf(x)))); /* return sigmoid */
494 }
495 }
496}
497
504static float a_adaptive_lowpass_process(sgp41_gas_index_algorithm_t *params, float sample)
505{
506 float abs_delta;
507 float f1;
508 float tau_a;
509 float a3;
510
511 if ((params->m_adaptive_lowpass_initialized == 0)) /* init 0 */
512 {
513 params->m_adaptive_lowpass_x1 = sample; /* set sample */
514 params->m_adaptive_lowpass_x2 = sample; /* set sample */
515 params->m_adaptive_lowpass_x3 = sample; /* set sample */
516 params->m_adaptive_lowpass_initialized = 1; /* set init 1 */
517 }
518 params->m_adaptive_lowpass_x1 = (((1.f - params->m_adaptive_lowpass_a1) *
519 params->m_adaptive_lowpass_x1) +
520 (params->m_adaptive_lowpass_a1 * sample)); /* set adaptive lowpass x1 */
521 params->m_adaptive_lowpass_x2 = (((1.f - params->m_adaptive_lowpass_a2) *
522 params->m_adaptive_lowpass_x2) +
523 (params->m_adaptive_lowpass_a2 * sample)); /* set adaptive lowpass x2 */
524 abs_delta = (params->m_adaptive_lowpass_x1 - params->m_adaptive_lowpass_x2);
525 if ((abs_delta < 0.f)) /* check abs delta */
526 {
527 abs_delta = (-1.f * abs_delta); /* get delta */
528 }
529 f1 = expf((LP_ALPHA * abs_delta)); /* get f1 */
530 tau_a = (((LP_TAU_SLOW - LP_TAU_FAST) * f1) + LP_TAU_FAST); /* set tau a */
531 a3 = (params->m_sampling_interval / (params->m_sampling_interval + tau_a)); /* set a3 */
532 params->m_adaptive_lowpass_x3 = (((1.f - a3) *
533 params->m_adaptive_lowpass_x3) + (a3 * sample)); /* set adaptive lowpass x3 */
534
535 return params->m_adaptive_lowpass_x3; /* return adaptive lowpass x3 */
536}
537
543{
544 params->m_uptime = 0.f; /* init uptime */
545 params->m_sraw = 0.f; /* init sraw */
546 params->m_gas_index = 0; /* int gas index */
547 a_init_instances(params); /* init instances */
548}
549
556void sgp41_algorithm_init_with_sampling_interval(sgp41_gas_index_algorithm_t *params, int32_t algorithm_type, float sampling_interval)
557{
558 params->m_algorithm_type = algorithm_type; /* set algorithm type */
559 params->m_sampling_interval = sampling_interval; /* set sampling interval */
560 if ((algorithm_type == SGP41_ALGORITHM_TYPE_NOX)) /* nox */
561 {
562 params->m_index_offset = NOX_INDEX_OFFSET_DEFAULT; /* set offset */
563 params->m_sraw_minimum = NOX_SRAW_MINIMUM; /* set minimum */
565 params->m_init_duration_mean = INIT_DURATION_MEAN_NOX; /* set mean */
566 params->m_init_duration_variance = INIT_DURATION_VARIANCE_NOX; /* set variance */
567 params->m_gating_threshold = GATING_THRESHOLD_NOX; /* set threshold */
568 }
569 else
570 {
571 params->m_index_offset = VOC_INDEX_OFFSET_DEFAULT; /* set offset */
572 params->m_sraw_minimum = VOC_SRAW_MINIMUM; /* set minimum */
574 params->m_init_duration_mean = INIT_DURATION_MEAN_VOC; /* set mean */
575 params->m_init_duration_variance = INIT_DURATION_VARIANCE_VOC; /* set variance */
576 params->m_gating_threshold = GATING_THRESHOLD_VOC; /* set threshold */
577 }
578 params->m_index_gain = INDEX_GAIN; /* set gain */
579 params->m_tau_mean_hours = TAU_MEAN_HOURS; /* set hours */
580 params->m_tau_variance_hours = TAU_VARIANCE_HOURS; /* set hours */
581 params->m_sraw_std_initial = SRAW_STD_INITIAL; /* set initial */
582 sgp41_algorithm_reset(params); /* reset */
583}
584
590void sgp41_algorithm_init(sgp41_gas_index_algorithm_t *params, int32_t algorithm_type)
591{
593}
594
600void sgp41_algorithm_get_sampling_interval(const sgp41_gas_index_algorithm_t *params, float *sampling_interval)
601{
602 *sampling_interval = params->m_sampling_interval; /* get sampling interval */
603}
604
611void sgp41_algorithm_get_states(const sgp41_gas_index_algorithm_t *params, float* state0, float* state1)
612{
613 *state0 = a_mean_variance_estimator_get_mean(params); /* get state0 */
614 *state1 = a_mean_variance_estimator_get_std(params); /* get state1 */
615}
616
623void sgp41_algorithm_set_states(sgp41_gas_index_algorithm_t *params, float state0, float state1)
624{
625 a_mean_variance_estimator_set_states(params, state0, state1, PERSISTENCE_UPTIME_GAMMA); /* set states */
626 a_mox_model_set_parameters(params,
627 a_mean_variance_estimator_get_std(params),
628 a_mean_variance_estimator_get_mean(params)); /* set parameters */
629 params->m_sraw = state0; /* set state0 */
630}
631
643 int32_t learning_time_offset_hours, int32_t learning_time_gain_hours,
644 int32_t gating_max_duration_minutes, int32_t std_initial,
645 int32_t gain_factor)
646{
647 params->m_index_offset = ((float)(index_offset)); /* set offset */
648 params->m_tau_mean_hours = ((float)(learning_time_offset_hours)); /* set hours */
649 params->m_tau_variance_hours = ((float)(learning_time_gain_hours)); /* set hours */
650 params->m_gating_max_duration_minutes = ((float)(gating_max_duration_minutes)); /* set minutes */
651 params->m_sraw_std_initial = ((float)(std_initial)); /* set initial */
652 params->m_index_gain = ((float)(gain_factor)); /* set gain */
653 a_init_instances(params); /* init instances */
654}
655
667 int32_t *learning_time_offset_hours, int32_t *learning_time_gain_hours,
668 int32_t *gating_max_duration_minutes, int32_t *std_initial,
669 int32_t *gain_factor)
670{
671
672 *index_offset = ((int32_t)(params->m_index_offset)); /* get offset */
673 *learning_time_offset_hours = ((int32_t)(params->m_tau_mean_hours)); /* get hours */
674 *learning_time_gain_hours = ((int32_t)(params->m_tau_variance_hours)); /* get hours */
675 *gating_max_duration_minutes = ((int32_t)(params->m_gating_max_duration_minutes)); /* get minutes */
676 *std_initial = ((int32_t)(params->m_sraw_std_initial)); /* get std initial */
677 *gain_factor = ((int32_t)(params->m_index_gain)); /* get gain factor */
678}
679
686void sgp41_algorithm_process(sgp41_gas_index_algorithm_t *params, int32_t sraw, int32_t *gas_index)
687{
688 if ((params->m_uptime <= INITIAL_BLACKOUT)) /* check time */
689 {
690 params->m_uptime = (params->m_uptime + params->m_sampling_interval); /* set time */
691 }
692 else
693 {
694 if (((sraw > 0) && (sraw < 65000))) /* check sraw */
695 {
696 if ((sraw < (params->m_sraw_minimum + 1))) /* check sraw */
697 {
698 sraw = (params->m_sraw_minimum + 1); /* set sraw */
699 }
700 else if ((sraw > (params->m_sraw_minimum + 32767))) /* check sraw */
701 {
702 sraw = (params->m_sraw_minimum + 32767); /* set sraw */
703 }
704 params->m_sraw = ((float)((sraw - params->m_sraw_minimum))); /* set sraw */
705 }
707 || a_mean_variance_estimator_is_initialized(params))) /* voc */
708 {
709 params->m_gas_index = a_mox_model_process(params, params->m_sraw); /* set ga index */
710 params->m_gas_index = a_sigmoid_scaled_process(params, params->m_gas_index); /* set ga index */
711 }
712 else
713 {
714 params->m_gas_index = params->m_index_offset; /* set gas index */
715 }
716 params->m_gas_index = a_adaptive_lowpass_process(params, params->m_gas_index); /* set gas index */
717 if ((params->m_gas_index < 0.5f)) /* check gas index */
718 {
719 params->m_gas_index = 0.5f; /* set gas index */
720 }
721 if ((params->m_sraw > 0.f)) /* check sraw */
722 {
723 a_mean_variance_estimator_process(params, params->m_sraw); /* sraw */
724 a_mox_model_set_parameters(params,
725 a_mean_variance_estimator_get_std(params),
726 a_mean_variance_estimator_get_mean(params)); /* set parameters */
727 }
728 }
729 *gas_index = ((int32_t)((params->m_gas_index + 0.5f))); /* get gas index */
730}
#define GATING_NOX_MAX_DURATION_MINUTES
#define INIT_TRANSITION_MEAN
#define NOX_INDEX_OFFSET_DEFAULT
#define SIGMOID_X0_NOX
#define LP_TAU_FAST
#define MEAN_VARIANCE_ESTIMATOR_FIX16_MAX
#define INDEX_GAIN
#define SIGMOID_L
#define GATING_THRESHOLD_TRANSITION
#define VOC_INDEX_OFFSET_DEFAULT
#define SIGMOID_K_VOC
#define INITIAL_BLACKOUT
#define TAU_INITIAL_MEAN_VOC
#define LP_TAU_SLOW
#define SRAW_STD_INITIAL
#define GATING_THRESHOLD_NOX
#define INIT_DURATION_VARIANCE_VOC
#define GATING_MAX_RATIO
#define INIT_DURATION_MEAN_NOX
#define MEAN_VARIANCE_ESTIMATOR_ADDITIONAL_GAMMA_MEAN_SCALING
#define TAU_INITIAL_VARIANCE
#define DEFAULT_SAMPLING_INTERVAL
algorithm params definition
#define VOC_SRAW_MINIMUM
#define PERSISTENCE_UPTIME_GAMMA
#define SIGMOID_K_NOX
#define LP_ALPHA
#define SRAW_STD_BONUS_VOC
#define SRAW_STD_NOX
#define INIT_TRANSITION_VARIANCE
#define NOX_SRAW_MINIMUM
#define TAU_INITIAL_MEAN_NOX
#define INIT_DURATION_MEAN_VOC
#define SIGMOID_X0_VOC
#define GATING_VOC_MAX_DURATION_MINUTES
#define GATING_THRESHOLD_VOC
#define MEAN_VARIANCE_ESTIMATOR_GAMMA_SCALING
#define TAU_MEAN_HOURS
#define GATING_THRESHOLD_INITIAL
#define TAU_VARIANCE_HOURS
#define INIT_DURATION_VARIANCE_NOX
driver sgp41 algorithm header file
void sgp41_algorithm_set_tuning_parameters(sgp41_gas_index_algorithm_t *params, int32_t index_offset, int32_t learning_time_offset_hours, int32_t learning_time_gain_hours, int32_t gating_max_duration_minutes, int32_t std_initial, int32_t gain_factor)
algorithm set tuning parameters
void sgp41_algorithm_process(sgp41_gas_index_algorithm_t *params, int32_t sraw, int32_t *gas_index)
algorithm process
void sgp41_algorithm_get_states(const sgp41_gas_index_algorithm_t *params, float *state0, float *state1)
algorithm get states
void sgp41_algorithm_get_sampling_interval(const sgp41_gas_index_algorithm_t *params, float *sampling_interval)
algorithm get sampling interval
void sgp41_algorithm_init_with_sampling_interval(sgp41_gas_index_algorithm_t *params, int32_t algorithm_type, float sampling_interval)
algorithm init with sampling interval
struct sgp41_gas_index_algorithm_s sgp41_gas_index_algorithm_t
sgp41 gas index algorithm structure definition
void sgp41_algorithm_init(sgp41_gas_index_algorithm_t *params, int32_t algorithm_type)
algorithm init
#define SGP41_ALGORITHM_TYPE_VOC
sgp41 algorithm type definition
void sgp41_algorithm_get_tuning_parameters(const sgp41_gas_index_algorithm_t *params, int32_t *index_offset, int32_t *learning_time_offset_hours, int32_t *learning_time_gain_hours, int32_t *gating_max_duration_minutes, int32_t *std_initial, int32_t *gain_factor)
algorithm get tuning parameters
void sgp41_algorithm_reset(sgp41_gas_index_algorithm_t *params)
algorithm reset
#define SGP41_ALGORITHM_TYPE_NOX
void sgp41_algorithm_set_states(sgp41_gas_index_algorithm_t *params, float state0, float state1)
algorithm set states