diff --git a/amodem/recv.py b/amodem/recv.py index b13be0f..f9c7ba8 100755 --- a/amodem/recv.py +++ b/amodem/recv.py @@ -212,16 +212,15 @@ def demodulate(symbols, filters, freqs, sampler): def receive(signal, freqs, gain=1.0): - signal = sigproc.FreqLoop(signal, freqs) - signal.sampler.gain = gain - symbols = iter(signal) + symbols = sigproc.Demux(signal, freqs) + symbols.sampler.gain = gain freq_err, offset_err = receive_prefix(symbols) - signal.sampler.offset -= offset_err - signal.sampler.freq -= freq_err + symbols.sampler.offset -= offset_err + symbols.sampler.freq -= freq_err filters = train_receiver(symbols, freqs) - data_bits = demodulate(symbols, filters, freqs, signal.sampler) + data_bits = demodulate(symbols, filters, freqs, symbols.sampler) return itertools.chain.from_iterable(data_bits) diff --git a/amodem/sigproc.py b/amodem/sigproc.py index 0d53e89..ea5c90e 100644 --- a/amodem/sigproc.py +++ b/amodem/sigproc.py @@ -1,6 +1,8 @@ import numpy as np from numpy import linalg -import itertools +import logging + +log = logging.getLogger(__name__) from . import sampling from . import common @@ -60,19 +62,21 @@ class QAM(object): yield self._dec[S] -class FreqLoop(object): +class Demux(object): def __init__(self, src, freqs): interp = sampling.Interpolator() self.sampler = sampling.Sampler(src, interp) - self.gens = [] - - samplers = itertools.tee(self.sampler, len(freqs)) - for freq, generator in zip(freqs, samplers): - gen = extract_symbols(generator, freq) - self.gens.append(gen) + self.filters = [exp_iwt(-f, Nsym) / (0.5*Nsym) for f in freqs] + self.filters = np.array(self.filters) def __iter__(self): - return common.izip(*self.gens) + return self + + def next(self): + frame = common.take(self.sampler, Nsym) + return np.dot(self.filters, frame) + + __next__ = next class MODEM(object): @@ -111,13 +115,6 @@ def coherence(x, freq): return 0.0 -def extract_symbols(x, freq, offset=0): - Hc = exp_iwt(-freq, Nsym) / (0.5*Nsym) - - for _, symbol in common.iterate(x, Nsym): - yield np.dot(Hc, symbol) - - def linear_regression(x, y): ''' Find (a,b) such that y = a*x + b. ''' x = np.array(x)