def test_icapture(): x = range(100) y = [] z = [] for i in common.icapture(x, result=y): z.append(i) assert x == y assert x == z
def demodulate(symbols, filters, freqs, sampler): streams = [] symbol_list = [] errors = {} def error_handler(received, decoded, freq): errors.setdefault(freq, []).append(received / decoded) generators = common.split(symbols, n=len(freqs)) for freq, S in zip(freqs, generators): S = filters[freq](S) if pylab: equalized = [] S = common.icapture(S, result=equalized) symbol_list.append(equalized) freq_handler = functools.partial(error_handler, freq=freq) bits = modem.qam.decode(S, freq_handler) # list of bit tuples streams.append(bits) # stream per frequency stats['symbol_list'] = symbol_list stats['rx_bits'] = 0 stats['rx_start'] = time.time() log.info('Demodulation started') for i, block in enumerate(itertools.izip(*streams)): # block per frequency for bits in block: stats['rx_bits'] = stats['rx_bits'] + len(bits) yield bits if i and i % config.baud == 0: mean_err = np.array([e for v in errors.values() for e in v]) correction = np.mean(np.angle(mean_err)) / (2*np.pi) duration = time.time() - stats['rx_start'] log.debug('%10.1f kB, realtime: %6.2f%%, sampling error: %+.3f%%', stats['rx_bits'] / 8e3, duration * 100.0 / (i*config.Tsym), correction * 1e2) errors.clear() sampler.freq -= 0.01 * correction / config.Fc sampler.offset -= correction