def lut_bootstrap(b, new_L): global L, _lut, M, s, M_L, m M = b.size-1 if L is None: fn = lambda a: util.shiftin(remainder1(a, b)[::-1], M)[0] else: fn = lambda a: remainder5(a, True) lut = np.empty(1<<new_L, int) for i in xrange(lut.size): lut[i] = fn(np.r_[util.shiftout(np.r_[i], new_L)[::-1], np.zeros(M, int)]) _lut = lut L = new_L s = M-L M_L = M/L m = (1<<M)-1
def remainder5(a, no_shift_out=False): if a.size % L: a = np.r_[a[::-1], np.zeros(-a.size%L, int)] else: a = a[::-1] a = util.shiftin(a, L)[::-1] A = a.size rf = np.zeros(1, np.uint32) code = """ uint32_t r = 0; for (int i=0; i<A; i++) r = ((r << L) & m) ^ a(i) ^ _lut(r >> s); rf(0) = r; """ weave.inline(code, ['A', 'rf', 'L', 'm', 'a', '_lut', 's'], type_converters=converters.blitz) if no_shift_out: return rf[0] else: return (rf[0] >> np.arange(M)[::-1]) & 1
def decode(self, input, visualize=False, deferVisualization=False): results = [] drawingCalls = None if not visualize else [] endIndex = 0 working_buffer = np.empty_like(input) minSize = ofdm.format.preambleLength + ofdm.format.ncp + ofdm.format.nfft for startIndex in self.synchronize(input): if startIndex < endIndex: # we already successfully decoded this packet continue synchronized_input = input[startIndex:] working_buffer[:synchronized_input.size] = synchronized_input working_buffer = working_buffer[:synchronized_input.size] if working_buffer.size <= minSize: continue training_results = self.train(working_buffer) if training_results is None: continue training_data, used_samples_training, lsnr = training_results llr, length_bits, used_samples_data = self.demodulate( working_buffer[used_samples_training:], training_data, drawingCalls) if llr is None: continue output_bits = self.decodeFromLLR(llr, length_bits) if not crc.checkFCS(output_bits[16:]): continue payload = util.shiftin(output_bits[16:-32], 8) endIndex = startIndex + used_samples_training + used_samples_data result = payload, startIndex, endIndex, lsnr results.append(result) drawFunc = None if visualize: def drawFunc(): for fn in drawingCalls: fn() if not deferVisualization: drawFunc() drawFunc = None return results, drawFunc
def decode(input, visualize=False, deferVisualization=False): results = [] drawingCalls = None if not visualize else [] endIndex = 0 working_buffer = np.empty_like(input) minSize = ofdm.format.preambleLength + ofdm.format.ncp + ofdm.format.nfft for startIndex in synchronize(input): if startIndex < endIndex: # we already successfully decoded this packet continue synchronized_input = input[startIndex:] working_buffer[:synchronized_input.size] = synchronized_input working_buffer = working_buffer[:synchronized_input.size] if working_buffer.size <= minSize: continue training_results = train(working_buffer) if training_results is None: continue training_data, used_samples_training, lsnr = training_results llr, length_bits, used_samples_data = demodulate(working_buffer[used_samples_training:], training_data, drawingCalls) if llr is None: continue output_bits = decodeFromLLR(llr, length_bits) if not crc.checkFCS(output_bits[16:]): continue payload = util.shiftin(output_bits[16:-32], 8) endIndex = startIndex + used_samples_training + used_samples_data result = payload, startIndex, endIndex, lsnr results.append(result) drawFunc = None if visualize: def drawFunc(): for fn in drawingCalls: fn() if not deferVisualization: drawFunc() drawFunc = None return results, drawFunc
def encode(interleaved_bits, rate): return rate.constellation[util.shiftin(interleaved_bits, rate.Nbpsc)]
while input.size-j > nfft and i <= length_symbols: sym = np.fft.fft(input[j:j+nfft])*G data = sym[ofdm.format.dataSubcarriers] pilots = sym[ofdm.format.pilotSubcarriers] * next(pilotPolarity) * ofdm.format.pilotTemplate kalman_u = kalman_state.update(np.sum(pilots)) data *= kalman_u pilots *= kalman_u if i==0: # signal signal_bits = data.real>0 signal_bits = interleaver.interleave(signal_bits, ofdm.format.Nsc, 1, reverse=True) scrambled_plcp_estimate = code.decode(signal_bits*2-1, 18) plcp_estimate = scrambler.scramble(scrambled_plcp_estimate, int(ofdm.format.Nsc*.5), scramblerState=0) parity = (np.sum(plcp_estimate) & 1) == 0 if not parity: return None, None, 0 plcp_estimate = util.shiftin(plcp_estimate[:18], 18)[0] try: encoding_estimate = util.rev(plcp_estimate & 0xF, 4) rate_estimate = [r.encoding == encoding_estimate for r in wifi_802_11_rates].index(True) except ValueError: return None, None, 0 r_est = wifi_802_11_rates[rate_estimate] Nbpsc, constellation_estimate = r_est.Nbpsc, r_est.constellation Ncbps, Nbps = r_est.Ncbps, r_est.Nbps length_octets = (plcp_estimate >> 5) & 0xFFF length_bits = length_octets * 8 length_coded_bits = (length_bits+16+6)*2 length_symbols = (length_coded_bits+Ncbps-1) // Ncbps signal_bits = code.encode(scrambled_plcp_estimate) dispersion = data - qam.bpsk.symbols[interleaver.interleave(signal_bits, ofdm.format.Nsc, 1)] dispersion = np.var(dispersion)