Wayverb
dsp_vector_ops.h
1 #pragma once
2 
3 #include <cmath>
4 #include <numeric>
5 #include <vector>
6 
7 namespace wayverb {
8 namespace core {
9 
10 inline double recursive_sum(float t) { return t; }
11 inline double recursive_sum(double t) { return t; }
12 
13 template <typename T>
14 inline auto recursive_sum(const T& t) {
15  return std::accumulate(
16  begin(t), end(t), 0.0, [](const auto& a, const auto& b) {
17  return a + recursive_sum(b);
18  });
19 }
20 
21 template <typename T>
22 inline auto count(const T& t) {
23  return std::accumulate(
24  begin(t), end(t), 0u, [](const auto& a, const auto& b) {
25  return a + count(b);
26  });
27 }
28 
29 template <typename T, typename Allocator>
30 inline auto count(const std::vector<T, Allocator>& coll) {
31  return coll.size();
32 }
33 
34 template <typename T>
35 inline auto mean(const T& t) {
36  return recursive_sum(t) / count(t);
37 }
38 
39 inline double max_mag(float t) { return std::fabs(t); }
40 inline double max_mag(double t) { return std::fabs(t); }
41 
42 template <typename T>
43 inline auto max_mag(const T& t) {
44  return std::accumulate(begin(t), end(t), 0.0, [](double a, auto b) {
45  return std::max(a, max_mag(b));
46  });
47 }
48 
50 inline void mul(float& ret, double f) { ret *= f; }
51 inline void mul(double& ret, double f) { ret *= f; }
52 
54 template <typename T>
55 inline void mul(T& ret, double f) {
56  for (auto& i : ret) {
57  mul(i, f);
58  }
59 }
60 
63 template <typename T>
64 inline void normalize(T& ret) {
65  if (const auto mag = max_mag(ret)) {
66  mul(ret, 1.0 / mag);
67  }
68 }
69 
70 template <typename T>
71 inline void kernel_normalize(T& ret) {
72  const auto sum = std::abs(std::accumulate(begin(ret), end(ret), 0.0));
73  if (sum) {
74  mul(ret,
75  1.0 / sum - std::numeric_limits<typename T::value_type>::epsilon());
76  }
77 }
78 
79 } // namespace core
80 } // namespace wayverb
Definition: traits.cpp:2
Definition: capsule_base.h:9