diff --git a/amodem/dsp.py b/amodem/dsp.py index d5db3a4..8037f12 100644 --- a/amodem/dsp.py +++ b/amodem/dsp.py @@ -137,6 +137,10 @@ class MODEM(object): self.freqs = config.frequencies self.bits_per_baud = self.qam.bits_per_symbol * len(self.freqs) self.modem_bps = self.baud * self.bits_per_baud + self.carriers = np.array([ + np.exp(2j * np.pi * freq * np.arange(0, Nsym) * Ts) + for freq in self.freqs + ]) def power(x): diff --git a/amodem/equalizer.py b/amodem/equalizer.py index 7deb29a..bdf71b7 100644 --- a/amodem/equalizer.py +++ b/amodem/equalizer.py @@ -1,12 +1,13 @@ import numpy as np from numpy.linalg import lstsq -from amodem import dsp, config, send +from amodem import dsp, config import itertools import random _constellation = [1, 1j, -1, -1j] +modem = dsp.MODEM(config) def train_symbols(length, seed=0, Nfreq=config.Nfreq): @@ -15,7 +16,7 @@ def train_symbols(length, seed=0, Nfreq=config.Nfreq): return np.array([choose() for i in range(length)]) -def modulator(symbols, carriers=send.sym.carrier): +def modulator(symbols, carriers=modem.carriers): gain = 1.0 / len(carriers) result = [] for s in symbols: @@ -34,7 +35,7 @@ def demodulator(signal, size): def equalize(signal, symbols, order): Nsym = config.Nsym Nfreq = config.Nfreq - carriers = send.sym.carrier + carriers = modem.carriers assert symbols.shape[1] == Nfreq length = symbols.shape[0] diff --git a/amodem/send.py b/amodem/send.py index a21c672..d090011 100644 --- a/amodem/send.py +++ b/amodem/send.py @@ -17,14 +17,6 @@ from . import ecc modem = dsp.MODEM(config) -class Symbol(object): - def __init__(self): - t = np.arange(0, config.Nsym) * config.Ts - self.carrier = [np.exp(2j * np.pi * F * t) for F in modem.freqs] - -sym = Symbol() - - class Writer(object): def __init__(self): self.last = time.time() @@ -55,9 +47,9 @@ def training(fd, c): def modulate(fd, bits): symbols_iter = modem.qam.encode(bits) symbols_iter = itertools.chain(symbols_iter, itertools.repeat(0)) - carriers = np.array(sym.carrier) / len(sym.carrier) + carriers = modem.carriers / config.Nfreq while True: - symbols = itertools.islice(symbols_iter, len(sym.carrier)) + symbols = itertools.islice(symbols_iter, config.Nfreq) symbols = np.array(list(symbols)) writer.write(fd, np.dot(symbols, carriers)) if all(symbols == 0): # EOF marker @@ -70,8 +62,8 @@ def main(args): # padding audio with silence writer.write(args.output, np.zeros(int(config.Fs * args.silence_start))) - start(args.output, sym.carrier[config.carrier_index]) - for c in sym.carrier: + start(args.output, modem.carriers[config.carrier_index]) + for c in modem.carriers: training(args.output, c) training_size = writer.offset log.info('%.3f seconds of training audio', diff --git a/tests/test_equalizer.py b/tests/test_equalizer.py index ac1cf6b..ea1fde4 100644 --- a/tests/test_equalizer.py +++ b/tests/test_equalizer.py @@ -1,7 +1,7 @@ from numpy.linalg import norm import numpy as np -from amodem import train, dsp, config, send +from amodem import train, dsp, config from amodem import equalizer @@ -57,7 +57,7 @@ def test_commutation(): def test_modem(): L = 1000 sent = equalizer.train_symbols(L) - gain = len(send.sym.carrier) + gain = config.Nfreq x = equalizer.modulator(sent) * gain received = equalizer.demodulator(x, L) assert_approx(sent, received)