summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cuda/3d/fdk.cu63
-rw-r--r--include/astra/cuda/3d/fdk.h4
2 files changed, 33 insertions, 34 deletions
diff --git a/cuda/3d/fdk.cu b/cuda/3d/fdk.cu
index 8aea84d..46c07e7 100644
--- a/cuda/3d/fdk.cu
+++ b/cuda/3d/fdk.cu
@@ -238,14 +238,39 @@ bool FDK_PreWeight(cudaPitchedPtr D_projData,
}
bool FDK_Filter(cudaPitchedPtr D_projData,
- cufftComplex * D_filter,
+ const float *pfFilter,
const SDimensions3D& dims)
{
-
// The filtering is a regular ramp filter per detector line.
+ // Generate filter
+ // TODO: Check errors
int iPaddedDetCount = calcNextPowerOfTwo(2 * dims.iProjU);
int iHalfFFTSize = astraCUDA::calcFFTFourierSize(iPaddedDetCount);
+
+
+ cufftComplex *pHostFilter = new cufftComplex[dims.iProjAngles * iHalfFFTSize];
+ memset(pHostFilter, 0, sizeof(cufftComplex) * dims.iProjAngles * iHalfFFTSize);
+
+ if (pfFilter == 0){
+ astraCUDA::genFilter(astra::FILTER_RAMLAK, 1.0f, dims.iProjAngles, pHostFilter, iPaddedDetCount, iHalfFFTSize);
+ } else {
+ for (int i = 0; i < dims.iProjAngles * iHalfFFTSize; i++) {
+ pHostFilter[i].x = pfFilter[i];
+ pHostFilter[i].y = 0;
+ }
+ }
+
+ cufftComplex * D_filter;
+
+ astraCUDA::allocateComplexOnDevice(dims.iProjAngles, iHalfFFTSize, &D_filter);
+ astraCUDA::uploadComplexArrayToDevice(dims.iProjAngles, iHalfFFTSize, pHostFilter, D_filter);
+
+ delete [] pHostFilter;
+
+
+
+
int projPitch = D_projData.pitch/sizeof(float);
@@ -277,6 +302,7 @@ bool FDK_Filter(cudaPitchedPtr D_projData,
}
astraCUDA::freeComplexOnDevice(D_sinoFFT);
+ astraCUDA::freeComplexOnDevice(D_filter);
return ok;
}
@@ -289,12 +315,6 @@ bool FDK(cudaPitchedPtr D_volumeData,
const float* pfFilter)
{
bool ok;
- // Generate filter
- // TODO: Check errors
- cufftComplex * D_filter;
- int iPaddedDetCount = calcNextPowerOfTwo(2 * dims.iProjU);
- int iHalfFFTSize = astraCUDA::calcFFTFourierSize(iPaddedDetCount);
-
// NB: We don't support arbitrary cone_vec geometries here.
// Only those that are vertical sub-geometries
@@ -335,33 +355,8 @@ bool FDK(cudaPitchedPtr D_volumeData,
return false;
#if 1
- cufftComplex *pHostFilter = new cufftComplex[dims.iProjAngles * iHalfFFTSize];
- memset(pHostFilter, 0, sizeof(cufftComplex) * dims.iProjAngles * iHalfFFTSize);
-
- if (pfFilter == 0){
- astraCUDA::genFilter(astra::FILTER_RAMLAK, 1.0f, dims.iProjAngles, pHostFilter, iPaddedDetCount, iHalfFFTSize);
- } else {
- for (int i = 0; i < dims.iProjAngles * iHalfFFTSize; i++) {
- pHostFilter[i].x = pfFilter[i];
- pHostFilter[i].y = 0;
- }
- }
-
-
- astraCUDA::allocateComplexOnDevice(dims.iProjAngles, iHalfFFTSize, &D_filter);
- astraCUDA::uploadComplexArrayToDevice(dims.iProjAngles, iHalfFFTSize, pHostFilter, D_filter);
-
- delete [] pHostFilter;
-
-
// Perform filtering
-
-
-
- ok = FDK_Filter(D_projData, D_filter, dims);
-
- // Clean up filter
- astraCUDA::freeComplexOnDevice(D_filter);
+ ok = FDK_Filter(D_projData, pfFilter, dims);
#endif
if (!ok)
diff --git a/include/astra/cuda/3d/fdk.h b/include/astra/cuda/3d/fdk.h
index 6f6e73b..3b1a9e1 100644
--- a/include/astra/cuda/3d/fdk.h
+++ b/include/astra/cuda/3d/fdk.h
@@ -39,6 +39,10 @@ bool FDK_PreWeight(cudaPitchedPtr D_projData,
bool bShortScan,
const SDimensions3D& dims, const float* angles);
+bool FDK_Filter(cudaPitchedPtr D_projData,
+ const float *pfFilter,
+ const SDimensions3D& dims);
+
bool FDK(cudaPitchedPtr D_volumeData,
cudaPitchedPtr D_projData,
const SConeProjection* angles,