mirror of
https://github.com/romanz/amodem.git
synced 2026-03-18 15:46:01 +08:00
Works for QPSK64.
This commit is contained in:
13
recv.py
13
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))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user