interpolate.h
1//-*-C++-*-
2/***************************************************************************
3 *
4 * Copyright (C) 2001 - 2025 by Willem van Straten
5 * Licensed under the Academic Free License version 2.1
6 *
7 ***************************************************************************/
8
9// psrchive/Util/fft/interpolate.h
10
11#ifndef __fft_interpolate_h
12#define __fft_interpolate_h
13
14#include "Traits.h"
15#include "Error.h"
16
17#include <vector>
18#include <iostream>
19
20namespace fft {
21
23 void interpolate (std::complex<float>* dest, unsigned n_dest, const std::complex<float>* src, unsigned n_src);
24
26 template <class T>
27 void interpolate (std::vector<T>& out, const std::vector<T>& in, bool verbose = false)
28 {
29 if (in.size() >= out.size())
30 throw Error (InvalidParam, "fft::interpolate",
31 "in.size=%d >= out.size=%d. just scrunch",
32 in.size() >= out.size());
33
34 std::vector< std::complex<float> > dom1 (in.size());
35 std::vector< std::complex<float> > dom2 (out.size());
36
37 DatumTraits<T> datum_traits;
38
39 unsigned ndim = datum_traits.ndim();
40 if (verbose)
41 std::cerr << "fft::interpolate ndim=" << ndim << " in.size=" << in.size() << " out.size=" << out.size() << std::endl;
42
43 unsigned ipt = 0;
44
45 // for each dimension of the type T, perform an interpolation
46 for (unsigned idim=0; idim<ndim; idim++)
47 {
48 for (ipt=0; ipt < in.size(); ipt++)
49 dom1[ipt] = datum_traits.element (in[ipt], idim);
50
51 interpolate (dom2.data(), dom2.size(), dom1.data(), dom1.size());
52
53 for (ipt=0; ipt < out.size(); ipt++)
54 datum_traits.element (out[ipt], idim) = datum_traits.element_traits.from_complex (dom2[ipt]);
55
56 } // end for each dimension
57
58 } // end of interpolate
59
60} // end of namespace fft
61
62#endif // ! __fft_interpolate_h
E element_traits
Definition Traits.h:73

Generated using doxygen 1.14.0