check for saturation during demodulation.

This commit is contained in:
Roman Zeyde
2014-08-28 17:43:14 +03:00
parent 08102a043c
commit bc13d5a944
3 changed files with 14 additions and 11 deletions

View File

@@ -6,7 +6,7 @@ import logging
log = logging.getLogger(__name__)
scaling = 32000.0 # out of 2**15
SATURATION_THRESHOLD = 1.0
SATURATION_THRESHOLD = (2**15 - 1) / scaling
LENGTH_FORMAT = '<I'
@@ -24,7 +24,7 @@ class SaturationError(ValueError):
def check_saturation(x):
peak = np.max(np.abs(x))
if peak > SATURATION_THRESHOLD:
if peak >= SATURATION_THRESHOLD:
raise SaturationError(peak)

View File

@@ -237,19 +237,22 @@ def decode(bits_iterator):
return ecc.decode(blocks())
def iread(fd):
check = common.check_saturation
reader = stream.Reader(fd, data_type=common.loads, check=check)
return itertools.chain.from_iterable(reader)
def iread(fd, skip):
reader = stream.Reader(fd, data_type=common.loads)
signal = itertools.chain.from_iterable(reader)
skipped = common.take(signal, skip)
log.debug('Skipping %.3f seconds', len(skipped) / float(modem.baud))
reader.check = common.check_saturation
return signal
def main(args):
try:
log.info('Running MODEM @ {:.1f} kbps'.format(modem.modem_bps / 1e3))
signal = iread(args.input)
skipped = common.take(signal, args.skip)
log.debug('Skipping %.3f seconds', len(skipped) / float(modem.baud))
signal = iread(args.input, args.skip)
size = 0
signal, amplitude = detect(signal, config.Fc)

View File

@@ -54,9 +54,9 @@ def test_dumps_loads():
def test_saturation():
x = np.array([1, -1, 1, -1]) * 1.01
x = np.array([1, -1, 1, -1]) * 1e10
try:
common.check_saturation(x)
assert False
except common.SaturationError as e:
assert e.args == (1.01,)
assert e.args == (max(x),)