Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
    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
Esempio n. 4
0
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
Esempio n. 5
0
def encode(interleaved_bits, rate):
    return rate.constellation[util.shiftin(interleaved_bits, rate.Nbpsc)]
Esempio n. 6
0
 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)