From 72f30c695944832793639e463f01815a30b7dab2 Mon Sep 17 00:00:00 2001 From: Thomas Fillon Date: Mon, 30 Jun 2014 12:33:49 +0200 Subject: [PATCH] feature(ProcessPipe): Add a method for a processor to overwrite the source samplerate --- tests/test_graphers_render_analyzers.py | 3 ++- timeside/analyzer/limsi_sad.py | 8 ++++---- timeside/analyzer/spectrogram.py | 7 ++++--- timeside/core.py | 27 +++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/tests/test_graphers_render_analyzers.py b/tests/test_graphers_render_analyzers.py index 9fa7ea5..1819f64 100644 --- a/tests/test_graphers_render_analyzers.py +++ b/tests/test_graphers_render_analyzers.py @@ -38,7 +38,8 @@ class Test_graphers_analyzers(unittest.TestCase): def tearDown(self): # Clean-up : delete temp file - os.unlink(self.temp_file.name) + if not PLOT: + os.unlink(self.temp_file.name) def _tests_factory(grapher_analyzers): diff --git a/timeside/analyzer/limsi_sad.py b/timeside/analyzer/limsi_sad.py index dff1b02..a0ab0cd 100644 --- a/timeside/analyzer/limsi_sad.py +++ b/timeside/analyzer/limsi_sad.py @@ -115,11 +115,11 @@ class LimsiSad(Analyzer): # return the unit of the data dB, St, ... return "Log Probability difference" + @property + def force_samplerate(self): + return 16000 + def process(self, frames, eod=False): - if self.input_samplerate != 16000: - raise Exception( - '%s requires 16000 input sample rate: %d provided' % - (self.__class__.__name__, self.input_samplerate)) return frames, eod def post_process(self): diff --git a/timeside/analyzer/spectrogram.py b/timeside/analyzer/spectrogram.py index f96064a..a2c241e 100644 --- a/timeside/analyzer/spectrogram.py +++ b/timeside/analyzer/spectrogram.py @@ -77,7 +77,8 @@ class Spectrogram(Analyzer): spectrogram = self.new_result(data_mode='value', time_mode='framewise') spectrogram.parameters = {'FFT_SIZE': self.FFT_SIZE} spectrogram.data_object.value = self.values - spectrogram.data_object.y_value = np.arange(0, self.samplerate() / 2, - self.samplerate() / - self.FFT_SIZE) + nb_freq = spectrogram.data_object.value.shape[1] + spectrogram.data_object.y_value = (np.arange(0, nb_freq) * + self.samplerate() / self.FFT_SIZE) + self.process_pipe.results.add(spectrogram) diff --git a/timeside/core.py b/timeside/core.py index d821225..dfd9c23 100644 --- a/timeside/core.py +++ b/timeside/core.py @@ -109,6 +109,14 @@ class Processor(Component): if not hasattr(self, 'input_stepsize'): self.input_stepsize = self.source_blocksize + # Check samplerate specification if any + if self.force_samplerate: + if self.input_samplerate != self.force_samplerate: + raise ValueError( + '%s requires %d input sample rate: %d provided' % + (self.__class__.__name__, self.force_samplerate, + self.input_samplerate)) + # default channels(), samplerate() and blocksize() implementations returns # the source characteristics, but processors may change this behaviour by # overloading those methods @@ -148,6 +156,10 @@ class Processor(Component): def uuid(self): return str(self.UUID) + @property + def force_samplerate(self): + return None + def __del__(self): self.release() @@ -302,6 +314,21 @@ class ProcessPipe(object): source = self.processors[0] items = self.processors[1:] + + # Check if any processor in items need to force the asmplerate + force_samplerate = set([item.force_samplerate for item in items + if item.force_samplerate]) + if force_samplerate: + if len(force_samplerate) > 1: + raise(ValueError, + "Some processors specify different samplerate") + force_samplerate = force_samplerate.pop() + + if samplerate and samplerate != force_samplerate: + raise(ValueError, "A processor try to force the samplerate") + + samplerate = force_samplerate + source.setup(channels=channels, samplerate=samplerate, blocksize=blocksize) source.SIG_STOP = False -- 2.39.5