#pragma once #ifndef _FFTCC_H_ #define _FFTCC_H_ #include #include "fftw3.h" #include "oc_array.h" #include "oc_dic.h" #include "oc_image.h" #include "oc_poi.h" #include "oc_point.h" #include "oc_subset.h" namespace opencorr { class FFTW { public: float* ref_subset; float* tar_subset; float* zncc; fftwf_complex* ref_freq; fftwf_complex* tar_freq; fftwf_complex* zncc_freq; fftwf_plan ref_plan; fftwf_plan tar_plan; fftwf_plan zncc_plan; static FFTW* allocate(int subset_radius_x, int subset_radius_y); static FFTW* allocate(int subset_radius_x, int subset_radius_y, int subset_radius_z); static void release(FFTW* instance); static void reallocate(FFTW* instance, int subset_radius_x, int subset_radius_y); static void reallocate(FFTW* instance, int subset_radius_x, int subset_radius_y, int subset_radius_z); }; class FFTCC2D : public DIC { private: std::vector instance_pool; //pool of FFTW instances for multi-thread processing FFTW* getInstance(int tid); //get an instance according to the number of current thread id public: FFTCC2D(int subset_radius_x, int subset_radius_y, int thread_number); ~FFTCC2D(); void compute(POI2D* poi); void compute(std::vector& poi_queue); }; class FFTCC3D : public DVC { private: std::vector instance_pool; //pool of FFTW instances for multi-thread processing FFTW* getInstance(int tid); //get an instance according to the number of current thread id public: FFTCC3D(int subset_radius_x, int subset_radius_y, int subset_radius_z, int thread_number); ~FFTCC3D(); void compute(POI3D* poi); void compute(std::vector& poi_queue); }; }//namespace opencorr #endif //_FFTCC_H_