Changeset 26486
- Timestamp:
- Dec 27, 2009, 8:21:02 AM (16 years ago)
- Location:
- branches/eam_branches/20091201/psModules/src
- Files:
-
- 4 edited
-
imcombine/pmSubtractionDeconvolve.c (modified) (8 diffs)
-
imcombine/pmSubtractionKernels.c (modified) (5 diffs)
-
imcombine/pmSubtractionKernels.h (modified) (1 diff)
-
psmodules.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionDeconvolve.c
r26479 r26486 6 6 #include <string.h> 7 7 #include <strings.h> 8 #include <fftw3.h> 8 9 #include <pslib.h> 9 10 11 #include "pmFPA.h" 12 #include "pmSubtractionKernels.h" 10 13 #include "pmSubtractionDeconvolve.h" 14 #include "pmSubtractionStamps.h" 15 #include "pmSubtractionVisual.h" 16 17 // Lock FFTW access 18 #define FFTW_LOCK \ 19 if (threaded) { \ 20 psFFTLock(); \ 21 } 22 // Unlock FFTW access 23 #define FFTW_UNLOCK \ 24 if (threaded) { \ 25 psFFTUnlock(); \ 26 } 27 28 #define FFTW_PLAN_RIGOR FFTW_ESTIMATE // How rigorous the FFTW planning is 11 29 12 30 psKernel *pmSubtractionDeconvolveGauss (int size, float sigma) { … … 15 33 16 34 // build the gaussian from 2 1-D Gaussians 17 psVector *vector = subtractionKernelISIS(sigma, 0, size);35 psVector *vector = pmSubtractionKernelISIS(sigma, 0, size); 18 36 19 37 // generate 2D kernel, calculate moments … … 63 81 FFTW_UNLOCK; 64 82 83 size_t numBytes = numCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes per image row 84 65 85 // copy data from kernelTarg image to dataTarg array 66 size_t numBytes = numCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes per image row67 86 for (int y = 0; y < numRows; y++) { 68 87 memcpy(&dataTarg[y*numCols], kernelTarg->image->data.F32[y], numBytes); 69 88 } 70 71 89 // copy data from kernelConv image to dataConv array 72 size_t numBytes = numCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes per image row73 90 for (int y = 0; y < numRows; y++) { 74 91 memcpy(&dataConv[y*numCols], kernelConv->image->data.F32[y], numBytes); … … 78 95 // Note that the FFT images have different size from the input 79 96 FFTW_LOCK; 80 fftwf_complex *fftTarg = fftwf_malloc((numCols/2 + 1) * paddedRows * sizeof(fftwf_complex)); // FFT81 fftwf_complex *fftConv = fftwf_malloc((numCols/2 + 1) * paddedRows * sizeof(fftwf_complex)); // FFT82 FFTW_UNLOCK; 83 84 FFTW_LOCK; 85 fftwf_plan forwardTarg = fftwf_plan_dft_r2c_2d(numRows, numCols, dataTarg, fftTarg, FFT _PLAN_RIGOR);86 fftwf_plan forwardConv = fftwf_plan_dft_r2c_2d(numRows, numCols, dataConv, fftConv, FFT _PLAN_RIGOR);97 fftwf_complex *fftTarg = fftwf_malloc((numCols/2 + 1) * numRows * sizeof(fftwf_complex)); // FFT 98 fftwf_complex *fftConv = fftwf_malloc((numCols/2 + 1) * numRows * sizeof(fftwf_complex)); // FFT 99 FFTW_UNLOCK; 100 101 FFTW_LOCK; 102 fftwf_plan forwardTarg = fftwf_plan_dft_r2c_2d(numRows, numCols, dataTarg, fftTarg, FFTW_PLAN_RIGOR); 103 fftwf_plan forwardConv = fftwf_plan_dft_r2c_2d(numRows, numCols, dataConv, fftConv, FFTW_PLAN_RIGOR); 87 104 FFTW_UNLOCK; 88 105 … … 103 120 // but anywhere Cr^2 - Ci^2 < 1e-7 of the max, mask it 104 121 122 // the X dimension is halved by FFTW 123 int numColsOut = numCols / 2 + 1; 124 105 125 // generate Det = Cr^2 - Ci^2 106 126 float maxValue = 0.0; 107 psImage *det = psImageAlloc(numCols , numRows, PS_TYPE_F32);127 psImage *det = psImageAlloc(numColsOut, numRows, PS_TYPE_F32); 108 128 for (int iy = 0; iy < numRows; iy++) { 109 for (int ix = 0; ix < numCols ; ix++) {110 float convReal = fftConv[ix + iy*numCols ][0];111 float convImag = fftConv[ix + iy*numCols ][1];129 for (int ix = 0; ix < numColsOut; ix++) { 130 float convReal = fftConv[ix + iy*numColsOut][0]; 131 float convImag = fftConv[ix + iy*numColsOut][1]; 112 132 det->data.F32[iy][ix] = convReal*convReal - convImag*convImag; 113 maxValue = PS_MAX(fabs(det->data.F32[iy][ix])); 114 } 115 } 133 maxValue = PS_MAX(maxValue, fabs(det->data.F32[iy][ix])); 134 } 135 } 136 # define TOL 1e-7 116 137 float limit = TOL*maxValue; 117 138 118 139 // generate Deco = targ * conv^* / (Cr^2 - Ci^2) 119 140 for (int iy = 0; iy < numRows; iy++) { 120 for (int ix = 0; ix < numCols ; ix++) {121 float targReal = fftTarg[ix + iy*numCols ][0];122 float targImag = fftTarg[ix + iy*numCols ][1];123 float convReal = fftConv[ix + iy*numCols ][0];124 float convImag = fftConv[ix + iy*numCols ][1];141 for (int ix = 0; ix < numColsOut; ix++) { 142 float targReal = fftTarg[ix + iy*numColsOut][0]; 143 float targImag = fftTarg[ix + iy*numColsOut][1]; 144 float convReal = fftConv[ix + iy*numColsOut][0]; 145 float convImag = fftConv[ix + iy*numColsOut][1]; 125 146 if (fabs(det->data.F32[iy][ix]) < limit) { 126 fftTarg[ix + iy*numCols ][0] = 0.0;127 fftTarg[ix + iy*numCols ][1] = 0.0;147 fftTarg[ix + iy*numColsOut][0] = 0.0; 148 fftTarg[ix + iy*numColsOut][1] = 0.0; 128 149 } else { 129 fftTarg[ix + iy*numCols ][0] = targReal*convReal + targImag*convImag;130 fftTarg[ix + iy*numCols ][1] = targImag*convReal - targReal*convImag;150 fftTarg[ix + iy*numColsOut][0] = targReal*convReal + targImag*convImag; 151 fftTarg[ix + iy*numColsOut][1] = targImag*convReal - targReal*convImag; 131 152 } 132 153 } … … 147 168 148 169 psKernel *output = psKernelAlloc (kernelTarg->xMin, kernelTarg->xMax, kernelTarg->yMin, kernelTarg->yMax); 149 for (int y = 0; y < numRows; y++ , outData++, dataPtr += paddedCols) {170 for (int y = 0; y < numRows; y++) { 150 171 memcpy(output->image->data.F32[y], &dataTarg[y*numCols], numBytes); 151 172 } … … 157 178 158 179 return output; 180 181 escape: 182 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "mismatch between kernel and image"); 183 return NULL; 184 159 185 } 160 186 161 187 bool pmSubtractionDeconvolutionTest () { 162 188 189 float sigma = 2.0; 163 190 int size = 15; 164 191 165 192 // generate a Hermite polynomial 166 psVector *xKernel = subtractionKernelHERM(sigma, 2, size); // x Kernel167 psVector *yKernel = subtractionKernelHERM(sigma, 2, size); // y Kernel193 psVector *xKernel = pmSubtractionKernelHERM(sigma, 2, size); // x Kernel 194 psVector *yKernel = pmSubtractionKernelHERM(sigma, 2, size); // y Kernel 168 195 psKernel *kernelTarget = psKernelAlloc(-size, size, -size, size); // Kernel 169 196 … … 183 210 184 211 // re-convolve the kernel 185 psImage *kernelConv = psImageConvolveFFT(NULL, kernel , NULL, 0, kernelGauss);186 pmSubtractionVisualShowSubtraction (kernelTarget->image, kernel->image, kernelConv ->image);212 psImage *kernelConv = psImageConvolveFFT(NULL, kernel->image, NULL, 0, kernelGauss); 213 pmSubtractionVisualShowSubtraction (kernelTarget->image, kernel->image, kernelConv); 187 214 188 215 return true; -
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.c
r26479 r26486 45 45 46 46 // Generate 1D convolution kernel for ISIS 47 static psVector *subtractionKernelISIS(float sigma, // Gaussian width47 psVector *pmSubtractionKernelISIS(float sigma, // Gaussian width 48 48 int order, // Polynomial order 49 49 int size // Kernel half-size … … 63 63 64 64 // Generate 1D convolution kernel for HERM (normalized for 2D) 65 static psVector *subtractionKernelHERM(float sigma, // Gaussian width65 psVector *pmSubtractionKernelHERM(float sigma, // Gaussian width 66 66 int order, // Polynomial order 67 67 int size // Kernel half-size … … 179 179 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 180 180 psArray *preCalc = psArrayAlloc(3); // Array to hold precalculated values 181 psVector *xKernel = preCalc->data[0] = subtractionKernelISIS(sigma, uOrder, size); // x Kernel182 psVector *yKernel = preCalc->data[1] = subtractionKernelISIS(sigma, vOrder, size); // y Kernel181 psVector *xKernel = preCalc->data[0] = pmSubtractionKernelISIS(sigma, uOrder, size); // x Kernel 182 psVector *yKernel = preCalc->data[1] = pmSubtractionKernelISIS(sigma, vOrder, size); // y Kernel 183 183 psKernel *kernel = preCalc->data[2] = psKernelAlloc(-size, size, -size, size); // Kernel 184 184 … … 283 283 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 284 284 psArray *preCalc = psArrayAlloc(3); // Array to hold precalculated values 285 psVector *xKernel = preCalc->data[0] = subtractionKernelHERM(sigma, uOrder, size); // x Kernel286 psVector *yKernel = preCalc->data[1] = subtractionKernelHERM(sigma, vOrder, size); // y Kernel285 psVector *xKernel = preCalc->data[0] = pmSubtractionKernelHERM(sigma, uOrder, size); // x Kernel 286 psVector *yKernel = preCalc->data[1] = pmSubtractionKernelHERM(sigma, vOrder, size); // y Kernel 287 287 psKernel *kernel = preCalc->data[2] = psKernelAlloc(-size, size, -size, size); // Kernel 288 288 … … 398 398 for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) { 399 399 psArray *preCalc = psArrayAlloc(3); // Array to hold precalculated values 400 psVector *xKernel = preCalc->data[0] = subtractionKernelHERM(sigma, uOrder, size); // x Kernel401 psVector *yKernel = preCalc->data[1] = subtractionKernelHERM(sigma, vOrder, size); // y Kernel400 psVector *xKernel = preCalc->data[0] = pmSubtractionKernelHERM(sigma, uOrder, size); // x Kernel 401 psVector *yKernel = preCalc->data[1] = pmSubtractionKernelHERM(sigma, vOrder, size); // y Kernel 402 402 psKernel *kernelTarget = psKernelAlloc(-size, size, -size, size); // Kernel 403 403 -
branches/eam_branches/20091201/psModules/src/imcombine/pmSubtractionKernels.h
r26479 r26486 111 111 } 112 112 113 psVector *pmSubtractionKernelISIS(float sigma, // Gaussian width 114 int order, // Polynomial order 115 int size // Kernel half-size 116 ); 117 118 psVector *pmSubtractionKernelHERM(float sigma, // Gaussian width 119 int order, // Polynomial order 120 int size // Kernel half-size 121 ); 122 113 123 /// Generate a delta-function grid for subtraction kernels (like the POIS kernel) 114 124 bool p_pmSubtractionKernelsAddGrid(pmSubtractionKernels *kernels, ///< The subtraction kernels to append to -
branches/eam_branches/20091201/psModules/src/psmodules.h
r25383 r26486 96 96 #include <pmSubtractionStamps.h> 97 97 #include <pmSubtractionKernels.h> 98 #include <pmSubtractionDeconvolve.h> 98 99 #include <pmSubtractionAnalysis.h> 99 100 #include <pmSubtractionMatch.h>
Note:
See TracChangeset
for help on using the changeset viewer.
