X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=8674647146a8c4f64f160c4323ef7be974b304d9;hb=b3db4c787d9180525a56306d8e91553d81def8b8;hp=c0e48713d85d279b1820c35cfd8e50d9946a2b58;hpb=87f312d59cabca5080b481a20314601ea476c4be;p=ctsim.git diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index c0e4871..8674647 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: projections.cpp,v 1.83 2003/07/04 21:39:40 kevin Exp $ +** $Id$ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -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);