tomwalters@397: /*! tomwalters@397: * \file tomwalters@397: * \brief Frequency scale for generating filter banks and their frequencies tomwalters@397: * tomwalters@397: * \author Willem van Engen tomwalters@397: * \date created 2006/09/28 tomwalters@397: * \version \$Id: Scale.cpp 459 2007-11-08 11:50:04Z tom $ tomwalters@397: */ tomwalters@397: /* (c) 2006, University of Cambridge, Medical Research Council tomwalters@397: * http://www.pdn.cam.ac.uk/groups/cnbh/aimmanual tomwalters@397: */ tom@399: #include "Support/Common.h" tom@399: #include "Modules/Output/Graphics/Scale/Scale.h" tom@399: #include "Modules/Output/Graphics/Scale/ScaleLinear.h" tom@399: #include "Modules/Output/Graphics/Scale/ScaleERB.h" tom@399: #include "Modules/Output/Graphics/Scale/ScaleLog.h" tom@399: #include "Modules/Output/Graphics/Scale/ScaleLogScaled.h" tomwalters@397: tom@400: namespace aimc { tom@400: tom@399: Scale *Scale::Create(ScaleType iType, tom@399: unsigned int min, tom@399: unsigned int max, tom@399: float density) { tomwalters@398: switch(iType) { tomwalters@398: case SCALE_LINEAR: tomwalters@398: return static_cast(new ScaleLinear(min, max, density)); tomwalters@398: case SCALE_ERB: tomwalters@398: return static_cast(new ScaleERB(min, max, density)); tomwalters@398: case SCALE_LOG: tomwalters@398: return static_cast(new ScaleLog(min, max, density)); tomwalters@398: case SCALE_LOGSCALED: tomwalters@398: return static_cast(new ScaleLogScaled(min, max, density)); tomwalters@398: default: tom@400: AIM_ASSERT(0); tomwalters@398: break; tomwalters@398: } tomwalters@398: // Unreachable code tom@400: AIM_ASSERT(0); tomwalters@398: return NULL; tomwalters@397: } tomwalters@397: tom@399: Scale *Scale::Create(ScaleType iType) { tomwalters@398: return Create(iType, 0, 0, 0); tomwalters@397: } tomwalters@397: tom@399: Scale *Scale::Clone() { tomwalters@398: Scale *pScale = Create(m_iType, m_iMin, m_iMax, m_fDensity); tom@399: AIM_ASSERT(pScale); tomwalters@398: pScale->m_fScaledCurHalfSum = m_fScaledCurHalfSum; tomwalters@398: pScale->m_fScaledCurDiff = m_fScaledCurDiff; tomwalters@398: return pScale; tomwalters@397: } tomwalters@397: tom@399: float Scale::FromLinearScaled(float fVal) { tomwalters@398: /*! This function returns tomwalters@398: * ( FromLinear(fVal) - (fMinScaled+fMaxScaled)/2 ) / (fMaxScaled-fMinScaled) tomwalters@398: */ tomwalters@398: float fValScaled = FromLinear(fVal); tomwalters@398: return (fValScaled - m_fScaledCurHalfSum) / m_fScaledCurDiff; tomwalters@397: } tom@399: tom@399: void Scale::FromLinearScaledExtrema(float fMin, float fMax) { tomwalters@398: float fMinScaled = FromLinear(fMin); tomwalters@398: float fMaxScaled = FromLinear(fMax); tomwalters@398: m_fScaledCurHalfSum = (fMinScaled+fMaxScaled)/2; tomwalters@398: m_fScaledCurDiff = fMaxScaled-fMinScaled; tomwalters@398: m_fMin = fMin; tomwalters@398: m_fMax = fMax; tomwalters@397: } tom@399: tom@399: void Scale::FromLinearScaledExtrema(Scale *pScale) { tom@400: AIM_ASSERT(pScale); tomwalters@398: FromLinearScaledExtrema(pScale->m_fMin, pScale->m_fMax); tomwalters@397: } tom@400: } // namespace aimc