From 355b5eca444d5ee61d6d6055c3a98466d8d729ae Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Sat, 9 Aug 2014 11:03:13 +0300 Subject: [PATCH] optimize sampler to apply demuxing at symbols rate --- amodem/sampling.py | 32 ++++++++++++++++---------------- amodem/sigproc.py | 2 +- tests/test_sampling.py | 4 ++-- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/amodem/sampling.py b/amodem/sampling.py index 541c423..a985c3e 100755 --- a/amodem/sampling.py +++ b/amodem/sampling.py @@ -43,25 +43,25 @@ class Sampler(object): self.index = 0 self.gain = 1.0 - def __iter__(self): - return self + def take(self, size): + frame = np.zeros(size) - def next(self): - offset = self.offset - # offset = k + (j / self.resolution) - k = int(offset) # integer part - j = int((offset - k) * self.resolution) # fractional part - coeffs = self.filt[j] - end = k + self.width - while self.index < end: - self.buff[:-1] = self.buff[1:] - self.buff[-1] = next(self.src) # throws StopIteration - self.index += 1 + for frame_index in range(size): + offset = self.offset + # offset = k + (j / self.resolution) + k = int(offset) # integer part + j = int((offset - k) * self.resolution) # fractional part + coeffs = self.filt[j] + end = k + self.width + while self.index < end: + self.buff[:-1] = self.buff[1:] + self.buff[-1] = next(self.src) # throws StopIteration + self.index += 1 - self.offset += self.freq - return np.dot(coeffs, self.buff) * self.gain + self.offset += self.freq + frame[frame_index] = np.dot(coeffs, self.buff) * self.gain - __next__ = next + return frame if __name__ == '__main__': diff --git a/amodem/sigproc.py b/amodem/sigproc.py index ea5c90e..2e68cde 100644 --- a/amodem/sigproc.py +++ b/amodem/sigproc.py @@ -73,7 +73,7 @@ class Demux(object): return self def next(self): - frame = common.take(self.sampler, Nsym) + frame = self.sampler.take(size=Nsym) return np.dot(self.filters, frame) __next__ = next diff --git a/tests/test_sampling.py b/tests/test_sampling.py index 1a0620c..238cdc7 100644 --- a/tests/test_sampling.py +++ b/tests/test_sampling.py @@ -4,8 +4,8 @@ import numpy as np def test_resample(): x = np.arange(300) - s = sampling.Sampler(x) - y = np.array(list(s)) + s = sampling.Sampler(x, interp=sampling.Interpolator()) + y = s.take(len(x) - s.interp.width - 1) err = x[1:len(y)+1] - y assert np.max(np.abs(err)) < 1e-10