Changeset 14532
- Timestamp:
- Aug 16, 2007, 10:32:38 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionKernels.c
r14525 r14532 99 99 100 100 pmSubtractionKernels *pmSubtractionKernelsISIS(int size, int spatialOrder, 101 const psVector * sigmas, const psVector *orders)102 { 103 PS_ASSERT_VECTOR_NON_NULL( sigmas, NULL);104 PS_ASSERT_VECTOR_TYPE( sigmas, PS_TYPE_F32, NULL);101 const psVector *fwhms, const psVector *orders) 102 { 103 PS_ASSERT_VECTOR_NON_NULL(fwhms, NULL); 104 PS_ASSERT_VECTOR_TYPE(fwhms, PS_TYPE_F32, NULL); 105 105 PS_ASSERT_VECTOR_NON_NULL(orders, NULL); 106 106 PS_ASSERT_VECTOR_TYPE(orders, PS_TYPE_S32, NULL); 107 PS_ASSERT_VECTORS_SIZE_EQUAL( sigmas, orders, NULL);107 PS_ASSERT_VECTORS_SIZE_EQUAL(fwhms, orders, NULL); 108 108 PS_ASSERT_INT_POSITIVE(size, NULL); 109 109 PS_ASSERT_INT_NONNEGATIVE(spatialOrder, NULL); 110 110 111 int numGaussians = sigmas->n; // Number of Gaussians111 int numGaussians = fwhms->n; // Number of Gaussians 112 112 113 113 int num = 0; // Number of basis functions … … 115 115 for (int i = 0; i < numGaussians; i++) { 116 116 int gaussOrder = orders->data.S32[i]; // Polynomial order to apply to Gaussian 117 psStringAppend(¶ms, "(%.2f,%d)", sigmas->data.F32[i], orders->data.S32[i]);117 psStringAppend(¶ms, "(%.2f,%d)", fwhms->data.F32[i], orders->data.S32[i]); 118 118 num += (gaussOrder + 1) * (gaussOrder + 2) / 2; 119 119 } … … 133 133 // Set the kernel parameters 134 134 for (int i = 0, index = 0; i < numGaussians; i++) { 135 float norm = 1.0 / (M_2_PI * sqrtf(sigmas->data.F32[i])); // Normalisation for Gaussian 135 float sigma = fwhms->data.F32[i] / (2.0 * sqrtf(2.0 * logf(2.0))); // Gaussian sigma 136 float norm = 1.0 / (M_2_PI * sqrtf(sigma)); // Normalisation for Gaussian 137 136 138 // Iterate over (u,v) order 137 139 for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) { … … 144 146 for (int u = -size; u <= size; u++) { 145 147 sum += preCalc->kernel[v][u] = norm * power(u, uOrder) * power(v, vOrder) * 146 expf(-0.5 * (PS_SQR(u) + PS_SQR(v)) / PS_SQR(sigma s->data.F32[i]));148 expf(-0.5 * (PS_SQR(u) + PS_SQR(v)) / PS_SQR(sigma)); 147 149 } 148 150 } … … 163 165 } 164 166 165 kernels->widths->data.F32[index] = sigmas->data.F32[i];167 kernels->widths->data.F32[index] = fwhms->data.F32[i]; 166 168 kernels->u->data.S32[index] = uOrder; 167 169 kernels->v->data.S32[index] = vOrder; … … 169 171 170 172 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d\n", index, 171 sigmas->data.F32[i], uOrder, vOrder);173 fwhms->data.F32[i], uOrder, vOrder); 172 174 } 173 175 } … … 378 380 379 381 // Grid United with Normal Kernel 380 pmSubtractionKernels *pmSubtractionKernelsGUNK(int size, int spatialOrder, const psVector * sigmas,382 pmSubtractionKernels *pmSubtractionKernelsGUNK(int size, int spatialOrder, const psVector *fwhms, 381 383 const psVector *orders, int inner) 382 384 { 383 385 PS_ASSERT_INT_POSITIVE(size, NULL); 384 386 PS_ASSERT_INT_NONNEGATIVE(spatialOrder, NULL); 385 PS_ASSERT_VECTOR_NON_NULL( sigmas, NULL);386 PS_ASSERT_VECTOR_TYPE( sigmas, PS_TYPE_F32, NULL);387 PS_ASSERT_VECTOR_NON_NULL(fwhms, NULL); 388 PS_ASSERT_VECTOR_TYPE(fwhms, PS_TYPE_F32, NULL); 387 389 PS_ASSERT_VECTOR_NON_NULL(orders, NULL); 388 390 PS_ASSERT_VECTOR_TYPE(orders, PS_TYPE_S32, NULL); 389 PS_ASSERT_VECTORS_SIZE_EQUAL( sigmas, orders, NULL);391 PS_ASSERT_VECTORS_SIZE_EQUAL(fwhms, orders, NULL); 390 392 PS_ASSERT_INT_NONNEGATIVE(inner, NULL); 391 393 PS_ASSERT_INT_LESS_THAN(inner, size, NULL); 392 394 393 int numGaussians = sigmas->n; // Number of Gaussians395 int numGaussians = fwhms->n; // Number of Gaussians 394 396 int numGaussianVars = 0; // Number of Gaussian variant functions in the kernel 395 397 psString params = NULL; // List of params … … 397 399 int gaussOrder = orders->data.S32[i]; // Polynomial order to apply to Gaussian 398 400 numGaussianVars += (gaussOrder + 1) * (gaussOrder + 2) / 2; 399 psStringAppend(¶ms, "(%.2f,%d)", sigmas->data.F32[i], orders->data.S32[i]);401 psStringAppend(¶ms, "(%.2f,%d)", fwhms->data.F32[i], orders->data.S32[i]); 400 402 } 401 403 … … 419 421 // Set the Gaussian kernel parameters 420 422 for (int i = 0, index = 0; i < numGaussians; i++) { 421 float norm = 1.0 / (M_2_PI * sqrtf(sigmas->data.F32[i])); // Normalisation for Gaussian 423 float sigma = fwhms->data.F32[i] / (2.0 * sqrtf(2.0 * logf(2.0))); // Gaussian sigma 424 float norm = 1.0 / (M_2_PI * sqrtf(sigma)); // Normalisation for Gaussian 422 425 // Iterate over (u,v) order 423 426 for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) { … … 429 432 for (int u = -size; u <= size; u++) { 430 433 sum += preCalc->kernel[v][u] = norm * power(u, uOrder) * power(v, vOrder) * 431 expf(-0.5 * (PS_SQR(u) + PS_SQR(v)) / PS_SQR( sigmas->data.F32[i]));434 expf(-0.5 * (PS_SQR(u) + PS_SQR(v)) / PS_SQR(fwhms->data.F32[i])); 432 435 } 433 436 } … … 448 451 } 449 452 450 kernels->widths->data.F32[index] = sigmas->data.F32[i];453 kernels->widths->data.F32[index] = fwhms->data.F32[i]; 451 454 kernels->u->data.S32[index] = uOrder; 452 455 kernels->v->data.S32[index] = vOrder; … … 454 457 455 458 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d\n", index, 456 sigmas->data.F32[i], uOrder, vOrder);459 fwhms->data.F32[i], uOrder, vOrder); 457 460 } 458 461 } … … 616 619 617 620 pmSubtractionKernels *pmSubtractionKernelsGenerate(pmSubtractionKernelsType type, int size, int spatialOrder, 618 const psVector * sigmas, const psVector *orders, int inner,621 const psVector *fwhms, const psVector *orders, int inner, 619 622 int binning, int ringsOrder) 620 623 { … … 623 626 return pmSubtractionKernelsPOIS(size, spatialOrder); 624 627 case PM_SUBTRACTION_KERNEL_ISIS: 625 return pmSubtractionKernelsISIS(size, spatialOrder, sigmas, orders);628 return pmSubtractionKernelsISIS(size, spatialOrder, fwhms, orders); 626 629 case PM_SUBTRACTION_KERNEL_SPAM: 627 630 return pmSubtractionKernelsSPAM(size, spatialOrder, inner, binning); … … 629 632 return pmSubtractionKernelsFRIES(size, spatialOrder, inner); 630 633 case PM_SUBTRACTION_KERNEL_GUNK: 631 return pmSubtractionKernelsGUNK(size, spatialOrder, sigmas, orders, inner);634 return pmSubtractionKernelsGUNK(size, spatialOrder, fwhms, orders, inner); 632 635 case PM_SUBTRACTION_KERNEL_RINGS: 633 636 return pmSubtractionKernelsRINGS(size, ringsOrder, inner, spatialOrder);
Note:
See TracChangeset
for help on using the changeset viewer.
