SOPT
Sparse OPTimisation
wavelets.h
Go to the documentation of this file.
1 #ifndef SOPT_WAVELETS_WAVELETS_H
2 #define SOPT_WAVELETS_WAVELETS_H
3 
4 #include "sopt/config.h"
5 #include "sopt/types.h"
6 #include "sopt/wavelets/direct.h"
9 
10 #include <string> // for std::string
11 
12 namespace sopt::wavelets {
13 
14 // Advance declaration so we can define the subsequent friend function
15 class Wavelet;
16 
18 Wavelet factory(const std::string& name = "DB1", t_uint nlevels = 1);
19 
21 class Wavelet : public WaveletData {
22  friend Wavelet factory(const std::string& name, t_uint nlevels);
23 
24  protected:
26  Wavelet(WaveletData const &c, t_uint nlevels) : WaveletData(c), levels_(nlevels) {}
27 
28  public:
30  virtual ~Wavelet() {}
31 
32 // Temporary macros that checks constraints on input
33 #define SOPT_WAVELET_MACRO_MULTIPLE(NAME) \
34  if (((NAME).rows() == 1 or (NAME).cols() == 1)) { \
35  if ((NAME).size() % (1 << levels()) != 0) \
36  throw std::length_error("Size of " #NAME " must number a multiple of 2^levels or 1"); \
37  } else if ((NAME).rows() != 1 and (NAME).rows() % (1 << levels()) != 0) \
38  throw std::length_error("Rows of " #NAME " must number a multiple of 2^levels or 1"); \
39  else if ((NAME).cols() % (1 << levels()) != 0) \
40  throw std::length_error("Columns of " #NAME " must number a multiple of 2^levels");
41 #define SOPT_WAVELET_MACRO_EQUAL_SIZE(A, B) \
42  if ((A).rows() != (B).rows() or (A).cols() != (B).cols()) (A).derived().resize((B).rows(), (B).cols()); \
43  if ((A).rows() != (B).rows() or (A).cols() != (B).cols()) \
44  throw std::length_error("Incorrect size for output matrix(or could not resize)")
51  template <typename T0>
52  auto direct(Eigen::ArrayBase<T0> const &signal) const
53  -> decltype(direct_transform(signal, 1, *this)) {
55  return direct_transform(signal, levels(), *this);
56  }
65  template <typename T0, typename T1>
66  auto direct(Eigen::ArrayBase<T1> &coefficients, Eigen::ArrayBase<T0> const &signal) const
67  -> decltype(direct_transform(coefficients, signal, 1, *this)) {
70  return direct_transform(coefficients, signal, levels(), *this);
71  }
82  template <typename T0, typename T1>
83  auto direct(Eigen::ArrayBase<T1> &&coefficients, Eigen::ArrayBase<T0> const &signal) const
84  -> decltype(direct_transform(coefficients, signal, 1, *this)) {
87  return direct_transform(coefficients, signal, levels(), *this);
88  }
94  template <typename T0>
95  auto indirect(Eigen::ArrayBase<T0> const &coefficients) const
96  -> decltype(indirect_transform(coefficients, 1, *this)) {
98  return indirect_transform(coefficients, levels(), *this);
99  }
105  template <typename T0, typename T1>
106  auto indirect(Eigen::ArrayBase<T1> const &coefficients, Eigen::ArrayBase<T0> &signal) const
107  -> decltype(indirect_transform(coefficients, signal, 1, *this)) {
110  return indirect_transform(coefficients, signal, levels(), *this);
111  }
119  template <typename T0, typename T1>
120  auto indirect(Eigen::ArrayBase<T1> const &coeffs, Eigen::ArrayBase<T0> &&signal) const
121  -> decltype(indirect_transform(coeffs, signal, 1, *this)) {
123  SOPT_WAVELET_MACRO_EQUAL_SIZE(signal, coeffs);
124  return indirect_transform(coeffs, signal, levels(), *this);
125  }
126 #undef SOPT_WAVELET_MACRO_MULTIPLE
127 #undef SOPT_WAVELET_MACRO_EQUAL_SIZE
129  t_uint levels() const { return levels_; }
131  void levels(t_uint l) { levels_ = l; }
132 
133  protected:
135  t_uint levels_;
136 };
137 } // namespace sopt::wavelets
138 #endif
Performs direct and indirect wavelet transforms.
Definition: wavelets.h:21
void levels(t_uint l)
Sets number of levels over which to do transform.
Definition: wavelets.h:131
virtual ~Wavelet()
Destructor.
Definition: wavelets.h:30
auto direct(Eigen::ArrayBase< T1 > &coefficients, Eigen::ArrayBase< T0 > const &signal) const -> decltype(direct_transform(coefficients, signal, 1, *this))
Direct transform.
Definition: wavelets.h:66
auto indirect(Eigen::ArrayBase< T1 > const &coeffs, Eigen::ArrayBase< T0 > &&signal) const -> decltype(indirect_transform(coeffs, signal, 1, *this))
Indirect transform.
Definition: wavelets.h:120
friend Wavelet factory(const std::string &name, t_uint nlevels)
Creates a wavelet transform object.
Definition: wavelets.cc:8
auto indirect(Eigen::ArrayBase< T0 > const &coefficients) const -> decltype(indirect_transform(coefficients, 1, *this))
Indirect transform.
Definition: wavelets.h:95
auto direct(Eigen::ArrayBase< T1 > &&coefficients, Eigen::ArrayBase< T0 > const &signal) const -> decltype(direct_transform(coefficients, signal, 1, *this))
Direct transform.
Definition: wavelets.h:83
t_uint levels() const
Number of levels over which to do transform.
Definition: wavelets.h:129
auto indirect(Eigen::ArrayBase< T1 > const &coefficients, Eigen::ArrayBase< T0 > &signal) const -> decltype(indirect_transform(coefficients, signal, 1, *this))
Indirect transform.
Definition: wavelets.h:106
auto direct(Eigen::ArrayBase< T0 > const &signal) const -> decltype(direct_transform(signal, 1, *this))
Direct transform.
Definition: wavelets.h:52
std::enable_if< T1::IsVectorAtCompileTime, void >::type direct_transform(Eigen::ArrayBase< T0 > &coeffs, Eigen::ArrayBase< T1 > const &signal, t_uint levels, WaveletData const &wavelet)
N-levels 1d direct transform.
Definition: direct.h:61
Wavelet factory(const std::string &name, t_uint nlevels)
Creates a wavelet transform object.
Definition: wavelets.cc:8
std::enable_if< T1::IsVectorAtCompileTime, void >::type indirect_transform(Eigen::ArrayBase< T0 > const &coeffs, Eigen::ArrayBase< T1 > &signal, t_uint levels, WaveletData const &wavelet)
N-levels 1d indirect transform.
Definition: indirect.h:58
size_t t_uint
Root of the type hierarchy for unsigned integers.
Definition: types.h:15
Holds wavelets coefficients.
Definition: wavelet_data.h:11
t_vector const coefficients
Wavelet coefficient per-se.
Definition: wavelet_data.h:17
WaveletData(std::initializer_list< t_scalar > const &coefs)
Constructs from initializers.
Definition: wavelet_data.cc:36
#define SOPT_WAVELET_MACRO_MULTIPLE(NAME)
Definition: wavelets.h:33
#define SOPT_WAVELET_MACRO_EQUAL_SIZE(A, B)
Definition: wavelets.h:41