annotate base/LogRange.cpp @ 400:78dd9b35559b

* transform operator<
author Chris Cannam
date Thu, 03 Apr 2008 08:30:25 +0000
parents 2268963dabd1
children 9525c9d7e54d
rev   line source
Chris@224 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@224 2
Chris@224 3 /*
Chris@224 4 Sonic Visualiser
Chris@224 5 An audio file viewer and annotation editor.
Chris@224 6 Centre for Digital Music, Queen Mary, University of London.
Chris@224 7 This file copyright 2006 Chris Cannam.
Chris@224 8
Chris@224 9 This program is free software; you can redistribute it and/or
Chris@224 10 modify it under the terms of the GNU General Public License as
Chris@224 11 published by the Free Software Foundation; either version 2 of the
Chris@224 12 License, or (at your option) any later version. See the file
Chris@224 13 COPYING included with this distribution for more information.
Chris@224 14 */
Chris@224 15
Chris@224 16 #include "LogRange.h"
Chris@224 17
Chris@224 18 #include <algorithm>
Chris@224 19 #include <cmath>
Chris@224 20
Chris@224 21 void
Chris@224 22 LogRange::mapRange(float &min, float &max, float logthresh)
Chris@224 23 {
Chris@224 24 if (min > max) std::swap(min, max);
Chris@224 25 if (max == min) max = min + 1;
Chris@224 26
Chris@224 27 if (min >= 0.f) {
Chris@224 28
Chris@224 29 max = log10f(max); // we know max != 0
Chris@224 30
Chris@224 31 if (min == 0.f) min = std::min(logthresh, max);
Chris@224 32 else min = log10f(min);
Chris@224 33
Chris@224 34 } else if (max <= 0.f) {
Chris@224 35
Chris@224 36 min = log10f(-min); // we know min != 0
Chris@224 37
Chris@224 38 if (max == 0.f) max = std::min(logthresh, min);
Chris@224 39 else max = log10f(-max);
Chris@224 40
Chris@224 41 std::swap(min, max);
Chris@224 42
Chris@224 43 } else {
Chris@224 44
Chris@224 45 // min < 0 and max > 0
Chris@224 46
Chris@224 47 max = log10f(std::max(max, -min));
Chris@224 48 min = std::min(logthresh, max);
Chris@224 49 }
Chris@224 50
Chris@224 51 if (min == max) min = max - 1;
Chris@224 52 }
Chris@224 53
Chris@224 54 float
Chris@224 55 LogRange::map(float value, float thresh)
Chris@224 56 {
Chris@224 57 if (value == 0.f) return thresh;
Chris@224 58 return log10f(fabsf(value));
Chris@224 59 }
Chris@224 60
Chris@266 61 float
Chris@266 62 LogRange::unmap(float value)
Chris@266 63 {
Chris@266 64 return powf(10.0, value);
Chris@266 65 }