diff --git a/recv.py b/recv.py index 7eaf3e8..614bd39 100644 --- a/recv.py +++ b/recv.py @@ -10,11 +10,12 @@ log = logging.getLogger(__name__) import sigproc import loop import show +import train from common import * COHERENCE_THRESHOLD = 0.95 -CARRIER_DURATION = 300 +CARRIER_DURATION = sum(train.prefix) CARRIER_THRESHOLD = int(0.95 * CARRIER_DURATION) def detect(x, freq): @@ -52,24 +53,23 @@ def receive(x, freqs): symbols = iter(lp) - prefix = [1]*300 + [0]*100 - S = take(symbols, carrier_index, len(prefix)) + S = take(symbols, carrier_index, len(train.prefix)) y = np.abs(S) bits = np.round(y) bits = np.array(bits, dtype=int) - if all(bits != prefix): + if all(bits != train.prefix): return None log.info('Prefix OK') - err = sigproc.drift( S[np.array(prefix, dtype=bool)] ) / (Tsym * Fc) + err = sigproc.drift( S[np.array(train.prefix, dtype=bool)] ) / (Tsym * Fc) log.info('Frequency error: %.2f ppm', err * 1e6) lp.sampler.freq -= err filters = {} full_scale = len(freqs) - training_bits = np.array(([1]*10 + [0]*10)*20 + [0]*100) + training_bits = np.array(train.equalizer) expected = full_scale * training_bits for i, freq in enumerate(freqs): S = take(symbols, i, len(expected)) @@ -88,7 +88,7 @@ def receive(x, freqs): noise = y - expected Pnoise = sigproc.power(noise) - log.debug('{:10.1f}Hz: Noise sigma={:.4f}, SNR={:.1f} dB'.format( freq, Pnoise**0.5, 10*np.log10(1/Pnoise) )) + log.debug('{:10.1f} kHz: Noise sigma={:.4f}, SNR={:.1f} dB'.format( freq/1e3, Pnoise**0.5, 10*np.log10(1/Pnoise) )) sz = int(np.ceil(np.sqrt(len(freqs)))) diff --git a/send.py b/send.py index 1ea7c46..572f47f 100644 --- a/send.py +++ b/send.py @@ -8,6 +8,7 @@ logging.basicConfig(level=0, format='%(message)s') log = logging.getLogger(__name__) import sigproc +import train from common import * class Symbol(object): @@ -22,15 +23,13 @@ def write(fd, sym, n=1): fd.write(dumps(sym, n)) def start(sig, c): - write(sig, c*0, n=100) - write(sig, c*1, n=300) - write(sig, c*0, n=100) + write(sig, c*0, n=50) + write(sig, c*1, n=400) + write(sig, c*0, n=50) -def train(sig, c): - for i in range(20): - write(sig, c*1, n=10) - write(sig, c*0, n=10) - write(sig, c*0, n=100) +def training(sig, c): + for b in train.equalizer: + write(sig, c * b) def modulate(sig, bits): symbols_iter = sigproc.modulator.encode(list(bits)) @@ -52,7 +51,7 @@ if __name__ == '__main__': with open('tx.int16', 'wb') as fd: start(fd, sym.carrier[carrier_index]) for c in sym.carrier: - train(fd, c) + training(fd, c) bits = to_bits(ecc.encode(data)) modulate(fd, bits) diff --git a/train.py b/train.py new file mode 100644 index 0000000..f6bf6cb --- /dev/null +++ b/train.py @@ -0,0 +1,2 @@ +prefix = [1]*400 + [0]*50 +equalizer = ([1]*10 + [0]*10)*10 + [0]*20