IT++ Logo
transforms.h
Go to the documentation of this file.
1 
30 #ifndef TRANSFORMS_H
31 #define TRANSFORMS_H
32 
33 #include <itpp/base/vec.h>
34 #include <itpp/base/mat.h>
35 #include <itpp/base/matfunc.h>
36 #include <itpp/itexports.h>
37 
38 
39 namespace itpp
40 {
41 
82 
83 
84 
86 ITPP_EXPORT bool have_fourier_transforms();
88 ITPP_EXPORT void fft(const cvec &in, cvec &out);
90 ITPP_EXPORT cvec fft(const cvec &in);
97 ITPP_EXPORT cvec fft(const cvec &in, const int N);
99 ITPP_EXPORT void ifft(const cvec &in, cvec &out);
101 ITPP_EXPORT cvec ifft(const cvec &in);
108 ITPP_EXPORT cvec ifft(const cvec &in, const int N);
109 
111 ITPP_EXPORT void fft_real(const vec& in, cvec &out);
113 ITPP_EXPORT cvec fft_real(const vec& in);
120 ITPP_EXPORT cvec fft_real(const vec &in, const int N);
127 ITPP_EXPORT void ifft_real(const cvec &in, vec &out);
134 ITPP_EXPORT vec ifft_real(const cvec &in);
144 ITPP_EXPORT vec ifft_real(const cvec &in, const int N);
146 
147 
189 
190 
191 
193 ITPP_EXPORT bool have_cosine_transforms();
195 ITPP_EXPORT void dct(const vec &in, vec &out);
197 ITPP_EXPORT vec dct(const vec &in);
204 ITPP_EXPORT vec dct(const vec &in, const int N);
206 ITPP_EXPORT void idct(const vec &in, vec &out);
208 ITPP_EXPORT vec idct(const vec &in);
215 ITPP_EXPORT vec idct(const vec &in, const int N);
217 
218 
221 
223 template <class T> Vec<T> dht(const Vec<T> &v);
225 template <class T> void dht(const Vec<T> &vin, Vec<T> &vout);
227 template <class T> void self_dht(Vec<T> &v);
228 
230 template <class T> Vec<T> dwht(const Vec<T> &v);
232 template <class T> void dwht(const Vec<T> &vin, Vec<T> &vout);
234 template <class T> void self_dwht(Vec<T> &v);
235 
237 template <class T> Mat<T> dht2(const Mat<T> &m);
239 template <class T> Mat<T> dwht2(const Mat<T> &m);
241 
242 template <class T>
243 Vec<T> dht(const Vec<T> &v)
244 {
245  Vec<T> ret(v.size());
246  dht(v, ret);
247  return ret;
248 }
249 
251 template <class T>
252 void bitrv(Vec<T> &out)
253 {
254  int N = out.size();
255  int j = 0;
256  int N1 = N - 1;
257  for(int i = 0; i < N1; ++i) {
258  if(i < j) {
259  T temp = out[j];
260  out[j] = out[i];
261  out[i] = temp;
262  }
263  int K = N / 2;
264  while(K <= j) {
265  j -= K;
266  K /= 2;
267  }
268  j += K;
269  }
270 }
271 
272 template <class T>
273 void dht(const Vec<T> &vin, Vec<T> &vout)
274 {
275  int N = vin.size();
276  int m = levels2bits(N);
277  it_assert_debug((1 << m) == N, "dht(): The vector size must be a power of two");
278 
279  vout.set_size(N);
280 
281  // This step is separated because it copies vin to vout
282  for(int ib = 0; ib < N; ib += 2) {
283  vout(ib) = vin(ib) + vin(ib + 1);
284  vout(ib + 1) = vin(ib) - vin(ib + 1);
285  }
286  N /= 2;
287 
288  int l = 2;
289  for(int i = 1; i < m; ++i) {
290  N /= 2;
291  int ib = 0;
292  for(int k = 0; k < N; ++k) {
293  for(int j = 0; j < l; ++j) {
294  T t = vout(ib + j);
295  vout(ib + j) += vout(ib + j + l);
296  vout(ib + j + l) = t - vout(ib + j + l);
297  }
298  ib += 2 * l;
299  }
300  l *= 2;
301  }
302 
303  vout /= static_cast<T>(std::sqrt(static_cast<double>(vin.size())));
304 }
305 
306 template <class T>
307 void self_dht(Vec<T> &v)
308 {
309  int N = v.size();
310  int m = levels2bits(N);
311  it_assert_debug((1 << m) == N, "self_dht(): The vector size must be a power "
312  "of two");
313 
314  int l = 1;
315  for(int i = 0; i < m; ++i) {
316  N /= 2;
317  int ib = 0;
318  for(int k = 0; k < N; ++k) {
319  for(int j = 0; j < l; ++j) {
320  T t = v(ib + j);
321  v(ib + j) += v(ib + j + l);
322  v(ib + j + l) = t - v(ib + j + l);
323  }
324  ib += 2 * l;
325  }
326  l *= 2;
327  }
328 
329  v /= static_cast<T>(std::sqrt(static_cast<double>(v.size())));
330 }
331 
332 template <class T>
333 Vec<T> dwht(const Vec<T> &v)
334 {
335  Vec<T> ret(v.size());
336  dwht(v, ret);
337  return ret;
338 }
339 
340 template <class T>
341 void dwht(const Vec<T> &vin, Vec<T> &vout)
342 {
343  dht(vin, vout);
344  bitrv(vout);
345 }
346 
347 
348 template <class T>
350 {
351  self_dht(v);
352  bitrv(v);
353 }
354 
355 template <class T>
356 Mat<T> dht2(const Mat<T> &m)
357 {
358  Mat<T> ret(m.rows(), m.cols());
359  Vec<T> v;
360 
361  for(int i = 0; i < m.rows(); ++i) {
362  v = m.get_row(i);
363  self_dht(v);
364  ret.set_row(i, v);
365  }
366  for(int i = 0; i < m.cols(); ++i) {
367  v = ret.get_col(i);
368  self_dht(v);
369  ret.set_col(i, v);
370  }
371 
372  return transpose(ret);
373 }
374 
375 template <class T>
376 Mat<T> dwht2(const Mat<T> &m)
377 {
378  Mat<T> ret(m.rows(), m.cols());
379  Vec<T> v;
380 
381  for(int i = 0; i < m.rows(); ++i) {
382  v = m.get_row(i);
383  self_dwht(v);
384  ret.set_row(i, v);
385  }
386  for(int i = 0; i < m.cols(); ++i) {
387  v = ret.get_col(i);
388  self_dwht(v);
389  ret.set_col(i, v);
390  }
391 
392  return transpose(ret);
393 }
394 
396 
397 // ----------------------------------------------------------------------
398 // Instantiations
399 // ----------------------------------------------------------------------
400 
401 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT vec dht(const vec &v);
402 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT cvec dht(const cvec &v);
403 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void dht(const vec &vin, vec &vout);
404 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void dht(const cvec &vin, cvec &vout);
405 
406 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void self_dht(vec &v);
407 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void self_dht(cvec &v);
408 
409 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT vec dwht(const vec &v);
410 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT cvec dwht(const cvec &v);
411 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void dwht(const vec &vin, vec &vout);
412 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void dwht(const cvec &vin, cvec &vout);
413 
414 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void self_dwht(vec &v);
415 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT void self_dwht(cvec &v);
416 
417 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT mat dht2(const mat &m);
418 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT cmat dht2(const cmat &m);
419 
420 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT mat dwht2(const mat &m);
421 ITPP_EXPORT_TEMPLATE template ITPP_EXPORT cmat dwht2(const cmat &m);
422 
424 
425 } // namespace itpp
426 
427 #endif // #ifndef TRANSFORMS_H
SourceForge Logo

Generated on Sat May 25 2013 16:32:23 for IT++ by Doxygen 1.8.2