1 #ifndef SOPT_WAVELETS_DIRECT_H
2 #define SOPT_WAVELETS_DIRECT_H
4 #include "sopt/config.h"
18 template <
typename T0,
typename T1>
19 typename std::enable_if<T1::IsVectorAtCompileTime, void>::type direct_transform_impl(
20 Eigen::ArrayBase<T0>
const &coeffs_, Eigen::ArrayBase<T1>
const &signal,
22 Eigen::ArrayBase<T0> &coeffs =
const_cast<Eigen::ArrayBase<T0> &
>(coeffs_);
23 assert(coeffs.size() == signal.size());
26 auto const N = signal.size() / 2;
35 template <
typename T0,
typename T1>
36 typename std::enable_if<not T1::IsVectorAtCompileTime, void>::type direct_transform_impl(
37 Eigen::ArrayBase<T0>
const &coeffs_, Eigen::ArrayBase<T1>
const &signal_,
39 Eigen::ArrayBase<T0> &coeffs =
const_cast<Eigen::ArrayBase<T0> &
>(coeffs_);
40 Eigen::ArrayBase<T1> &signal =
const_cast<Eigen::ArrayBase<T1> &
>(signal_);
41 assert(coeffs.rows() == signal.rows());
42 assert(coeffs.cols() == signal.cols());
44 for (
t_uint i = 0; i < static_cast<t_uint>(coeffs.rows()); ++i)
45 direct_transform_impl(coeffs.row(i).transpose(), signal.row(i).transpose(), wavelet);
47 for (
t_uint i = 0; i < static_cast<t_uint>(coeffs.cols()); ++i) {
48 signal.col(i) = coeffs.col(i);
49 direct_transform_impl(coeffs.col(i), signal.col(i), wavelet);
60 template <
typename T0,
typename T1>
62 Eigen::ArrayBase<T0> &coeffs, Eigen::ArrayBase<T1>
const &signal,
t_uint levels,
64 assert(coeffs.rows() == signal.rows());
65 assert(coeffs.cols() == signal.cols());
67 auto input = copy(signal);
68 if (levels > 0) direct_transform_impl(coeffs, input, wavelet);
69 for (
t_uint level(1); level < levels; ++level) {
70 auto const N =
static_cast<t_uint>(signal.size()) >> level;
71 input.head(
N) = coeffs.head(
N);
72 direct_transform_impl(coeffs.head(
N), input.head(
N), wavelet);
80 template <
typename T0,
typename T1>
82 Eigen::ArrayBase<T0>
const &coeffs_, Eigen::ArrayBase<T1>
const &signal,
t_uint levels,
84 assert(coeffs_.rows() == signal.rows());
85 assert(coeffs_.cols() == signal.cols());
86 Eigen::ArrayBase<T0> &coeffs =
const_cast<Eigen::ArrayBase<T0> &
>(coeffs_);
93 auto input = copy(signal);
94 direct_transform_impl(coeffs, input, wavelet);
95 for (
t_uint level(1); level < levels; ++level) {
96 auto const Nx =
static_cast<t_uint>(signal.rows()) >> level;
97 auto const Ny =
static_cast<t_uint>(signal.cols()) >> level;
98 input.topLeftCorner(Nx, Ny) = coeffs.topLeftCorner(Nx, Ny);
99 direct_transform_impl(coeffs.topLeftCorner(Nx, Ny), input.topLeftCorner(Nx, Ny), wavelet);
106 template <
typename T0>
108 -> decltype(copy(signal)) {
109 auto result = copy(signal);
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.
size_t t_uint
Root of the type hierarchy for unsigned integers.
t_vector low
Low-pass filter for direct transform.
t_vector high
High-pass filter for direct transform.
Holds wavelets coefficients.
struct sopt::wavelets::WaveletData::DirectFilter direct_filter