diff --git a/amodem/dsp.py b/amodem/dsp.py index 60b4391..535e4df 100644 --- a/amodem/dsp.py +++ b/amodem/dsp.py @@ -112,9 +112,8 @@ class QAM(object): class Demux(object): - def __init__(self, src, freqs): - interp = sampling.Interpolator() - self.sampler = sampling.Sampler(src, interp) + def __init__(self, src, freqs, sampler=None): + self.sampler = sampling.Sampler(src) if sampler is None else sampler self.filters = [exp_iwt(-f, Nsym) / (0.5*Nsym) for f in freqs] self.filters = np.array(self.filters) diff --git a/amodem/recv.py b/amodem/recv.py index 79f62cc..83804bc 100644 --- a/amodem/recv.py +++ b/amodem/recv.py @@ -12,6 +12,7 @@ log = logging.getLogger(__name__) from . import stream from . import dsp +from . import sampling from . import train from . import common from . import config @@ -205,7 +206,8 @@ def demodulate(symbols, filters, freqs, sampler): def receive(signal, freqs, gain=1.0): - symbols = dsp.Demux(signal, freqs) + sampler = sampling.Sampler(signal, sampling.Interpolator()) + symbols = dsp.Demux(signal, freqs, sampler) symbols.sampler.gain = gain freq_err, offset_err = receive_prefix(symbols) diff --git a/amodem/sampling.py b/amodem/sampling.py index 2f52459..2936390 100644 --- a/amodem/sampling.py +++ b/amodem/sampling.py @@ -3,6 +3,8 @@ import numpy as np import itertools import logging +from amodem import common + log = logging.getLogger(__name__) @@ -26,22 +28,27 @@ class Interpolator(object): class Sampler(object): - def __init__(self, src, interp): + def __init__(self, src, interp=None): self.freq = 1.0 - self.interp = interp - self.resolution = self.interp.resolution - self.filt = self.interp.filt - self.width = self.interp.width - - # TODO: explain indices arithmetic - padding = [0.0] * self.interp.width - self.src = itertools.chain(padding, src) - self.offset = self.interp.width + 1 - self.buff = np.zeros(self.interp.coeff_len) - self.index = 0 self.gain = 1.0 + if interp is not None: + self.interp = interp + self.resolution = self.interp.resolution + self.filt = self.interp.filt + self.width = self.interp.width - def take(self, size): + # TODO: explain indices arithmetic + padding = [0.0] * self.interp.width + self.src = itertools.chain(padding, src) + self.offset = self.interp.width + 1 + self.buff = np.zeros(self.interp.coeff_len) + self.index = 0 + self.take = self._take + else: + # skip interpolation + self.take = lambda size: common.take(src, size) + + def _take(self, size): frame = np.zeros(size) count = 0 try: