PER Firmware
Loading...
Searching...
No Matches
rescale.h
Go to the documentation of this file.
1#ifndef RESCALE_H
2#define RESCALE_H
3
14[[gnu::always_inline]]
15static inline float rescale_float(
16 float input,
17 float input_min,
18 float input_max,
19 float output_min,
20 float output_max
21) {
22 float input_range = input_max - input_min;
23 float output_range = output_max - output_min;
24
25 if (input_range == 0.0f) return output_min; // prevent div by 0
26
27 float ratio = (input - input_min) / input_range;
28 float output = output_min + (ratio * output_range);
29
30 return output;
31}
32
33[[gnu::always_inline]]
34static inline signed int rescale_signed(
35 signed int input,
36 signed int input_min,
37 signed int input_max,
38 signed int output_min,
39 signed int output_max
40) {
41 float output = rescale_float(
42 (float)input,
43 (float)input_min,
44 (float)input_max,
45 (float)output_min,
46 (float)output_max
47 );
48
49 return (signed int)output;
50}
51
52[[gnu::always_inline]]
53static inline unsigned int rescale_unsigned(
54 unsigned int input,
55 unsigned int input_min,
56 unsigned int input_max,
57 unsigned int output_min,
58 unsigned int output_max
59) {
60 float output = rescale_float(
61 (float)input,
62 (float)input_min,
63 (float)input_max,
64 (float)output_min,
65 (float)output_max
66 );
67
68 return (unsigned int)output;
69}
70
71#define RESCALE(input, input_min, input_max, output_min, output_max) \
72 _Generic((input) + (input_min) + (input_max) + (output_min) + (output_max), \
73 signed int: rescale_signed, \
74 unsigned int: rescale_unsigned, \
75 float: rescale_float \
76)(input, input_min, input_max, output_min, output_max)
77
78#endif // RESCALE_H