annotate data/model/PowerOfSqrtTwoZoomConstraint.cpp @ 1196:c7b9c902642f spectrogram-minor-refactor

Fix threshold in spectrogram -- it wasn't working in the last release. There is a new protocol for this. Formerly the threshold parameter had a range from -50dB to 0 with the default at -50, and -50 treated internally as "no threshold". However, there was a hardcoded, hidden internal threshold for spectrogram colour mapping at -80dB with anything below this being rounded to zero. Now the threshold parameter has range -81 to -1 with the default at -80, -81 is treated internally as "no threshold", and there is no hidden internal threshold. So the default behaviour is the same as before, an effective -80dB threshold, but it is now possible to change this in both directions. Sessions reloaded from prior versions may look slightly different because, if the session says there should be no threshold, there will now actually be no threshold instead of having the hidden internal one. Still need to do something in the UI to make it apparent that the -81dB setting removes the threshold entirely. This is at least no worse than the previous, also obscured, magic -50dB setting.
author Chris Cannam
date Mon, 01 Aug 2016 16:21:01 +0100
parents cc27f35aa75c
children d4a28d1479a8 48e9f538e6e9
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@147 7 This file copyright 2006 Chris Cannam.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@147 16 #include "PowerOfSqrtTwoZoomConstraint.h"
Chris@147 17
Chris@147 18 #include <iostream>
Chris@147 19 #include <cmath>
Chris@147 20
Chris@147 21
Chris@929 22 int
Chris@929 23 PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(int blockSize,
Chris@147 24 RoundingDirection dir) const
Chris@147 25 {
Chris@147 26 int type, power;
Chris@929 27 int rv = getNearestBlockSize(blockSize, type, power, dir);
Chris@147 28 return rv;
Chris@147 29 }
Chris@147 30
Chris@929 31 int
Chris@929 32 PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(int blockSize,
Chris@147 33 int &type,
Chris@147 34 int &power,
Chris@147 35 RoundingDirection dir) const
Chris@147 36 {
Chris@843 37 // cerr << "given " << blockSize << endl;
Chris@147 38
Chris@929 39 int minCachePower = getMinCachePower();
Chris@147 40
Chris@929 41 if (blockSize < (1 << minCachePower)) {
Chris@147 42 type = -1;
Chris@147 43 power = 0;
Chris@147 44 float val = 1.0, prevVal = 1.0;
Chris@147 45 while (val + 0.01 < blockSize) {
Chris@147 46 prevVal = val;
Chris@1038 47 val *= sqrtf(2.f);
Chris@147 48 }
Chris@929 49 int rval;
Chris@1038 50 if (dir == RoundUp) rval = int(val + 0.01f);
Chris@1038 51 else if (dir == RoundDown) rval = int(prevVal + 0.01f);
Chris@1038 52 else if (val - float(blockSize) <
Chris@1038 53 float(blockSize) - prevVal) rval = int(val + 0.01f);
Chris@929 54 else rval = int(prevVal + 0.01);
Chris@690 55 // SVDEBUG << "returning " << rval << endl;
Chris@147 56 return rval;
Chris@147 57 }
Chris@147 58
Chris@929 59 int prevBase = (1 << minCachePower);
Chris@929 60 int prevPower = minCachePower;
Chris@929 61 int prevType = 0;
Chris@147 62
Chris@929 63 int result = 0;
Chris@147 64
Chris@147 65 for (unsigned int i = 0; ; ++i) {
Chris@147 66
Chris@147 67 power = minCachePower + i/2;
Chris@147 68 type = i % 2;
Chris@147 69
Chris@929 70 int base;
Chris@147 71 if (type == 0) {
Chris@147 72 base = (1 << power);
Chris@147 73 } else {
Chris@608 74 base = (((unsigned int)((1 << minCachePower) * sqrt(2.) + 0.01))
Chris@147 75 << (power - minCachePower));
Chris@147 76 }
Chris@147 77
Chris@690 78 // SVDEBUG << "Testing base " << base << endl;
Chris@377 79
Chris@377 80 if (base == blockSize) {
Chris@377 81 result = base;
Chris@377 82 break;
Chris@377 83 }
Chris@377 84
Chris@377 85 if (base > blockSize) {
Chris@147 86 if (dir == RoundNearest) {
Chris@147 87 if (base - blockSize < blockSize - prevBase) {
Chris@147 88 dir = RoundUp;
Chris@147 89 } else {
Chris@147 90 dir = RoundDown;
Chris@147 91 }
Chris@147 92 }
Chris@147 93 if (dir == RoundUp) {
Chris@147 94 result = base;
Chris@147 95 break;
Chris@147 96 } else {
Chris@147 97 type = prevType;
Chris@147 98 power = prevPower;
Chris@147 99 result = prevBase;
Chris@147 100 break;
Chris@147 101 }
Chris@147 102 }
Chris@147 103
Chris@147 104 prevType = type;
Chris@147 105 prevPower = power;
Chris@147 106 prevBase = base;
Chris@147 107 }
Chris@147 108
Chris@147 109 if (result > getMaxZoomLevel()) result = getMaxZoomLevel();
Chris@147 110 return result;
Chris@147 111 }