mirror of
https://github.com/romanz/amodem.git
synced 2026-05-10 05:17:38 +08:00
work on iterator decoding
This commit is contained in:
38
recv.py
38
recv.py
@@ -58,45 +58,49 @@ def demodulate(x, freq, filt, plot=None):
|
|||||||
yield bits
|
yield bits
|
||||||
|
|
||||||
def receive(x, freqs):
|
def receive(x, freqs):
|
||||||
|
x = iter(x)
|
||||||
prefix = [1]*300 + [0]*100
|
prefix = [1]*300 + [0]*100
|
||||||
symbols = itertools.islice(extract_symbols(x, Fc), len(prefix))
|
symbols = itertools.islice(extract_symbols(x, Fc), len(prefix))
|
||||||
bits = np.round(np.abs(list(symbols)))
|
bits = np.round(np.abs(list(symbols)))
|
||||||
bits = np.array(bits, dtype=int)
|
bits = np.array(bits, dtype=int)
|
||||||
if all(bits[:len(prefix)] != prefix):
|
if all(bits != prefix):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
log.info( 'Prefix OK')
|
log.info( 'Prefix OK')
|
||||||
x = x[len(prefix)*Nsym:]
|
|
||||||
filters = {}
|
filters = {}
|
||||||
for freq in freqs:
|
|
||||||
training = ([1]*10 + [0]*10)*20 + [0]*100
|
|
||||||
S = list(itertools.islice(extract_symbols(x, freq), len(training)))
|
|
||||||
|
|
||||||
filt = sigproc.train(S, training)
|
full_scale = len(freqs)
|
||||||
|
training_bits = np.array(([1]*10 + [0]*10)*20 + [0]*100)
|
||||||
|
expected = full_scale * training_bits
|
||||||
|
|
||||||
|
for freq in freqs:
|
||||||
|
S = list(itertools.islice(extract_symbols(x, freq), len(expected)))
|
||||||
|
|
||||||
|
filt = sigproc.train(S, expected)
|
||||||
filters[freq] = filt
|
filters[freq] = filt
|
||||||
|
|
||||||
S = list(filt(S))
|
S = list(filt(S))
|
||||||
y = np.array(S).real
|
y = np.array(S).real
|
||||||
|
|
||||||
train_result = y > 0.5
|
train_result = y > 0.5 * full_scale
|
||||||
if not all(train_result == np.array(training)):
|
if not all(train_result == training_bits):
|
||||||
pylab.plot(y, '-', training, '-')
|
pylab.plot(y, '-', expected, '-')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
noise = y - train_result
|
noise = y - expected
|
||||||
Pnoise = sigproc.power(noise)
|
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}Hz: Noise sigma={:.4f}, SNR={:.1f} dB'.format( freq, Pnoise**0.5, 10*np.log10(1/Pnoise) ))
|
||||||
|
|
||||||
x = x[len(training)*Nsym:]
|
|
||||||
|
|
||||||
results = []
|
|
||||||
sz = int(np.ceil(np.sqrt(len(freqs))))
|
sz = int(np.ceil(np.sqrt(len(freqs))))
|
||||||
|
streams = []
|
||||||
|
x = list(x)
|
||||||
for i, freq in enumerate(freqs):
|
for i, freq in enumerate(freqs):
|
||||||
plot = functools.partial(pylab.subplot, sz, sz, i+1)
|
plot = functools.partial(pylab.subplot, sz, sz, i+1)
|
||||||
results.append( demodulate(x * len(freqs), freq, filters[freq], plot=plot) )
|
stream = demodulate(x, freq, filters[freq], plot=plot)
|
||||||
|
streams.append(stream)
|
||||||
|
|
||||||
bitstream = []
|
bitstream = []
|
||||||
for block in itertools.izip(*results):
|
for block in itertools.izip(*streams):
|
||||||
for bits in block:
|
for bits in block:
|
||||||
bitstream.extend(bits)
|
bitstream.extend(bits)
|
||||||
|
|
||||||
@@ -134,6 +138,10 @@ def main(fname):
|
|||||||
data = iterate(data_bits, bufsize=8, advance=8, func=to_byte)
|
data = iterate(data_bits, bufsize=8, advance=8, func=to_byte)
|
||||||
data = ''.join(c for _, c in data)
|
data = ''.join(c for _, c in data)
|
||||||
data = ecc.decode(data)
|
data = ecc.decode(data)
|
||||||
|
if data is None:
|
||||||
|
log.warning('No blocks decoded!')
|
||||||
|
return
|
||||||
|
|
||||||
with file('data.recv', 'wb') as f:
|
with file('data.recv', 'wb') as f:
|
||||||
f.write(data)
|
f.write(data)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user