9 #if !defined(ASYNC) && !defined(OPENMP) && !defined(CUFFTW)
10 #define FFTW_PLAN_WITH_THREADS() fftw_plan_with_nthreads(m_num_threads);
12 #define FFTW_PLAN_WITH_THREADS()
20 Fftw::Fftw(int num_threads)
21 : m_num_threads(num_threads)
25 void Fftw::init(unsigned width, unsigned height, unsigned num_of_feats, unsigned num_of_scales, bool big_batch_mode)
29 m_num_of_feats = num_of_feats;
30 m_num_of_scales = num_of_scales;
31 m_big_batch_mode = big_batch_mode;
33 #if (!defined(ASYNC) && !defined(CUFFTW))|| defined(OPENMP)
38 std::cout << "FFT: FFTW" << std::endl;
40 std::cout << "FFT: cuFFTW" << std::endl;
42 //FFT forward one scale
44 cv::Mat in_f = cv::Mat::zeros(m_height, m_width, CV_32FC1);
45 ComplexMat out_f(m_height, m_width / 2 + 1, 1);
46 plan_f = fftwf_plan_dft_r2c_2d(m_height, m_width,
47 reinterpret_cast<float*>(in_f.data),
48 reinterpret_cast<fftwf_complex*>(out_f.get_p_data()),
52 //FFT forward all scales
53 if (m_num_of_scales > 1 && m_big_batch_mode) {
54 cv::Mat in_f_all = cv::Mat::zeros(m_height*m_num_of_scales, m_width, CV_32F);
55 ComplexMat out_f_all(m_height, m_width / 2 + 1, m_num_of_scales);
56 float *in = reinterpret_cast<float*>(in_f_all.data);
57 fftwf_complex *out = reinterpret_cast<fftwf_complex*>(out_f_all.get_p_data());
59 int n[] = {(int)m_height, (int)m_width};
60 int howmany = m_num_of_scales;
61 int idist = m_height*m_width, odist = m_height*(m_width/2+1);
62 int istride = 1, ostride = 1;
63 int *inembed = NULL, *onembed = NULL;
65 FFTW_PLAN_WITH_THREADS();
66 plan_f_all_scales = fftwf_plan_many_dft_r2c(rank, n, howmany,
67 in, inembed, istride, idist,
68 out, onembed, ostride, odist,
72 //FFT forward window one scale
74 cv::Mat in_fw = cv::Mat::zeros(m_height * m_num_of_feats, m_width, CV_32F);
75 ComplexMat out_fw(m_height, m_width / 2 + 1, m_num_of_feats);
76 float *in = reinterpret_cast<float*>(in_fw.data);
77 fftwf_complex *out = reinterpret_cast<fftwf_complex*>(out_fw.get_p_data());
79 int n[] = {(int)m_height, (int)m_width};
80 int howmany = m_num_of_feats;
81 int idist = m_height*m_width, odist = m_height*(m_width/2+1);
82 int istride = 1, ostride = 1;
83 int *inembed = NULL, *onembed = NULL;
85 FFTW_PLAN_WITH_THREADS();
86 plan_fw = fftwf_plan_many_dft_r2c(rank, n, howmany,
87 in, inembed, istride, idist,
88 out, onembed, ostride, odist,
92 //FFT forward window all scales all feats
93 if (m_num_of_scales > 1 && m_big_batch_mode) {
94 cv::Mat in_all = cv::Mat::zeros(m_height * (m_num_of_scales*m_num_of_feats), m_width, CV_32F);
95 ComplexMat out_all(m_height, m_width / 2 + 1, m_num_of_scales*m_num_of_feats);
96 float *in = reinterpret_cast<float*>(in_all.data);
97 fftwf_complex *out = reinterpret_cast<fftwf_complex*>(out_all.get_p_data());
99 int n[] = {(int)m_height, (int)m_width};
100 int howmany = m_num_of_scales*m_num_of_feats;
101 int idist = m_height*m_width, odist = m_height*(m_width/2+1);
102 int istride = 1, ostride = 1;
103 int *inembed = NULL, *onembed = NULL;
105 FFTW_PLAN_WITH_THREADS();
106 plan_fw_all_scales = fftwf_plan_many_dft_r2c(rank, n, howmany,
107 in, inembed, istride, idist,
108 out, onembed, ostride, odist,
112 //FFT inverse one scale
114 ComplexMat in_i(m_height,m_width,m_num_of_feats);
115 cv::Mat out_i = cv::Mat::zeros(m_height, m_width, CV_32FC(m_num_of_feats));
116 fftwf_complex *in = reinterpret_cast<fftwf_complex*>(in_i.get_p_data());
117 float *out = reinterpret_cast<float*>(out_i.data);
119 int n[] = {(int)m_height, (int)m_width};
120 int howmany = m_num_of_feats;
121 int idist = m_height*(m_width/2+1), odist = 1;
122 int istride = 1, ostride = m_num_of_feats;
123 int inembed[] = {(int)m_height, (int)m_width/2+1}, *onembed = n;
125 FFTW_PLAN_WITH_THREADS();
126 plan_i_features = fftwf_plan_many_dft_c2r(rank, n, howmany,
127 in, inembed, istride, idist,
128 out, onembed, ostride, odist,
131 //FFT inverse all scales
133 if (m_num_of_scales > 1 && m_big_batch_mode) {
134 ComplexMat in_i_all(m_height,m_width,m_num_of_feats*m_num_of_scales);
135 cv::Mat out_i_all = cv::Mat::zeros(m_height, m_width, CV_32FC(m_num_of_feats*m_num_of_scales));
136 fftwf_complex *in = reinterpret_cast<fftwf_complex*>(in_i_all.get_p_data());
137 float *out = reinterpret_cast<float*>(out_i_all.data);
139 int n[] = {(int)m_height, (int)m_width};
140 int howmany = m_num_of_feats*m_num_of_scales;
141 int idist = m_height*(m_width/2+1), odist = 1;
142 int istride = 1, ostride = m_num_of_feats*m_num_of_scales;
143 int inembed[] = {(int)m_height, (int)m_width/2+1}, *onembed = n;
145 FFTW_PLAN_WITH_THREADS();
146 plan_i_features_all_scales = fftwf_plan_many_dft_c2r(rank, n, howmany,
147 in, inembed, istride, idist,
148 out, onembed, ostride, odist,
152 //FFT inver one channel one scale
154 ComplexMat in_i1(m_height,m_width,1);
155 cv::Mat out_i1 = cv::Mat::zeros(m_height, m_width, CV_32FC1);
156 fftwf_complex *in = reinterpret_cast<fftwf_complex*>(in_i1.get_p_data());
157 float *out = reinterpret_cast<float*>(out_i1.data);
159 int n[] = {(int)m_height, (int)m_width};
161 int idist = m_height*(m_width/2+1), odist = 1;
162 int istride = 1, ostride = 1;
163 int inembed[] = {(int)m_height, (int)m_width/2+1}, *onembed = n;
165 FFTW_PLAN_WITH_THREADS();
166 plan_i_1ch = fftwf_plan_many_dft_c2r(rank, n, howmany,
167 in, inembed, istride, idist,
168 out, onembed, ostride, odist,
172 //FFT inver one channel all scales
173 if (m_num_of_scales > 1 && m_big_batch_mode) {
174 ComplexMat in_i1_all(m_height,m_width,m_num_of_scales);
175 cv::Mat out_i1_all = cv::Mat::zeros(m_height, m_width, CV_32FC(m_num_of_scales));
176 fftwf_complex *in = reinterpret_cast<fftwf_complex*>(in_i1_all.get_p_data());
177 float *out = reinterpret_cast<float*>(out_i1_all.data);
179 int n[] = {(int)m_height, (int)m_width};
180 int howmany = m_num_of_scales;
181 int idist = m_height*(m_width/2+1), odist = 1;
182 int istride = 1, ostride = m_num_of_scales;
183 int inembed[] = {(int)m_height, (int)m_width/2+1}, *onembed = n;
185 FFTW_PLAN_WITH_THREADS();
186 plan_i_1ch_all_scales = fftwf_plan_many_dft_c2r(rank, n, howmany,
187 in, inembed, istride, idist,
188 out, onembed, ostride, odist,
194 void Fftw::set_window(const cv::Mat &window)
199 void Fftw::forward(Scale_vars & vars)
201 ComplexMat *complex_result = vars.flag & Tracker_flags::TRACKER_INIT ? vars.p_yf_ptr :
202 vars.flag & Tracker_flags::AUTO_CORRELATION ? & vars.kf : & vars.kzf;
203 cv::Mat *input = vars.flag & Tracker_flags::TRACKER_INIT ? & vars.rot_labels : & vars.in_all;
205 if(m_big_batch_mode && vars.in_all.rows == (int)(m_height*m_num_of_scales)){
206 fftwf_execute_dft_r2c(plan_f_all_scales, reinterpret_cast<float*>(vars.in_all.data),
207 reinterpret_cast<fftwf_complex*>(complex_result->get_p_data()));
209 fftwf_execute_dft_r2c(plan_f, reinterpret_cast<float*>(input->data),
210 reinterpret_cast<fftwf_complex*>(complex_result->get_p_data()));
215 void Fftw::forward_window(Scale_vars & vars)
217 int n_channels = vars.patch_feats.size();
219 ComplexMat *result = vars.flag & Tracker_flags::TRACKER_INIT ? vars.p_model_xf_ptr :
220 vars.flag & Tracker_flags::TRACKER_UPDATE ? & vars.xf : & vars.zf;
222 for (int i = 0; i < n_channels; ++i) {
223 cv::Mat in_roi(vars.fw_all, cv::Rect(0, i*m_height, m_width, m_height));
224 in_roi = vars.patch_feats[i].mul(m_window);
227 float *in = reinterpret_cast<float*>(vars.fw_all.data);
228 fftwf_complex *out = reinterpret_cast<fftwf_complex*>(result->get_p_data());
230 if (n_channels <= (int) m_num_of_feats)
231 fftwf_execute_dft_r2c(plan_fw, in, out);
233 fftwf_execute_dft_r2c(plan_fw_all_scales, in, out);
237 void Fftw::inverse(Scale_vars & vars)
239 ComplexMat *input = vars.flag & Tracker_flags::RESPONSE ? & vars.kzf : & vars.xyf;
240 cv::Mat *real_result = vars.flag & Tracker_flags::RESPONSE ? & vars.response : & vars.ifft2_res;
242 int n_channels = input->n_channels;
243 fftwf_complex *in = reinterpret_cast<fftwf_complex*>(input->get_p_data());
244 float *out = reinterpret_cast<float*>(real_result->data);
247 fftwf_execute_dft_c2r(plan_i_1ch, in, out);
248 else if(m_big_batch_mode && n_channels == (int) m_num_of_scales)
249 fftwf_execute_dft_c2r(plan_i_1ch_all_scales, in, out);
250 else if(m_big_batch_mode && n_channels == (int) m_num_of_feats * (int) m_num_of_scales)
251 fftwf_execute_dft_c2r(plan_i_features_all_scales, in, out);
253 fftwf_execute_dft_c2r(plan_i_features, in, out);
255 *real_result = *real_result/(m_width*m_height);
261 fftwf_destroy_plan(plan_f);
262 fftwf_destroy_plan(plan_fw);
263 fftwf_destroy_plan(plan_i_features);
264 fftwf_destroy_plan(plan_i_1ch);
266 if (m_big_batch_mode) {
267 fftwf_destroy_plan(plan_f_all_scales);
268 fftwf_destroy_plan(plan_i_features_all_scales);
269 fftwf_destroy_plan(plan_fw_all_scales);
270 fftwf_destroy_plan(plan_i_1ch_all_scales);