From 238a79d88e2fea1566d7b6dac50c92453d7afc61 Mon Sep 17 00:00:00 2001 From: Thomas Fillon Date: Wed, 19 Mar 2014 17:55:57 +0100 Subject: [PATCH] Level analyzer : fix Inf issue --- tests/test_analyzer_level.py | 2 +- timeside/analyzer/level.py | 16 +++++++++++----- timeside/analyzer/utils.py | 7 +++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tests/test_analyzer_level.py b/tests/test_analyzer_level.py index 02fb856..936cb16 100755 --- a/tests/test_analyzer_level.py +++ b/tests/test_analyzer_level.py @@ -22,7 +22,7 @@ class TestAnalyzerLevel(unittest.TestCase): "runs on guitar" self.source = os.path.join (os.path.dirname(__file__), "samples", "guitar.wav") - max_level_value = -4.258 + max_level_value = -4.054 rms_level_value = -21.945 self.expected = {'level.max':max_level_value , 'level.rms':rms_level_value } diff --git a/timeside/analyzer/level.py b/timeside/analyzer/level.py index 6b39fa4..540cd2f 100644 --- a/timeside/analyzer/level.py +++ b/timeside/analyzer/level.py @@ -24,7 +24,7 @@ from timeside.core import implements, interfacedoc from timeside.analyzer.core import Analyzer from timeside.api import IValueAnalyzer import numpy as np - +from .utils import MACHINE_EPSILON class Level(Analyzer): """RMS level analyzer""" @@ -62,7 +62,7 @@ class Level(Analyzer): self.max_value = max_value # rms_level self.mean_values = np.append(self.mean_values, - np.mean(np.square(frames))) + np.mean(np.square(frames))) return frames, eod def post_process(self): @@ -72,6 +72,9 @@ class Level(Analyzer): max_level.id_metadata.id += '.' + "max" max_level.id_metadata.name += ' ' + "Max" + if self.max_value == 0: # Prevent np.log10(0) = Inf + self.max_value = MACHINE_EPSILON + max_level.data_object.value = np.round(20*np.log10(self.max_value), 3) self.process_pipe.results.add(max_level) @@ -80,7 +83,10 @@ class Level(Analyzer): rms_level.id_metadata.id += '.' + "rms" rms_level.id_metadata.name += ' ' + "RMS" - rms_level.data_object.value = np.round(20*np.log10( - np.sqrt(np.mean(self.mean_values))), 3) - self.process_pipe.results.add(rms_level) + rms_val = np.sqrt(np.mean(self.mean_values)) + if rms_val == 0: + rms_val = MACHINE_EPSILON + + rms_level.data_object.value = np.round(20*np.log10(rms_val), 3) + self.process_pipe.results.add(rms_level) diff --git a/timeside/analyzer/utils.py b/timeside/analyzer/utils.py index 6299a9c..6b03306 100644 --- a/timeside/analyzer/utils.py +++ b/timeside/analyzer/utils.py @@ -21,6 +21,8 @@ import numpy as np +MACHINE_EPSILON = np.finfo(np.float32).eps + def downsample_blocking(frames, hop_s, dtype='float32'): # downmixing to one channel if len(frames.shape) != 1: @@ -53,15 +55,12 @@ def computeModulation(serie, wLen, withLog=True): modul = np.zeros((sLen,)) w = int(wLen/2) - if withLog: - machine_epsilon = np.finfo(np.float32).eps - for i in range(w, sLen-w): d = serie[i-w:i+w] if withLog: if not (d > 0).all(): - d[d <= 0] = machine_epsilon # prevent log(0)=inf + d[d <= 0] = MACHINE_EPSILON # prevent log(0)=inf d = np.log(d) modul[i] = np.var(d) -- 2.39.5