annotate base/LogRange.cpp @ 299:576be0d0d218

* Merge transform directory from sv-match-alignment branch (the previous comment included notes for this stuff, but I missed it in the actual merge) * Fix crash when a transform fails to create an output model and the thread that created the transform then deletes its input model thinking it's no longer needed, even though the transform run thread is still using it -- fix is to wait() on the transform before returning the null output model
author Chris Cannam
date Fri, 28 Sep 2007 16:15:06 +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 }