summaryrefslogtreecommitdiffstats
path: root/cuda/3d
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2017-11-30 16:59:18 +0100
committerWillem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>2017-12-20 17:25:46 +0100
commit9fa2ffdc5348f8f19de48d06a72b82bdc1ba8f22 (patch)
treee4cda472fcd4213395829b3849e3163942c6c16b /cuda/3d
parent52ebf0670ae39abea04344c32a1dc054c6816a03 (diff)
downloadastra-9fa2ffdc5348f8f19de48d06a72b82bdc1ba8f22.tar.gz
astra-9fa2ffdc5348f8f19de48d06a72b82bdc1ba8f22.tar.bz2
astra-9fa2ffdc5348f8f19de48d06a72b82bdc1ba8f22.tar.xz
astra-9fa2ffdc5348f8f19de48d06a72b82bdc1ba8f22.zip
Start on fixing FDK and BP voxel-size weighting factors
Diffstat (limited to 'cuda/3d')
-rw-r--r--cuda/3d/cone_bp.cu6
-rw-r--r--cuda/3d/fdk.cu23
-rw-r--r--cuda/3d/fdk.h3
3 files changed, 23 insertions, 9 deletions
diff --git a/cuda/3d/cone_bp.cu b/cuda/3d/cone_bp.cu
index 02242b0..aff0834 100644
--- a/cuda/3d/cone_bp.cu
+++ b/cuda/3d/cone_bp.cu
@@ -266,7 +266,11 @@ bool ConeBP_Array(cudaPitchedPtr D_volumeData,
{
bindProjDataTexture(D_projArray);
- float fOutputScale = params.fOutputScale * params.fVolScaleX * params.fVolScaleY * params.fVolScaleZ;
+ float fOutputScale;
+ if (params.bFDKWeighting)
+ fOutputScale = params.fOutputScale / (params.fVolScaleX * params.fVolScaleY * params.fVolScaleZ);
+ else
+ fOutputScale = params.fOutputScale * (params.fVolScaleX * params.fVolScaleY * params.fVolScaleZ);
for (unsigned int th = 0; th < dims.iProjAngles; th += g_MaxAngles) {
unsigned int angleCount = g_MaxAngles;
diff --git a/cuda/3d/fdk.cu b/cuda/3d/fdk.cu
index 27357ad..0630afe 100644
--- a/cuda/3d/fdk.cu
+++ b/cuda/3d/fdk.cu
@@ -59,7 +59,7 @@ __constant__ float gC_angle[g_MaxAngles];
// per-detector u/v shifts?
-__global__ void devFDK_preweight(void* D_projData, unsigned int projPitch, unsigned int startAngle, unsigned int endAngle, float fSrcOrigin, float fDetOrigin, float fZShift, float fDetUSize, float fDetVSize, const SDimensions3D dims)
+__global__ void devFDK_preweight(void* D_projData, unsigned int projPitch, unsigned int startAngle, unsigned int endAngle, float fSrcOrigin, float fDetOrigin, float fZShift, float fDetUSize, float fDetVSize, float fVoxSize, const SDimensions3D dims)
{
float* projData = (float*)D_projData;
int angle = startAngle + blockIdx.y * g_anglesPerWeightBlock + threadIdx.y;
@@ -83,10 +83,17 @@ __global__ void devFDK_preweight(void* D_projData, unsigned int projPitch, unsig
float fV = (startDetectorV - 0.5f*dims.iProjV + 0.5f) * fDetVSize + fZShift;
- //const float fW = fCentralRayLength;
- //const float fW = fCentralRayLength * (M_PI / 2.0f) / (float)dims.iProjAngles;
+ // Four contributions to the weighting factors:
+ // fCentralRayLength / fRayLength : the main FDK preweighting factor
+ // fSrcOrigin / (fDetUSize * fCentralRayLength)
+ // : to adjust the filter to the det width
+ // || u v s || ^ 2 : see cone_bp.cu, FDKWEIGHT
+ // pi / (2 * iProjAngles) : scaling of the integral over angles
+
const float fW1 = fSrcOrigin * fDetUSize * fDetVSize;
- const float fW = fCentralRayLength * fW1 * fW1 * (M_PI / 2.0f) / (float)dims.iProjAngles;
+ const float fW2 = fCentralRayLength / (fDetUSize * fSrcOrigin);
+ const float fW3 = fVoxSize * fVoxSize;
+ const float fW = fCentralRayLength * fW1 * fW1 * fW2 * fW3 * (M_PI / 2.0f) / (float)dims.iProjAngles;
for (int detectorV = startDetectorV; detectorV < endDetectorV; ++detectorV)
{
@@ -156,7 +163,8 @@ __global__ void devFDK_ParkerWeight(void* D_projData, unsigned int projPitch, un
bool FDK_PreWeight(cudaPitchedPtr D_projData,
float fSrcOrigin, float fDetOrigin,
float fZShift,
- float fDetUSize, float fDetVSize, bool bShortScan,
+ float fDetUSize, float fDetVSize, float fVoxSize,
+ bool bShortScan,
const SDimensions3D& dims, const float* angles)
{
// The pre-weighting factor for a ray is the cosine of the angle between
@@ -168,7 +176,7 @@ bool FDK_PreWeight(cudaPitchedPtr D_projData,
int projPitch = D_projData.pitch/sizeof(float);
- devFDK_preweight<<<dimGrid, dimBlock>>>(D_projData.ptr, projPitch, 0, dims.iProjAngles, fSrcOrigin, fDetOrigin, fZShift, fDetUSize, fDetVSize, dims);
+ devFDK_preweight<<<dimGrid, dimBlock>>>(D_projData.ptr, projPitch, 0, dims.iProjAngles, fSrcOrigin, fDetOrigin, fZShift, fDetUSize, fDetVSize, fVoxSize, dims);
cudaTextForceKernelsCompletion();
@@ -310,8 +318,9 @@ bool FDK(cudaPitchedPtr D_volumeData,
#if 1
+ // NB: assuming cube voxels (params.fVolScaleX)
ok = FDK_PreWeight(D_projData, fSrcOrigin, fDetOrigin,
- fZShift, fDetUSize, fDetVSize,
+ fZShift, fDetUSize, fDetVSize, params.fVolScaleX,
bShortScan, dims, pfAngles);
#else
ok = true;
diff --git a/cuda/3d/fdk.h b/cuda/3d/fdk.h
index 0165af9..0f8d871 100644
--- a/cuda/3d/fdk.h
+++ b/cuda/3d/fdk.h
@@ -35,7 +35,8 @@ namespace astraCUDA3d {
bool FDK_PreWeight(cudaPitchedPtr D_projData,
float fSrcOrigin, float fDetOrigin,
float fZShift,
- float fDetUSize, float fDetVSize, bool bShortScan,
+ float fDetUSize, float fDetVSize, float fVoxSize,
+ bool bShortScan,
const SDimensions3D& dims, const float* angles);
bool FDK(cudaPitchedPtr D_volumeData,