diff --git a/amodem/detect.py b/amodem/detect.py index ef08a07..d53a549 100644 --- a/amodem/detect.py +++ b/amodem/detect.py @@ -6,7 +6,7 @@ import collections log = logging.getLogger(__name__) from . import dsp -from . import train +from . import equalizer from . import common @@ -14,7 +14,7 @@ class Detector(object): COHERENCE_THRESHOLD = 0.9 - CARRIER_DURATION = sum(train.prefix) + CARRIER_DURATION = sum(equalizer.prefix) CARRIER_THRESHOLD = int(0.9 * CARRIER_DURATION) SEARCH_WINDOW = int(0.1 * CARRIER_DURATION) diff --git a/amodem/equalizer.py b/amodem/equalizer.py index 5189684..9d4bb46 100644 --- a/amodem/equalizer.py +++ b/amodem/equalizer.py @@ -58,3 +58,8 @@ def train(signal, expected, order, lookahead=0): h = lstsq(A, b)[0] h = h[::-1].real return h + + +prefix = [1]*400 + [0]*50 +equalizer_length = 500 +silence_length = 100 diff --git a/amodem/recv.py b/amodem/recv.py index f52ec7d..d084729 100644 --- a/amodem/recv.py +++ b/amodem/recv.py @@ -9,7 +9,6 @@ log = logging.getLogger(__name__) from . import stream from . import dsp from . import sampling -from . import train from . import common from . import framing from . import equalizer @@ -33,7 +32,7 @@ class Receiver(object): self.output_size = 0 # number of bytes written to output stream def _prefix(self, symbols, gain=1.0, skip=5): - S = common.take(symbols, len(train.prefix)) + S = common.take(symbols, len(equalizer.prefix)) S = S[:, self.carrier_index] * gain sliced = np.round(np.abs(S)) self.plt.figure() @@ -43,13 +42,13 @@ class Receiver(object): bits = np.array(sliced, dtype=int) self.plt.subplot(122) self.plt.plot(np.abs(S)) - self.plt.plot(train.prefix) - if any(bits != train.prefix): + self.plt.plot(equalizer.prefix) + if any(bits != equalizer.prefix): raise ValueError('Incorrect prefix') log.debug('Prefix OK') - nonzeros = np.array(train.prefix, dtype=bool) + nonzeros = np.array(equalizer.prefix, dtype=bool) pilot_tone = S[nonzeros] phase = np.unwrap(np.angle(pilot_tone)) / (2 * np.pi) indices = np.arange(len(phase)) @@ -68,11 +67,12 @@ class Receiver(object): def _train(self, sampler, order, lookahead): Nfreq = len(self.frequencies) - train_symbols = self.equalizer.train_symbols(train.equalizer_length) + equalizer_length = equalizer.equalizer_length + train_symbols = self.equalizer.train_symbols(equalizer_length) train_signal = self.equalizer.modulator(train_symbols) * Nfreq - prefix = postfix = train.silence_length * self.Nsym - signal_length = train.equalizer_length * self.Nsym + prefix + postfix + prefix = postfix = equalizer.silence_length * self.Nsym + signal_length = equalizer_length * self.Nsym + prefix + postfix signal = sampler.take(signal_length + lookahead) @@ -92,7 +92,8 @@ class Receiver(object): return equalization_filter def _verify_training(self, equalized, train_symbols): - symbols = self.equalizer.demodulator(equalized, train.equalizer_length) + equalizer_length = equalizer.equalizer_length + symbols = self.equalizer.demodulator(equalized, equalizer_length) sliced = np.array(symbols).round() errors = np.array(sliced - train_symbols, dtype=np.bool) error_rate = errors.sum() / errors.size diff --git a/amodem/send.py b/amodem/send.py index 5daf9b6..c2859ab 100644 --- a/amodem/send.py +++ b/amodem/send.py @@ -4,8 +4,6 @@ import itertools log = logging.getLogger(__name__) -from . import train - from . import common from . import stream from . import framing @@ -20,7 +18,7 @@ class Sender(object): self.modem = dsp.MODEM(config.symbols) self.carriers = config.carriers / config.Nfreq self.pilot = config.carriers[config.carrier_index] - self.silence = np.zeros(train.silence_length * config.Nsym) + self.silence = np.zeros(equalizer.silence_length * config.Nsym) self.iters_per_report = config.baud # report once per second self.padding = [0] * config.bits_per_baud self.equalizer = equalizer.Equalizer(config) @@ -32,10 +30,10 @@ class Sender(object): self.offset += len(sym) def start(self): - for value in train.prefix: + for value in equalizer.prefix: self.write(self.pilot * value) - symbols = self.equalizer.train_symbols(train.equalizer_length) + symbols = self.equalizer.train_symbols(equalizer.equalizer_length) signal = self.equalizer.modulator(symbols) self.write(self.silence) self.write(signal) diff --git a/amodem/train.py b/amodem/train.py deleted file mode 100644 index 61b28a4..0000000 --- a/amodem/train.py +++ /dev/null @@ -1,3 +0,0 @@ -prefix = [1]*400 + [0]*50 -equalizer_length = 500 -silence_length = 100 diff --git a/tests/test_detect.py b/tests/test_detect.py index 9d03a7c..10c3881 100644 --- a/tests/test_detect.py +++ b/tests/test_detect.py @@ -4,14 +4,14 @@ import pytest from amodem import dsp from amodem import recv from amodem import detect -from amodem import train +from amodem import equalizer from amodem import sampling from amodem import config config = config.fastest() def test_detect(): - P = sum(train.prefix) + P = sum(equalizer.prefix) t = np.arange(P * config.Nsym) * config.Ts x = np.cos(2 * np.pi * config.Fc * t) @@ -31,7 +31,7 @@ def test_detect(): def test_prefix(): omega = 2 * np.pi * config.Fc / config.Fs symbol = np.cos(omega * np.arange(config.Nsym)) - signal = np.concatenate([c * symbol for c in train.prefix]) + signal = np.concatenate([c * symbol for c in equalizer.prefix]) def symbols_stream(signal): sampler = sampling.Sampler(signal)