00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00040 #ifndef __vtkImageMRIFourierFilter_h
00041 #define __vtkImageMRIFourierFilter_h
00042
00043
00044 #include "vtkImageDecomposeFilter.h"
00045 #include "vtkCNMRRImagingWin32Header.h"
00046
00047
00048
00049
00050
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
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
00122
00123
00124 class VTK_CNMRR_IMAGING_EXPORT vtkImageMRIFourierFilter : public vtkImageDecomposeFilter
00125 {
00126 public:
00127 vtkTypeRevisionMacro(vtkImageMRIFourierFilter,vtkImageDecomposeFilter);
00128
00129
00130
00131
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
00150
00151 protected:
00152 vtkImageMRIFourierFilter();
00153 ~vtkImageMRIFourierFilter() {};
00154
00155
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
00165 private:
00166 vtkImageMRIFourierFilter(const vtkImageMRIFourierFilter&);
00167 void operator=(const vtkImageMRIFourierFilter&);
00168 };
00169
00170
00171
00172 #endif