dsplib 1.1.0
C++ DSP library for MATLAB-like coding
Loading...
Searching...
No Matches
utils.h
1#pragma once
2
3#include <dsplib/array.h>
4
5#include <array>
6#include <cstdint>
7
8namespace dsplib {
9
10//sequence of numbers (not include "stop")
11template<typename T1, typename T2, typename T3>
12using enable_if_some_float_t = std::enable_if<std::is_floating_point<T1>::value || std::is_floating_point<T2>::value ||
13 std::is_floating_point<T3>::value>;
14
15template<typename T1, typename T2, typename T3, class R = typename enable_if_some_float_t<T1, T2, T3>::type>
16arr_real arange(T1 start, T2 stop, T3 step = 1) {
17 const auto n = (int)(std::round((stop - start) / double(step)));
18 arr_real r(n);
19 for (int i = 0; i < n; ++i) {
20 r[i] = start + (i * step);
21 }
22 return r;
23}
24
25inline arr_real arange(real_t stop) {
26 return arange(real_t(0), stop, real_t(1));
27}
28
29inline arr_real arange(int start, int stop, int step = 1) {
30 const auto n = (int)std::round((stop - start) / double(step));
31 arr_real r(n);
32 for (int i = 0; i < n; ++i) {
33 r[i] = start;
34 start += step;
35 }
36 return r;
37}
38
39inline arr_real arange(int stop) {
40 return arange(0, stop, 1);
41}
42
43//join a sequence of arrays
44//TODO: add slice args?
45arr_real concatenate(span_real x1, span_real x2, span_real x3 = {}, span_real x4 = {}, span_real x5 = {});
46arr_cmplx concatenate(span_cmplx x1, span_cmplx x2, span_cmplx x3 = {}, span_cmplx x4 = {}, span_cmplx x5 = {});
47
48//create array of all zeros
49inline arr_real zeros(int n) {
50 arr_real r(n);
51 return r;
52}
53
54inline arr_real ones(int n) {
55 arr_real r(n);
56 std::fill(r.begin(), r.end(), 1.0);
57 return r;
58}
59
60//repeat copies of array elements
61arr_real repelem(const arr_real& x, int n);
62arr_cmplx repelem(const arr_cmplx& x, int n);
63
64//flip order of elements
65arr_real flip(const arr_real& x);
66arr_cmplx flip(const arr_cmplx& x);
67void flip(inplace_real x);
68void flip(inplace_cmplx x);
69
70enum class dtype
71{
72 int16,
73 uint16,
74 int32,
75 uint32
76};
77
78enum class endian
79{
80 little,
81 big
82};
83
84arr_real from_file(const std::string& file, dtype type = dtype::int16, endian order = endian::little, long offset = 0,
85 long count = std::numeric_limits<long>::max());
86
87//add zeros to the end of the array
88arr_real zeropad(span_real x, int n);
89arr_cmplx zeropad(span_cmplx x, int n);
90
91//delays or advances the signal by the number of samples specified in delay
92//TODO: fractional delay support
93template<typename T>
94base_array<T> delayseq(const base_array<T>& data, int delay) {
95 if (delay == 0) {
96 return data;
97 }
98
99 const int N = data.size();
100 if (abs(delay) >= N) {
101 return zeros(N);
102 }
103
104 base_array<T> res = zeros(N);
105 if (delay > 0) {
106 res.slice(delay, N) = data.slice(0, N - delay);
107 } else {
108 res.slice(0, N - abs(delay)) = data.slice(abs(delay), N);
109 }
110 return res;
111}
112
113//peak localization
114real_t peakloc(span_real x, int idx, bool cyclic = true);
115real_t peakloc(span_cmplx x, int idx, bool cyclic = true);
116
117//Estimate delay between signals
118int finddelay(span_real x1, span_real x2);
119int finddelay(span_cmplx x1, span_cmplx x2);
120
122{
123 std::vector<real_t> pks;
124 std::vector<real_t> locs;
125 std::vector<real_t> wds;
126};
127
128// find local maxima
129PeakList findpeaks(arr_real data, int npeaks);
130
131// generate linearly spaced vector
132arr_real linspace(real_t x1, real_t x2, size_t n);
133
134// shift array circularly
135arr_real circshift(const arr_real& x, int k);
136arr_cmplx circshift(const arr_cmplx& x, int k);
137
138//shift zero-frequency component to center of spectrum (swaps the left and right halves of X)
139arr_real fftshift(const arr_real& x);
140arr_cmplx fftshift(const arr_cmplx& x);
141
148arr_cmplx zadoff_chu(int r, int n);
149
150} // namespace dsplib
Definition utils.h:122
std::vector< real_t > wds
peak widths
Definition utils.h:125
std::vector< real_t > pks
local maxima
Definition utils.h:123
std::vector< real_t > locs
peak locations
Definition utils.h:124