39 TCSTPlan(fftwf_r2r_kind forward, std::vector<int> size);
44 void execute(
const D& in_data, D& out_data)
const;
46 const std::vector<int>&
get_size()
const;
52 std::vector<int> m_size;
56 fftwf_plan m_forward_plan;
57 fftwf_plan m_backward_plan;
59 virtual void do_execute(
value_type *buffer)
const = 0;
62 Scale(
float scale): m_scale(scale)
85 size_t rank = m_size.size();
86 fftwf_r2r_kind backward;
90 for (
size_t i = 0; i < rank; ++i)
91 m_scale *= 0.5 / ( size[i] + 1.0);
96 for (
size_t i = 0; i < rank; ++i)
97 m_scale *= 0.5 / ( size[i] - 1.0);
102 for (
size_t i = 0; i < rank; ++i)
103 m_scale *= 0.5 / size[i];
117 backward = FFTW_RODFT01;
121 backward = FFTW_REDFT01;
125 backward = FFTW_RODFT10;
129 backward = FFTW_REDFT10;
133 throw std::invalid_argument(
"TCSTPlan: unknown transformtion requested");
136 std::vector<fftwf_r2r_kind> fw_kind(rank, forward);
137 std::vector<fftwf_r2r_kind> bw_kind(rank, backward);
138 const int howmany =
sizeof(
value_type) /
sizeof(
float);
139 cvdebug() <<
"howmany = " << howmany <<
"\n";
142 for (
size_t i = 0; i < rank; ++i)
145 if (NULL == (m_in = (
value_type *) fftwf_malloc(
sizeof(T) * m_n))) {
146 msg =
"unable to allocate FFTW data";
150 if ( NULL == (m_out = (
value_type *) fftwf_malloc(
sizeof(T) * m_n))) {
151 msg =
"unable to allocate FFTW data";
155 if (0 == (m_forward_plan = fftwf_plan_many_r2r(rank, &size[0], howmany,
156 m_in, NULL, howmany, 1,
157 m_out, NULL, howmany, 1,
158 &fw_kind[0], FFTW_ESTIMATE))) {
159 msg =
"unable to create FFTW forward plan";
163 if (0 == (m_backward_plan = fftwf_plan_many_r2r(rank, &size[0], howmany,
164 m_out, NULL, howmany, 1,
165 m_in, NULL, howmany, 1,
166 &bw_kind[0], FFTW_ESTIMATE))) {
167 msg =
"unable to create FFTW backward plan";
173 fftwf_destroy_plan(m_forward_plan);
179 throw std::runtime_error(msg);
182 template <
typename T>
185 fftwf_destroy_plan(m_backward_plan);
186 fftwf_destroy_plan(m_forward_plan);
191 template <
typename T>
192 template <
typename D>
195 assert(m_n == in_data.size());
196 assert(m_n == out_data.size());
197 copy(in_data.begin(), in_data.end(), m_in);
198 fftwf_execute( m_forward_plan);
200 fftwf_execute(m_backward_plan);
201 transform( m_in, m_in + m_n, out_data.begin(), Scale(m_scale) );