BITS = 11 POLY = 0xa00 v = 0x7ff for i in range((1 << 11) - 1): if v & 1: v ^= POLY v >>= 1 inv_lfsr[v] = (-i-1) & ((1 << BITS) - 1) freqs = [] with open("nco.log") as fd: for line in fd: a, b = line.strip().split() freqs.append((int(a, 0), float(b))) _, last = freqs[0] l2 = last ref = 900000000 for reg, freq in freqs: lsb = reg & 3 lfval = reg >> 2 if lfval == 0: div = 0 else: div = inv_lfsr[lfval] div = div * 2 + lsb / 2 + 4.25 delta = freq / last d2 = ref / freq print(f"{reg:016b} {freq:12.2f} {delta:10.5f} {d2:10.2f} {div}") last = freq if reg & 0xf == 0: l2 = freq