dsplib 1.1.0
C++ DSP library for MATLAB-like coding
Loading...
Searching...
No Matches
math.h
1#pragma once
2
3#include <dsplib/array.h>
4#include <dsplib/keywords.h>
5
6#include <cstdint>
7
8namespace dsplib {
9
10//TODO: mark noexcept
11
12//exponential
13arr_real exp(span_real arr);
14real_t exp(real_t v);
15arr_cmplx exp(span_cmplx arr);
16cmplx_t exp(cmplx_t v);
17
18//complex exponential for zero Re and non-zero Im
19//faster then exp()
20arr_cmplx expj(span_real w);
21cmplx_t expj(real_t w);
22
23//hyperbolic tangent
24arr_real tanh(span_real x);
25arr_cmplx tanh(span_cmplx x);
26
27//max element
28real_t max(span_real arr);
29cmplx_t max(span_cmplx arr);
30
31template<typename T1, typename T2>
32auto max(const T1& v1, const T2& v2) -> decltype(v1 + v2) {
33 return (v1 > v2) ? (v1) : (v2);
34}
35
36//min element
37real_t min(span_real arr);
38cmplx_t min(span_cmplx arr);
39
40template<typename T1, typename T2>
41auto min(const T1& v1, const T2& v2) -> decltype(v1 + v2) {
42 return (v1 < v2) ? (v1) : (v2);
43}
44
45// range of values (maximum - minimum)
46real_t peak2peak(span_real arr);
47cmplx_t peak2peak(span_cmplx arr);
48
49//max element index
50int argmax(span_real arr);
51int argmax(span_cmplx arr);
52
53//min element index
54int argmin(span_real arr);
55int argmin(span_cmplx arr);
56
57//absolute value and complex magnitude
58arr_real abs(span_real arr) noexcept;
59real_t abs(real_t v) noexcept;
60arr_real abs(span_cmplx arr) noexcept;
61real_t abs(cmplx_t v) noexcept;
62void abs(inplace_real arr) noexcept;
63
64//phase angle in the interval [-pi, pi] for each element of a complex array z
65arr_real angle(span_cmplx arr);
66real_t angle(cmplx_t v);
67
68//round
69real_t round(const real_t& x) noexcept;
70cmplx_t round(const cmplx_t& x) noexcept;
71arr_real round(span_real arr) noexcept;
72arr_cmplx round(span_cmplx arr) noexcept;
73void round(inplace_real arr) noexcept;
74void round(inplace_cmplx arr) noexcept;
75
76//array sum
77real_t sum(span_real arr);
78cmplx_t sum(span_cmplx arr);
79int sum(const std::vector<bool>& arr);
80
81// cumulative sum
82// example: cumsum([1, 2, 3, 4, 5]) -> [1, 3, 6, 10, 15]
83arr_real cumsum(span_real x, Direction dir = Direction::Forward);
84arr_cmplx cumsum(span_cmplx x, Direction dir = Direction::Forward);
85
86//array dot
87real_t dot(span_real x1, span_real x2);
88cmplx_t dot(span_cmplx x1, span_cmplx x2);
89
90//array mean
91real_t mean(span_real arr);
92cmplx_t mean(span_cmplx arr);
93
94//standard deviation
95real_t stddev(span_real arr);
96real_t stddev(span_cmplx arr);
97
98//median
99real_t median(span_real arr);
100
101//linear or rank correlation
102//TODO: add p-value result
103real_t corr(span_real x, span_real y, Correlation type = Correlation::Pearson);
104
105//sort array elements
106//result: [sorted array, sort index]
107std::pair<arr_real, arr_int> sort(const arr_real& x, Direction dir = Direction::Ascend);
108
109//inplace sort
110void sort(inplace_real ix, Direction dir = Direction::Ascend);
111
112//determine if array is sorted
113bool issorted(span_real x, Direction dir = Direction::Ascend);
114
115//real part
116arr_real real(span_cmplx x);
117real_t real(const cmplx_t& x);
118
119//imag part
120arr_real imag(span_cmplx x);
121real_t imag(const cmplx_t& x);
122
123//complex pairing
124arr_cmplx conj(const arr_cmplx& x) noexcept;
125
126void conj(inplace_cmplx x) noexcept;
127
128constexpr cmplx_t conj(const cmplx_t& x) noexcept {
129 return x.conj();
130}
131
132inline arr_real conj(const arr_real& x) noexcept {
133 return x;
134};
135
136constexpr real_t conj(const real_t& x) noexcept {
137 return x;
138};
139
140//complex vector formation
141arr_cmplx complex(span_real re, span_real im);
142arr_cmplx complex(span_real re);
143
144//the nearest power of two numbers (with rounding up)
145constexpr int nextpow2(int m) noexcept {
146 assert(m >= 0);
147
148 if ((m == 0) || (m == 1)) {
149 return 0;
150 }
151
152 //TODO: if pow2 - use __builtin_ctz
153
154 int p = 0;
155 while ((m >> p) != 0) {
156 ++p;
157 }
158
159 --p;
160 if ((int(1) << p) == m) {
161 return p;
162 }
163
164 return p + 1;
165}
166
167//checks if m is an integral power of two
168constexpr bool ispow2(int m) noexcept {
169 assert(m >= 0);
170 return (m > 0) && (m & (m - 1)) == 0;
171}
172
173//scalar^scalar->scalar
174real_t power(real_t x, real_t n);
175cmplx_t power(cmplx_t x, real_t n);
176
177//scalar^vec->vec
178arr_cmplx power(cmplx_t x, const arr_real& n);
179
180//scalar^vec->vec
181arr_real power(real_t x, const arr_real& n);
182
183//vec.^vec->vec
184arr_real power(const arr_real& x, const arr_real& n);
185arr_cmplx power(const arr_cmplx& x, const arr_real& n);
186
187//vec.^scalar->vec
188arr_real power(const arr_real& x, real_t n);
189arr_cmplx power(const arr_cmplx& x, real_t n);
190
191//integer power
192real_t power(real_t x, int n);
193cmplx_t power(cmplx_t x, int n);
194arr_real power(const arr_real& x, int n);
195arr_cmplx power(const arr_cmplx& x, int n);
196
197//square root (only positive values)
198//TODO: add complex result for negative or complex input
199real_t sqrt(real_t x) noexcept;
200arr_real sqrt(span_real arr) noexcept;
201void sqrt(inplace_real arr) noexcept;
202
203//array log
204arr_real log(span_real arr);
205arr_real log2(span_real arr);
206arr_real log10(span_real arr);
207
208real_t log(const real_t& x);
209real_t log2(const real_t& x);
210real_t log10(const real_t& x);
211
212//array rms
213real_t rms(span_real arr);
214real_t rms(span_cmplx arr);
215
216//trigonometric functions
217arr_real sin(span_real arr);
218arr_real cos(span_real arr);
219
220//decrease sample rate by integer factor
221arr_real downsample(span_real arr, int n, int phase = 0);
222arr_cmplx downsample(span_cmplx arr, int n, int phase = 0);
223
224//increase sample rate by integer factor
225arr_real upsample(span_real arr, int n, int phase = 0);
226arr_cmplx upsample(span_cmplx arr, int n, int phase = 0);
227
228//abs(x)^2
229arr_real abs2(const arr_cmplx& x) noexcept;
230
231constexpr real_t abs2(const cmplx_t& x) noexcept {
232 return x.abs2();
233}
234
235inline arr_real abs2(const arr_real& x) {
236 return power(x, 2);
237}
238
239constexpr real_t abs2(const real_t& x) noexcept {
240 return (x * x);
241}
242
243//from degrees to radians
244arr_real deg2rad(span_real x);
245real_t deg2rad(const real_t& x);
246
247//from radians to degrees
248arr_real rad2deg(span_real x);
249real_t rad2deg(const real_t& x);
250
251//vector norms
252//p=1, sum(abs(x))
253//p=2, euclidean norm of vector, sum(abs(x).^2)^(1/2)
254//p>0, sum(abs(x).^p)^(1/p)
255real_t norm(span_real x, int p = 2);
256real_t norm(span_cmplx x, int p = 2);
257
258//Mean squared error
259real_t mse(span_real x, span_real y);
260real_t mse(span_cmplx x, span_cmplx y);
261
262//Normalized mean squared error
263real_t nmse(span_real x, span_real y);
264real_t nmse(span_cmplx x, span_cmplx y);
265
266//signum function
267constexpr int sign(const real_t& x) noexcept {
268 return (real_t(0) < x) - (x < real_t(0));
269}
270
271inline cmplx_t sign(const cmplx_t& x) noexcept {
272 if (x.re == 0 && x.im == 0) {
273 return 0;
274 }
275 return x / abs(x);
276}
277
278//----------------------------------------------------------------------------------------
279//convert power <-> decibels: db = 10 * log10(pow)
280real_t pow2db(real_t v) noexcept;
281arr_real pow2db(span_real arr) noexcept;
282real_t db2pow(real_t v) noexcept;
283arr_real db2pow(span_real arr) noexcept;
284void pow2db(inplace_real arr) noexcept;
285void db2pow(inplace_real arr) noexcept;
286
287//convert magnitude <-> decibels: db = 20 * log10(mag)
288real_t mag2db(real_t v) noexcept;
289arr_real mag2db(span_real arr) noexcept;
290real_t db2mag(real_t v) noexcept;
291arr_real db2mag(span_real arr) noexcept;
292void mag2db(inplace_real arr) noexcept;
293void db2mag(inplace_real arr) noexcept;
294
295//----------------------------------------------------------------------------------------
296//check that the number is prime
297//example: isprime(5) = true
298bool isprime(uint32_t n) noexcept;
299
300//prime factors
301//example: factor(10) = {2, 5}
302arr_int factor(uint32_t n);
303
304//next prime number
305//example: nextprime(10) == 11
306//example: nextprime(257) == 257
307uint32_t nextprime(uint32_t n);
308
309//prime numbers (less than or equal)
310//example: primes(11) = {2, 3, 5, 7, 11}
311//example: primes(10) = {2, 3, 5, 7}
312arr_int primes(uint32_t n);
313
314//----------------------------------------------------------------------------------------
315//missing data
316
317//determine if any array element is NaN
318bool anynan(span_real x);
319bool anynan(span_cmplx x);
320
321//determine if any array element is Inf or -Inf
322bool anyinf(span_real x);
323bool anyinf(span_cmplx x);
324
325} // namespace dsplib