85 void fft(
const cvec &in, cvec &out);
87 cvec
fft(
const cvec &in);
89 cvec
fft(
const cvec &in,
const int N);
91 void ifft(
const cvec &in, cvec &out);
93 cvec
ifft(
const cvec &in);
95 cvec
ifft(
const cvec &in,
const int N);
98 void fft_real(
const vec& in, cvec &out);
102 cvec
fft_real(
const vec &in,
const int N);
104 void ifft_real(
const cvec &in, vec &out);
108 vec
ifft_real(
const cvec &in,
const int N);
157 void dct(
const vec &in, vec &out);
159 vec
dct(
const vec &in);
161 void idct(
const vec &in, vec &out);
163 vec
idct(
const vec &in);
171 template <
class T> Vec<T>
dht(
const Vec<T> &v);
173 template <
class T>
void dht(
const Vec<T> &vin, Vec<T> &vout);
175 template <
class T>
void self_dht(Vec<T> &v);
178 template <
class T> Vec<T>
dwht(
const Vec<T> &v);
180 template <
class T>
void dwht(
const Vec<T> &vin, Vec<T> &vout);
182 template <
class T>
void self_dwht(Vec<T> &v);
185 template <
class T> Mat<T>
dht2(
const Mat<T> &m);
187 template <
class T> Mat<T>
dwht2(
const Mat<T> &m);
205 for (
int i = 0; i < N1; ++i) {
225 it_assert_debug((1 << m) == N,
"dht(): The vector size must be a power of two");
230 for (
int ib = 0; ib < N; ib += 2) {
231 vout(ib) = vin(ib) + vin(ib + 1);
232 vout(ib + 1) = vin(ib) - vin(ib + 1);
237 for (
int i = 1; i < m; ++i) {
240 for (
int k = 0; k < N; ++k) {
241 for (
int j = 0; j < l; ++j) {
243 vout(ib + j) += vout(ib + j + l);
244 vout(ib + j + l) = t - vout(ib + j + l);
251 vout /=
static_cast<T
>(
std::sqrt(static_cast<double>(vin.
size())));
259 it_assert_debug((1 << m) == N,
"self_dht(): The vector size must be a power "
263 for (
int i = 0; i < m; ++i) {
266 for (
int k = 0; k < N; ++k) {
267 for (
int j = 0; j < l; ++j) {
269 v(ib + j) += v(ib + j + l);
270 v(ib + j + l) = t - v(ib + j + l);
277 v /=
static_cast<T
>(
std::sqrt(static_cast<double>(v.
size())));
309 for (
int i = 0; i < m.
rows(); ++i) {
314 for (
int i = 0; i < m.
cols(); ++i) {
329 for (
int i = 0; i < m.
rows(); ++i) {
334 for (
int i = 0; i < m.
cols(); ++i) {
351 extern template vec
dht(
const vec &v);
352 extern template cvec
dht(
const cvec &v);
353 extern template void dht(
const vec &vin, vec &vout);
354 extern template void dht(
const cvec &vin, cvec &vout);
356 extern template void self_dht(vec &v);
357 extern template void self_dht(cvec &v);
359 extern template vec
dwht(
const vec &v);
360 extern template cvec
dwht(
const cvec &v);
361 extern template void dwht(
const vec &vin, vec &vout);
362 extern template void dwht(
const cvec &vin, cvec &vout);
367 extern template mat
dht2(
const mat &m);
368 extern template cmat
dht2(
const cmat &m);
370 extern template mat
dwht2(
const mat &m);
371 extern template cmat
dwht2(
const cmat &m);
379 #endif // #ifndef TRANSFORMS_H