From 1ad96d97165b168263514fe154b3e6c21db0b3cd Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Thu, 19 Jun 2014 18:32:26 +0300 Subject: [PATCH] Works for QPSK64. --- recv.py | 13 ++++++++----- sigproc.py | 7 ++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/recv.py b/recv.py index 78273a3..5621b04 100644 --- a/recv.py +++ b/recv.py @@ -116,7 +116,6 @@ def equalize(symbols): b0, b1, a1 = linalg.lstsq(A, b)[0] y = np.array(list(sigproc.lfilter([b0, b1], [1, -a1], symbols))) - y = y.conj() # TODO constellation(y) prefix_bits, noise = slicer(y[:n], 0.5) @@ -125,7 +124,6 @@ def equalize(symbols): data_bits = sigproc.qpsk.decode(y[n:]) data_bits = list(data_bits) - log.info( 'Demodulated {} payload bits'.format(len(data_bits)) ) return data_bits def slicer(symbols, threshold): @@ -140,8 +138,12 @@ def constellation(y): pylab.subplot(121) pylab.plot(y.real, y.imag, '.') pylab.plot(np.cos(theta), np.sin(theta), ':') + keys = np.array(sigproc.qpsk._enc.values()) + print keys + pylab.plot(keys.real, keys.imag, 'o') pylab.grid('on') pylab.axis('equal') + pylab.axis(np.array([-1, 1, -1, 1]) * 1.1) pylab.subplot(122) pylab.plot(np.arange(len(y)) * Tsym, y.real, '.') @@ -158,8 +160,8 @@ def main(t, x): begin, end = result x_ = x[begin:end] t_ = t[begin:end] - Hc = exp_iwt(Fc, len(x_)) - Zc = np.dot(Hc.conj(), x_) / (0.5*len(x_)) + Hc = exp_iwt(-Fc, len(x_)) + Zc = np.dot(Hc, x_) / (0.5*len(x_)) amp = abs(Zc) phase = np.angle(Zc, deg=True) log.info('Carrier detected at ~{:.1f} ms @ {:.1f} kHz: coherence={:.3f}%, amplitude={:.3f}'.format( @@ -170,7 +172,7 @@ def main(t, x): x = x[start:] / amp t = t[start:] - Hc = exp_iwt(Fc, Nsym) / (0.5*Nsym) + Hc = exp_iwt(-Fc, Nsym) / (0.5*Nsym) func = lambda y: np.dot(Hc, y) symbols = [] for _, coeff in iterate(x, Nsym, advance=Nsym, func=func): @@ -183,6 +185,7 @@ def main(t, x): else: data = iterate(data_bits, bufsize=8, advance=8, func=to_bytes) data = ''.join(c for _, c in data) + log.info( 'Demodulated {} payload bydes'.format(len(data)) ) data = unpack(data) log.info(repr(data)) diff --git a/sigproc.py b/sigproc.py index 000de11..d680c9e 100644 --- a/sigproc.py +++ b/sigproc.py @@ -18,7 +18,7 @@ class QPSK(object): def __init__(self, bits_per_symbol): self._enc = {tuple(): 0.0} # End-Of-Stream symbol index = 0 - amps = [0.6, 1.0] + amps = [0.4, 0.6, 0.8, 1.0] N = (2 ** bits_per_symbol) / len(amps) for a in amps: for i in range(N): @@ -30,7 +30,8 @@ class QPSK(object): self.bits_per_symbol = bits_per_symbol def encode(self, bits): - assert len(bits) % self.bits_per_symbol == 0 + trailing_bits = len(bits) % self.bits_per_symbol + bits = bits + [0] * (self.bits_per_symbol - trailing_bits) for i in range(0, len(bits), self.bits_per_symbol): s = self._enc[ tuple(bits[i:i+self.bits_per_symbol]) ] yield s @@ -44,7 +45,7 @@ class QPSK(object): yield b -qpsk = QPSK(bits_per_symbol=4) +qpsk = QPSK(bits_per_symbol=6) def test_qpsk(): q = QPSK(bits_per_symbol=2)