X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fprocsignal.cpp;fp=libctsim%2Fprocsignal.cpp;h=711307f1d88be1aa5887b09c490be997797c1a96;hp=c503096945d4dc48ca997eb32a1cd9fc818cb530;hb=663448e3173a19f054952806d8f8eca2fe59ec90;hpb=0f6257b32b46276415f1c6597fc1d992c3787071 diff --git a/libctsim/procsignal.cpp b/libctsim/procsignal.cpp index c503096..711307f 100644 --- a/libctsim/procsignal.cpp +++ b/libctsim/procsignal.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: procsignal.cpp,v 1.27 2001/03/01 07:30:49 kevin Exp $ +** $Id: procsignal.cpp,v 1.28 2001/03/13 14:53:44 kevin Exp $ ** ** 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 @@ -258,19 +258,7 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw if (m_idFilterGeneration == FILTER_GENERATION_DIRECT) { // calculate number of filter points with zeropadding - m_nFilterPoints = m_nSignalPoints; - if (m_iZeropad > 0) { - double logBase2 = log(m_nFilterPoints) / log(2); - int nextPowerOf2 = static_cast(floor(logBase2)); - if (logBase2 != floor(logBase2)) - nextPowerOf2++; - nextPowerOf2 += (m_iZeropad - 1); - m_nFilterPoints = 1 << nextPowerOf2; -#if defined(DEBUG) || defined(_DEBUG) - if (m_traceLevel >= Trace::TRACE_CONSOLE) - sys_error (ERR_TRACE, "nFilterPoints = %d", m_nFilterPoints); -#endif - } + m_nFilterPoints = addZeropadFactor (m_nSignalPoints, m_iZeropad); m_nOutputPoints = m_nFilterPoints * m_iPreinterpolationFactor; if (m_nFilterPoints % 2) { // Odd @@ -297,7 +285,7 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw dlgEZPlot.ShowModal(); } #endif - + // This works fairly well. I'm not sure why since scaling for geometries is done on // frequency filter rather than spatial filter as it should be. // It gives values slightly off than freq/inverse filtering @@ -329,9 +317,9 @@ ProcessSignal::init (const int idFilter, const int idFilterMethod, double dBandw dlgEZPlot.ShowModal(); } #endif - + // FILTERING: FREQUENCY - INVERSE FOURIER - + } else if (m_idFilterGeneration == FILTER_GENERATION_INVERSE_FOURIER) { // calculate number of filter points with zeropadding int nSpatialPoints = 2 * (m_nSignalPoints - 1) + 1; @@ -876,3 +864,17 @@ ProcessSignal::finiteFourierTransform (const std::complex input[], doubl } } + +int +ProcessSignal::addZeropadFactor (int n, int iZeropad) +{ + if (iZeropad > 0) { + double dLogBase2 = log(n) / log(2); + int iLogBase2 = static_cast(floor (dLogBase2)); + if (dLogBase2 != floor(dLogBase2)) + iLogBase2++; // raise up to next power of 2 + n = 1 << (iLogBase2 + (iZeropad - 1)); + } + + return n; +}