#include <processor.h>
Inheritance diagram for EMAN::FFTResampleProcessor:
Public Member Functions | |
virtual EMData * | process (const EMData *const image) |
To proccess an image out-of-place. | |
virtual void | process_inplace (EMData *image) |
To process an image in-place. | |
string | get_desc () const |
Get the descrition of this specific processor. | |
string | get_name () const |
Get the processor's name. | |
TypeDict | get_param_types () const |
Get processor parameter information in a dictionary. | |
Static Public Member Functions | |
static Processor * | NEW () |
Static Public Attributes | |
static const string | NAME = "math.fft.resample" |
Private Member Functions | |
void | fft_resample (EMData *to, const EMData *const from, const float &sample_rate) |
An internal function that encapsulates a routine common to both process and process inplace. |
Hence it should probably be combined with a damping function near the edge Works for even/odd, 1D, 2D and 3D images (completely robust, tested)
n | sampe_rate |
Definition at line 3587 of file processor.h.
void FFTResampleProcessor::fft_resample | ( | EMData * | to, | |
const EMData *const | from, | |||
const float & | sample_rate | |||
) | [private] |
An internal function that encapsulates a routine common to both process and process inplace.
to | the smaller image that will store the shrunken values | |
from | the larger image that will be used to calculate the shrunken values | |
shrinkfactor | the shrink amount |
Definition at line 2130 of file processor.cpp.
References EMAN::EMData::clip_inplace(), EMAN::EMData::depad_corner(), EMAN::EMData::do_fft_inplace(), EMAN::EMData::do_ift_inplace(), EMAN::EMData::get_ndim(), EMAN::EMData::get_xsize(), EMAN::EMData::get_ysize(), EMAN::EMData::get_zsize(), EMAN::EMData::is_complex(), EMAN::EMData::process_inplace(), EMAN::EMData::set_fftodd(), and UnexpectedBehaviorException.
Referenced by process(), and process_inplace().
02130 { 02131 int nx = from->get_xsize(); 02132 int ny = from->get_ysize(); 02133 int nz = from->get_zsize(); 02134 02135 int new_nx = static_cast<int>( static_cast<float> (nx) / sample_rate); 02136 int new_ny = static_cast<int>( static_cast<float> (ny) / sample_rate); 02137 int new_nz = static_cast<int>( static_cast<float> (nz) / sample_rate); 02138 02139 if (new_nx == 0) throw UnexpectedBehaviorException("The resample rate causes the pixel dimensions in the x direction to go to zero"); 02140 if (new_ny == 0) new_ny = 1; 02141 if (new_nz == 0) new_nz = 1; 02142 02143 int ndim = from->get_ndim(); 02144 if ( ndim < 3 ) { 02145 new_nz = 1; 02146 } 02147 if ( ndim < 2 ) { 02148 new_ny = 1; 02149 } 02150 02151 int fft_x_correction = 1; 02152 if (new_nx % 2 == 0) fft_x_correction = 2; 02153 02154 int fft_y_correction = 0; 02155 if (ny != 1 && new_ny % 2 == 0 && ny % 2 == 1) fft_y_correction = 1; 02156 else if (ny != 1 && new_ny % 2 == 1 && ny % 2 == 0) fft_y_correction = -1; 02157 02158 int fft_z_correction = 0; 02159 if (nz != 1 && new_nz % 2 == 0 && nz % 2 == 1) fft_z_correction = 1; 02160 else if (nz != 1 && new_nz % 2 == 1 && nz % 2 == 0) fft_z_correction = -1; 02161 02162 if ( ! to->is_complex()) to->do_fft_inplace(); 02163 02164 if (ndim != 1) to->process_inplace("xform.fourierorigin.tocenter"); 02165 02166 Region clip(0,(ny-new_ny)/2-fft_y_correction,(nz-new_nz)/2-fft_z_correction,new_nx+fft_x_correction,new_ny,new_nz); 02167 to->clip_inplace(clip); 02168 02169 if (fft_x_correction == 1) to->set_fftodd(true); 02170 else to->set_fftodd(false); 02171 02172 if (ndim != 1) to->process_inplace("xform.fourierorigin.tocorner"); 02173 02174 to->do_ift_inplace(); 02175 to->depad_corner(); 02176 02177 }
string EMAN::FFTResampleProcessor::get_desc | ( | ) | const [inline, virtual] |
Get the descrition of this specific processor.
This function must be overwritten by a subclass.
Implements EMAN::Processor.
Definition at line 3594 of file processor.h.
string EMAN::FFTResampleProcessor::get_name | ( | ) | const [inline, virtual] |
Get the processor's name.
Each processor is identified by a unique name.
Implements EMAN::Processor.
Definition at line 3599 of file processor.h.
References NAME.
03600 { 03601 return NAME; 03602 }
TypeDict EMAN::FFTResampleProcessor::get_param_types | ( | ) | const [inline, virtual] |
Get processor parameter information in a dictionary.
Each parameter has one record in the dictionary. Each record contains its name, data-type, and description.
Reimplemented from EMAN::Processor.
Definition at line 3608 of file processor.h.
References EMAN::EMObject::FLOAT, and EMAN::TypeDict::put().
03609 { 03610 TypeDict d; 03611 d.put("n", EMObject::FLOAT, "The sample rate. Less than one enlarges the image, greater than one shrinks it."); 03612 return d; 03613 }
static Processor* EMAN::FFTResampleProcessor::NEW | ( | ) | [inline, static] |
Definition at line 3603 of file processor.h.
03604 { 03605 return new FFTResampleProcessor(); 03606 }
To proccess an image out-of-place.
For those processors which can only be processed out-of-place, override this function to give the right behavior.
image | The image will be copied, actual process happen on copy of image. |
Reimplemented from EMAN::Processor.
Definition at line 2095 of file processor.cpp.
References EMAN::EMData::copy(), EMAN::EMData::do_fft(), fft_resample(), InvalidValueException, EMAN::EMData::is_complex(), EMAN::Processor::params, EMAN::EMData::scale_pixel(), EMAN::Dict::set_default(), and EMAN::EMData::update().
02096 { 02097 float sample_rate = params.set_default("n",0.0f); 02098 if (sample_rate <= 0.0F ) { 02099 throw InvalidValueException(sample_rate, "sample rate must be >0 "); 02100 } 02101 02102 EMData* result; 02103 if (image->is_complex()) result = image->copy(); 02104 else result = image->do_fft(); 02105 fft_resample(result,image,sample_rate); 02106 // The image may have been padded - we should shift it so that the phase origin is where FFTW expects it 02107 result->update(); 02108 result->scale_pixel(sample_rate); 02109 return result; 02110 }
void FFTResampleProcessor::process_inplace | ( | EMData * | image | ) | [virtual] |
To process an image in-place.
For those processors which can only be processed out-of-place, override this function to just print out some error message to remind user call the out-of-place version.
image | The image to be processed. |
Implements EMAN::Processor.
Definition at line 2112 of file processor.cpp.
References fft_resample(), ImageFormatException, InvalidValueException, EMAN::EMData::is_complex(), EMAN::Processor::params, EMAN::EMData::scale_pixel(), EMAN::Dict::set_default(), and EMAN::EMData::update().
02113 { 02114 if (image->is_complex()) throw ImageFormatException("Error, the fft resampling processor does not work on complex images"); 02115 02116 02117 float sample_rate = params.set_default("n",0.0f); 02118 if (sample_rate <= 0.0F ) { 02119 throw InvalidValueException(sample_rate, "sample rate (n) must be >0 "); 02120 } 02121 02122 fft_resample(image,image,sample_rate); 02123 02124 image->scale_pixel(sample_rate); 02125 image->update(); 02126 02127 02128 }
const string FFTResampleProcessor::NAME = "math.fft.resample" [static] |