X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=8674647146a8c4f64f160c4323ef7be974b304d9;hp=871f62e6e52a4543df9262355872d3b22957f392;hb=d42d3d062dd1aca92b5a2552a1f474aab0bee610;hpb=c64771ab78d25f0cbfbaac2456c8790c786a7a68 diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index 871f62e..8674647 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -1019,12 +1019,12 @@ Projections::convertFFTPolar (ImageFile& rIF, int iInterpolationID, int iZeropad int iInterpDet = static_cast(static_cast(sqrt(nx*nx+ny*ny))); int iNumInterpDetWithZeros = ProcessSignal::addZeropadFactor (iInterpDet, iZeropad); - double dProjScale = iInterpDet / (pProj->viewDiameter() * 0.5); + double dProjScale = iInterpDet / (pProj->viewDiameter() * 0.05); double dZeropadRatio = static_cast(iNumInterpDetWithZeros) / static_cast(iInterpDet); - fftw_plan plan = fftw_create_plan (iNumInterpDetWithZeros, FFTW_FORWARD, FFTW_IN_PLACE | FFTW_ESTIMATE | FFTW_USE_WISDOM); + fftw_complex* pcIn = static_cast (fftw_malloc (sizeof(fftw_complex) * iNumInterpDetWithZeros)); + fftw_plan plan = fftw_plan_dft_1d (iNumInterpDetWithZeros, pcIn, pcIn, FFTW_FORWARD, FFTW_ESTIMATE); - fftw_complex* pcIn = new fftw_complex [iNumInterpDetWithZeros]; std::complex** ppcDetValue = new std::complex* [pProj->m_nView]; //double dInterpScale = (pProj->m_nDet-1) / static_cast(iInterpDet-1); double dInterpScale = pProj->m_nDet / static_cast(iInterpDet); @@ -1040,28 +1040,30 @@ Projections::convertFFTPolar (ImageFile& rIF, int iInterpolationID, int iZeropad LinearInterpolator projInterp (detval, pProj->m_nDet); for (int iDet = 0; iDet < iInterpDet; iDet++) { double dInterpPos = (m_nDet / 2.) + (iDet - dMidPoint) * dInterpScale; - pcIn[iDet].re = projInterp.interpolate (dInterpPos) * dProjScale; - pcIn[iDet].im = 0; + pcIn[iDet][0] = projInterp.interpolate (dInterpPos) * dProjScale; + pcIn[iDet][1] = 0; } Fourier::shuffleFourierToNaturalOrder (pcIn, iInterpDet); if (iZerosAdded > 0) { - for (int iDet1 = iInterpDet -1; iDet1 >= iMidPoint; iDet1--) - pcIn[iDet1+iZerosAdded] = pcIn[iDet1]; + for (int iDet1 = iInterpDet -1; iDet1 >= iMidPoint; iDet1--) { + pcIn[iDet1+iZerosAdded][0] = pcIn[iDet1][0]; + pcIn[iDet1+iZerosAdded][1] = pcIn[iDet1][1]; + } for (int iDet2 = iMidPoint; iDet2 < iMidPoint + iZerosAdded; iDet2++) - pcIn[iDet2].re = pcIn[iDet2].im = 0; + pcIn[iDet2][0] = pcIn[iDet2][1] = 0; } - fftw_one (plan, pcIn, NULL); + fftw_execute (plan); ppcDetValue[iView] = new std::complex [iNumInterpDetWithZeros]; for (int iD = 0; iD < iNumInterpDetWithZeros; iD++) { - ppcDetValue[iView][iD] = std::complex (pcIn[iD].re * dFFTScale, pcIn[iD].im * dFFTScale); + ppcDetValue[iView][iD] = std::complex (pcIn[iD][0] * dFFTScale, pcIn[iD][1] * dFFTScale); } Fourier::shuffleFourierToNaturalOrder (ppcDetValue[iView], iNumInterpDetWithZeros); } - delete [] pcIn; + fftw_free(pcIn) ; fftw_destroy_plan (plan);