Mercurial > hg > simscene-py
view nonExposed/adjustScaleForEBR.m @ 44:b7b1672b3c3b
Reading and writing of files now is done by soundfile since there seems to be a bug with writing .wav files with librosa (mplayer would play them as rubbish). Added soundfile as a requirement.
author | Emmanouil Theofanis Chourdakis <e.t.chourdakis@qmul.ac.uk> |
---|---|
date | Mon, 09 Oct 2017 11:55:03 +0100 |
parents | b1901e8d8f5f |
children |
line wrap: on
line source
function scale = adjustScaleForEBR (fg, bg, offset, targetEBR, snrType, eps) % Computes the value of 'scale' such that fg*scale has a given EBR % relatively to bg at position 'offset'. % ebrType is used to select what kind of EBR should be considered: % 1 - standard temporal ebr over whole length of sample % 2 - max of standard temporal ebr over 1/4s windows % 3 - more to come ? % eps is the epsilon used to check for convergence; optional, defaults to % 0.01 % This program was written by Mathias Rossignol & Grégoire Lafay % is Copyright (C) 2015 IRCAM <http://www.ircam.fr> % % This program is free software: you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by the Free % Software Foundation, either version 3 of the License, or (at your option) % any later version. % % This program is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY % or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License % for more details. % % You should have received a copy of the GNU General Public License along % with this program. If not, see <http://www.gnu.org/licenses/>. if (nargin == 5) eps = 0.01; end %if (targetSNR <= 0) targetSNR = exp(targetSNR); end prevScale = 1; scale = 1; ebrFunc=@ebr; if (snrType==2) ebrFunc=@maxWindowEBR; end count = 0; while (ebrFunc(fg, bg, offset, scale) > targetEBR && count < 100) prevScale = scale; scale = scale/2; count = count+1; end if (count == 100) msg = ['Max count, stage 1, scale = ', num2str(scale), ' - ', num2str(ebrFunc(fg, bg, offset, scale)), ' - ', num2str(ebrFunc(fg, bg, offset, prevScale)), ' - ', num2str(ebrFunc(fg, bg, offset, 1))]; error(msg) end count=0; while (ebrFunc(fg, bg, offset, scale) < targetEBR && count < 100) prevScale = scale; scale = scale*2; count = count+1; end if (count == 100) msg = ['Max count, stage 2, scale = ', num2str(scale)]; error(msg) end count=0; if (scale<prevScale) a = scale; b = prevScale; else a=prevScale; b=scale; end delta = ebrFunc(fg, bg, offset, (a+b)/2) - targetEBR; while (abs(delta) > eps && count < 100) if (delta>0) b = (a+b)/2; else a = (a+b)/2; end delta = ebrFunc(fg, bg, offset, (a+b)/2) - targetEBR; count = count+1; end if (count == 100) msg = ['Max count, stage 3, scale = ', num2str(a)]; error(msg) end scale = (a+b)/2; end