annotate base/RangeMapper.cpp @ 498:fdf5930b7ccc

* Bring FeatureWriter and RDFFeatureWriter into the fold (from Runner) so that we can use them to export features from SV as well
author Chris Cannam
date Fri, 28 Nov 2008 13:47:11 +0000
parents 9525c9d7e54d
children bdc9bb371a9f
rev   line source
Chris@189 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@189 2
Chris@189 3 /*
Chris@189 4 Sonic Visualiser
Chris@189 5 An audio file viewer and annotation editor.
Chris@189 6 Centre for Digital Music, Queen Mary, University of London.
Chris@202 7 This file copyright 2006 QMUL.
Chris@189 8
Chris@189 9 This program is free software; you can redistribute it and/or
Chris@189 10 modify it under the terms of the GNU General Public License as
Chris@189 11 published by the Free Software Foundation; either version 2 of the
Chris@189 12 License, or (at your option) any later version. See the file
Chris@189 13 COPYING included with this distribution for more information.
Chris@189 14 */
Chris@189 15
Chris@189 16 #include "RangeMapper.h"
Chris@189 17
Chris@189 18 #include <cassert>
Chris@189 19 #include <cmath>
Chris@189 20
Chris@189 21 #include <iostream>
Chris@189 22
Chris@189 23 LinearRangeMapper::LinearRangeMapper(int minpos, int maxpos,
Chris@189 24 float minval, float maxval,
Chris@464 25 QString unit, bool inverted) :
Chris@189 26 m_minpos(minpos),
Chris@189 27 m_maxpos(maxpos),
Chris@189 28 m_minval(minval),
Chris@189 29 m_maxval(maxval),
Chris@464 30 m_unit(unit),
Chris@464 31 m_inverted(inverted)
Chris@189 32 {
Chris@189 33 assert(m_maxval != m_minval);
Chris@189 34 assert(m_maxpos != m_minpos);
Chris@189 35 }
Chris@189 36
Chris@189 37 int
Chris@189 38 LinearRangeMapper::getPositionForValue(float value) const
Chris@189 39 {
Chris@190 40 int position = m_minpos +
Chris@190 41 lrintf(((value - m_minval) / (m_maxval - m_minval))
Chris@190 42 * (m_maxpos - m_minpos));
Chris@189 43 if (position < m_minpos) position = m_minpos;
Chris@189 44 if (position > m_maxpos) position = m_maxpos;
Chris@241 45 // std::cerr << "LinearRangeMapper::getPositionForValue: " << value << " -> "
Chris@241 46 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
Chris@464 47 if (m_inverted) return m_maxpos - position;
Chris@464 48 else return position;
Chris@189 49 }
Chris@189 50
Chris@189 51 float
Chris@189 52 LinearRangeMapper::getValueForPosition(int position) const
Chris@189 53 {
Chris@464 54 if (m_inverted) position = m_maxpos - position;
Chris@190 55 float value = m_minval +
Chris@190 56 ((float(position - m_minpos) / float(m_maxpos - m_minpos))
Chris@190 57 * (m_maxval - m_minval));
Chris@189 58 if (value < m_minval) value = m_minval;
Chris@189 59 if (value > m_maxval) value = m_maxval;
Chris@241 60 // std::cerr << "LinearRangeMapper::getValueForPosition: " << position << " -> "
Chris@241 61 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
Chris@189 62 return value;
Chris@189 63 }
Chris@189 64
Chris@189 65 LogRangeMapper::LogRangeMapper(int minpos, int maxpos,
Chris@356 66 float minval, float maxval,
Chris@464 67 QString unit, bool inverted) :
Chris@189 68 m_minpos(minpos),
Chris@189 69 m_maxpos(maxpos),
Chris@464 70 m_unit(unit),
Chris@464 71 m_inverted(inverted)
Chris@189 72 {
Chris@356 73 convertMinMax(minpos, maxpos, minval, maxval, m_minlog, m_ratio);
Chris@356 74
Chris@356 75 std::cerr << "LogRangeMapper: minpos " << minpos << ", maxpos "
Chris@356 76 << maxpos << ", minval " << minval << ", maxval "
Chris@356 77 << maxval << ", minlog " << m_minlog << ", ratio " << m_ratio
Chris@356 78 << ", unit " << unit.toStdString() << std::endl;
Chris@356 79
Chris@189 80 assert(m_maxpos != m_minpos);
Chris@189 81
Chris@189 82 m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog;
Chris@189 83 }
Chris@189 84
Chris@356 85 void
Chris@356 86 LogRangeMapper::convertMinMax(int minpos, int maxpos,
Chris@356 87 float minval, float maxval,
Chris@356 88 float &minlog, float &ratio)
Chris@356 89 {
Chris@356 90 static float thresh = powf(10, -10);
Chris@356 91 if (minval < thresh) minval = thresh;
Chris@356 92 minlog = log10f(minval);
Chris@356 93 ratio = (maxpos - minpos) / (log10f(maxval) - minlog);
Chris@356 94 }
Chris@356 95
Chris@356 96 void
Chris@356 97 LogRangeMapper::convertRatioMinLog(float ratio, float minlog,
Chris@356 98 int minpos, int maxpos,
Chris@356 99 float &minval, float &maxval)
Chris@356 100 {
Chris@356 101 minval = powf(10, minlog);
Chris@356 102 maxval = powf(10, (maxpos - minpos) / ratio + minlog);
Chris@356 103 }
Chris@356 104
Chris@189 105 int
Chris@189 106 LogRangeMapper::getPositionForValue(float value) const
Chris@189 107 {
Chris@341 108 int position = (log10(value) - m_minlog) * m_ratio + m_minpos;
Chris@189 109 if (position < m_minpos) position = m_minpos;
Chris@189 110 if (position > m_maxpos) position = m_maxpos;
Chris@464 111 // std::cerr << "LogRangeMapper::getPositionForValue: " << value << " -> "
Chris@464 112 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
Chris@464 113 if (m_inverted) return m_maxpos - position;
Chris@464 114 else return position;
Chris@189 115 }
Chris@189 116
Chris@189 117 float
Chris@189 118 LogRangeMapper::getValueForPosition(int position) const
Chris@189 119 {
Chris@464 120 if (m_inverted) position = m_maxpos - position;
Chris@189 121 float value = powf(10, (position - m_minpos) / m_ratio + m_minlog);
Chris@464 122 // std::cerr << "LogRangeMapper::getValueForPosition: " << position << " -> "
Chris@464 123 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
Chris@189 124 return value;
Chris@189 125 }
Chris@189 126