]> git.parisson.com Git - timeside.git/commitdiff
Level analyzer : fix Inf issue
authorThomas Fillon <thomas@parisson.com>
Wed, 19 Mar 2014 16:55:57 +0000 (17:55 +0100)
committerThomas Fillon <thomas@parisson.com>
Wed, 19 Mar 2014 16:55:57 +0000 (17:55 +0100)
tests/test_analyzer_level.py
timeside/analyzer/level.py
timeside/analyzer/utils.py

index 02fb856abf45a84061c9a5b94c99eeda801521d3..936cb1609a9022785473dc5475bd4f4be2be8ef3 100755 (executable)
@@ -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 }
index 6b39fa441438a30d805d775f897410540b22f7e2..540cd2fb5d0b27eec672bfc55dd1f4be9f43a647 100644 (file)
@@ -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)
index 6299a9c7b586fb3685c3bdfe1771a262a037fc96..6b033068ce7fa2d5a5f885dd3a70bdb1310e0e85 100644 (file)
@@ -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)