dox/Imaging/vtkImageMRIFourierFilter.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   vtkCNMRRLibrary
00004   Module:    $RCSfile: vtkImageMRIFourierFilter.h,v $
00005 
00006   Copyright  2005  The Pennsylvania State University
00007   
00008           Notice
00009  
00010   The contents of this file are subject to The Pennsylvania State University 
00011   Open Source License (the "License"); you may not use this file except in 
00012   compliance with the License. You may obtain a copy of the License at H066 
00013   Radiology, NMR Building, 500 University Drive, Hershey, PA, 
00014   tel. (717) 531-6069 or via email at dcb210@psu.edu.
00015  
00016   Software distributed under the License is distributed on an "AS IS" basis, 
00017   WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
00018   for the specific language governing rights and limitations under the 
00019   License.
00020  
00021   The Original Code is listed under Exhibit A of the license.
00022  
00023   The Initial Developer of the Original Code is Don Bigler.
00024  
00025   Contributor(s):
00026  
00027      
00028   Adpated from vtkImageFourierFilter.h
00029 
00030 =========================================================================*/
00040 #ifndef __vtkImageMRIFourierFilter_h
00041 #define __vtkImageMRIFourierFilter_h
00042 
00043 
00044 #include "vtkImageDecomposeFilter.h"
00045 #include "vtkCNMRRImagingWin32Header.h"
00046 
00047 
00048 //BTX
00049 /*******************************************************************
00050                         COMPLEX number stuff
00051 *******************************************************************/
00052 
00053 #if defined(AMD64_TRUE) && defined(USE_AMD_ACML)
00054 #define SIN    fastsin
00055 #define COS    fastcos
00056 #define EXP    fastexp
00057 #else
00058 #define SIN    sin
00059 #define COS    cos
00060 #define EXP    exp
00061 #endif
00062 
00063 
00064 typedef struct{
00065     double Real;
00066     double Imag;
00067   } vtkImageComplexNumber;
00068 
00069 
00070 #define vtkImageComplexNumberEuclidSet(C, R, I) \
00071   (C).Real = (R); \
00072   (C).Imag = (I)
00073 
00074 #define vtkImageComplexNumberPolarSet(C, M, P) \
00075   (C).Real = (M)*COS(P); \
00076   (C).Imag = (M)*SIN(P)
00077 
00078 #define vtkImageComplexNumberPrint(C) \
00079   printf("(%.3f, %.3f)", (C).Real, (C).Imag)
00080 
00081 #define vtkImageComplexNumberScale(cOut, S, cIn) \
00082   (cOut).Real = (cIn).Real * (S); \
00083   (cOut).Imag = (cIn).Imag * (S)
00084 
00085 #define vtkImageComplexNumberConjugate(cIn, cOut) \
00086   (cOut).Imag = (cIn).Imag * -1.0;    \
00087   (cOut).Real = (cIn).Real
00088 
00089 #define vtkImageComplexNumberAdd(C1, C2, cOut) \
00090   (cOut).Real = (C1).Real + (C2).Real; \
00091   (cOut).Imag = (C1).Imag + (C2).Imag
00092 
00093 #define vtkImageComplexNumberSubtract(C1, C2, cOut) \
00094   (cOut).Real = (C1).Real - (C2).Real; \
00095   (cOut).Imag = (C1).Imag - (C2).Imag
00096 
00097 #define vtkImageComplexNumberMultiply(C1, C2, cOut) \
00098 { \
00099   vtkImageComplexNumber _vtkImageComplexMultiplyTemp; \
00100   _vtkImageComplexMultiplyTemp.Real = (C1).Real*(C2).Real-(C1).Imag*(C2).Imag;\
00101   _vtkImageComplexMultiplyTemp.Imag = (C1).Real*(C2).Imag+(C1).Imag*(C2).Real;\
00102   cOut = _vtkImageComplexMultiplyTemp; \
00103 }
00104 
00105 #define vtkImageComplexNumberDivide(C1, C2, cOut) \
00106 { \
00107   vtkImageComplexNumber _vtkImageComplexDivideTemp; \
00108   _vtkImageComplexDivideTemp.Real = ((C1).Real*(C2).Real+(C1).Imag*(C2).Imag)/((C2).Real*(C2).Real+(C2).Imag*(C2).Imag);\
00109   _vtkImageComplexDivideTemp.Imag = ((C2).Real*(C1).Imag-(C2).Imag*(C1).Real)/((C2).Real*(C2).Real+(C2).Imag*(C2).Imag);\
00110   cOut = _vtkImageComplexDivideTemp; \
00111 }
00112 
00113 // This macro calculates exp(cIn) and puts the result in cOut 
00114 #define vtkImageComplexNumberExponential(cIn, cOut) \
00115 { \
00116   double tmp = EXP(cIn.Real); \
00117   cOut.Real = tmp * COS(cIn.Imag); \
00118   cOut.Imag = tmp * SIN(cIn.Imag); \
00119 }
00120 
00121 /******************* End of COMPLEX number stuff ********************/
00122 //ETX
00123 
00124 class VTK_CNMRR_IMAGING_EXPORT vtkImageMRIFourierFilter : public vtkImageDecomposeFilter
00125 {
00126    public:
00127       vtkTypeRevisionMacro(vtkImageMRIFourierFilter,vtkImageDecomposeFilter);
00128    
00129    
00130       // public for templated functions of this object
00131       //BTX
00132    
00134 
00135       vtkSetMacro(Decimation, int);
00136       vtkGetMacro(Decimation, int);
00137       vtkBooleanMacro(Decimation, int);
00139       
00142       void ExecuteFft(vtkImageComplexNumber *in, vtkImageComplexNumber *out, int N);
00143       
00144       
00147       void ExecuteRfft(vtkImageComplexNumber *in, vtkImageComplexNumber *out, int N);
00148       
00149       //ETX
00150    
00151    protected:
00152       vtkImageMRIFourierFilter();
00153       ~vtkImageMRIFourierFilter() {};
00154       
00155       //BTX
00156       int Decimation;
00157          
00158       void ExecuteFftStep2(vtkImageComplexNumber *p_in, vtkImageComplexNumber *p_out, 
00159                      int N, int bsize, int fb);
00160       void ExecuteFftStepN(vtkImageComplexNumber *p_in, vtkImageComplexNumber *p_out,
00161                      int N, int bsize, int n, int fb);
00162       void ExecuteFftForwardBackward(vtkImageComplexNumber *in, vtkImageComplexNumber *out, 
00163                      int N, int fb);
00164       //ETX
00165    private:
00166       vtkImageMRIFourierFilter(const vtkImageMRIFourierFilter&);  // Not implemented.
00167       void operator=(const vtkImageMRIFourierFilter&);  // Not implemented.
00168 };
00169 
00170 
00171 
00172 #endif

Generated on Tue May 12 14:53:03 2009 for vtkCNMRRLibrary by  doxygen 1.4.7