Пример #1
0
def track(x, s):
    n = len(x)
    fs = s.fs

    nco.mix(x, -s.carrier_f / fs, s.carrier_p)
    s.carrier_p = s.carrier_p - n * s.carrier_f / fs
    s.carrier_p = np.mod(s.carrier_p, 1)

    cf = (s.code_f + s.carrier_f / 1540.0) / fs

    p_early = b1cp.correlate(x, s.prn, 0, s.code_p - 0.2, cf,
                             b1cp.b1cp_code(prn), b1cp.boc11)
    p_prompt = b1cp.correlate(x, s.prn, 0, s.code_p, cf, b1cp.b1cp_code(prn),
                              b1cp.boc11)
    p_late = b1cp.correlate(x, s.prn, 0, s.code_p + 0.2, cf,
                            b1cp.b1cp_code(prn), b1cp.boc11)

    if s.mode == 'FLL_WIDE':
        fll_k = 2.0
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'FLL_NARROW':
        fll_k = 0.6
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'PLL':
        pll_k1 = 0.1
        pll_k2 = 5.0
        e = discriminator.pll_costas(p_prompt)
        e1 = s.carrier_e1
        s.carrier_f = s.carrier_f + pll_k1 * e + pll_k2 * (e - e1)
        s.carrier_e1 = e

# code loop

    dll_k1 = 0.00002
    dll_k2 = 0.2
    s.early = np.absolute(p_early)
    s.prompt = np.absolute(p_prompt)
    s.late = np.absolute(p_late)
    if (s.late + s.early) == 0:
        e = 0
    else:
        e = (s.late - s.early) / (s.late + s.early)
    s.eml = e
    e1 = s.code_e1
    s.code_f = s.code_f + dll_k1 * e + dll_k2 * (e - e1)
    s.code_e1 = e

    s.code_p = s.code_p + n * cf
    s.code_p = np.mod(s.code_p, b1cp.code_length)

    return p_prompt, s
Пример #2
0
def track(x, s):
    n = len(x)
    fs = s.fs

    nco.mix(x, -s.carrier_f / fs, s.carrier_p)
    s.carrier_p = s.carrier_p - n * s.carrier_f / fs
    s.carrier_p = np.mod(s.carrier_p, 1)

    cf = (s.code_f + s.carrier_f / 2400.0) / fs

    p_early = l2cl.correlate(x, s.prn, 0, s.code_p - 0.5, cf,
                             l2cl.l2cl_code(prn))
    p_prompt = l2cl.correlate(x, s.prn, 0, s.code_p, cf, l2cl.l2cl_code(prn))
    p_late = l2cl.correlate(x, s.prn, 0, s.code_p + 0.5, cf,
                            l2cl.l2cl_code(prn))

    if s.mode == 'FLL_WIDE':
        fll_k = 2.0
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'FLL_NARROW':
        fll_k = 0.3
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan2(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'PLL':
        pll_k1 = 0.1
        pll_k2 = 5.0
        e = discriminator.pll_costas(
            p_prompt)  # fixme: change to pure PLL, since L2CL is a pilot
        e1 = s.carrier_e1
        s.carrier_f = s.carrier_f + pll_k1 * e + pll_k2 * (e - e1)
        s.carrier_e1 = e

# code loop

    dll_k1 = 0.00002
    dll_k2 = 0.2
    s.early = np.absolute(p_early)
    s.prompt = np.absolute(p_prompt)
    s.late = np.absolute(p_late)
    if (s.late + s.early) == 0:
        e = 0
    else:
        e = (s.late - s.early) / (s.late + s.early)
    s.eml = e
    e1 = s.code_e1
    s.code_f = s.code_f + dll_k1 * e + dll_k2 * (e - e1)
    s.code_e1 = e

    s.code_p = s.code_p + n * cf
    s.code_p = np.mod(s.code_p, l2cl.code_length)

    return p_prompt, s
Пример #3
0
def track(x, s, chan):
    n = len(x)
    fs = s.fs

    nco.mix(x, -s.carrier_f / fs, s.carrier_p)
    s.carrier_p = s.carrier_p - n * s.carrier_f / fs
    s.carrier_p = np.mod(s.carrier_p, 1)

    rf_carrier = 1602.0 + 0.5625 * chan
    scale_factor = rf_carrier / 5.11
    cf = (s.code_f + s.carrier_f / scale_factor) / fs

    p_early = p.correlate(x, 0, s.code_p - 0.5, cf, p.p_code())
    p_prompt = p.correlate(x, 0, s.code_p, cf, p.p_code())
    p_late = p.correlate(x, 0, s.code_p + 0.5, cf, p.p_code())

    if s.mode == 'FLL_WIDE':
        fll_k = 2.0
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'FLL_NARROW':
        fll_k = 0.5
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'PLL':
        pll_k1 = 0.1
        pll_k2 = 5
        e = discriminator.pll_costas(p_prompt)
        e1 = s.carrier_e1
        s.carrier_f = s.carrier_f + pll_k1 * e + pll_k2 * (e - e1)
        s.carrier_e1 = e

# code loop

    dll_k1 = 0.00002
    dll_k2 = 0.2
    s.early = np.absolute(p_early)
    s.prompt = np.absolute(p_prompt)
    s.late = np.absolute(p_late)
    if (s.late + s.early) == 0:
        e = 0
    else:
        e = (s.late - s.early) / (s.late + s.early)
    s.eml = e
    e1 = s.code_e1
    s.code_f = s.code_f + dll_k1 * e + dll_k2 * (e - e1)
    s.code_e1 = e

    s.code_p = s.code_p + n * cf
    s.code_p = np.mod(s.code_p, p.code_length)

    return p_prompt, s
def track(x,s):
  n = len(x)
  fs = s.fs

  nco.mix(x,-s.carrier_f/fs, s.carrier_p)
  s.carrier_p = s.carrier_p - n*s.carrier_f/fs
  s.carrier_p = np.mod(s.carrier_p,1)

  cf = (s.code_f+s.carrier_f/115.0)/fs

  p_early = e5aq.correlate(x, s.prn, 0, s.code_p-0.5, cf, e5aq.e5aq_code(prn))
  p_prompt = e5aq.correlate(x, s.prn, 0, s.code_p, cf, e5aq.e5aq_code(prn))
  p_late = e5aq.correlate(x, s.prn, 0, s.code_p+0.5, cf, e5aq.e5aq_code(prn))

  if s.mode=='FLL_WIDE':
    fll_k = 3.0
    a = p_prompt
    b = s.prompt1
    e = discriminator.fll_atan2(a,b)
    s.carrier_f = s.carrier_f + fll_k*e
    s.prompt1 = p_prompt
  elif s.mode=='FLL_NARROW':
    fll_k = 0.3
    a = p_prompt
    b = s.prompt1
    e = discriminator.fll_atan2(a,b)
    s.carrier_f = s.carrier_f + fll_k*e
    s.prompt1 = p_prompt
  elif s.mode=='PLL':
    pll_k1 = 0.1
    pll_k2 = 5.0
    e = discriminator.pll_costas(p_prompt)
    e1 = s.carrier_e1
    s.carrier_f = s.carrier_f + pll_k1*e + pll_k2*(e-e1)
    s.carrier_e1 = e

# code loop

  dll_k1 = 0.00002
  dll_k2 = 0.2
  s.early = np.absolute(p_early)
  s.prompt = np.absolute(p_prompt)
  s.late = np.absolute(p_late)
  if (s.late+s.early)==0:
    e = 0
  else:
    e = (s.late-s.early)/(s.late+s.early)
  s.eml = e
  e1 = s.code_e1
  s.code_f = s.code_f + dll_k1*e + dll_k2*(e-e1)
  s.code_e1 = e

  s.code_p = s.code_p + n*cf
  s.code_p = np.mod(s.code_p,e5aq.code_length)

  return p_prompt,s
def track(x, s):
    n = len(x)
    fs = s.fs

    nco.mix(x, -s.carrier_f / fs, s.carrier_p)
    s.carrier_p = s.carrier_p - n * s.carrier_f / fs
    s.carrier_p = np.mod(s.carrier_p, 1)

    cf = (s.code_f + s.carrier_f / 243.84) / fs

    p_early = p.correlate(x, 0, s.code_p - 0.5, cf, p.p_code())
    p_prompt = p.correlate(x, 0, s.code_p, cf, p.p_code())
    p_late = p.correlate(x, 0, s.code_p + 0.5, cf, p.p_code())

    if s.mode == "FLL_WIDE":
        fll_k = 2.0
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == "FLL_NARROW":
        fll_k = 0.5
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == "PLL":
        pll_k1 = 0.1
        pll_k2 = 5
        e = discriminator.pll_costas(p_prompt)
        e1 = s.carrier_e1
        s.carrier_f = s.carrier_f + pll_k1 * e + pll_k2 * (e - e1)
        s.carrier_e1 = e

    # code loop

    dll_k1 = 0.00002
    dll_k2 = 0.2
    s.early = np.absolute(p_early)
    s.prompt = np.absolute(p_prompt)
    s.late = np.absolute(p_late)
    if (s.late + s.early) == 0:
        e = 0
    else:
        e = (s.late - s.early) / (s.late + s.early)
    s.eml = e
    e1 = s.code_e1
    s.code_f = s.code_f + dll_k1 * e + dll_k2 * (e - e1)
    s.code_e1 = e

    s.code_p = s.code_p + n * cf
    s.code_p = np.mod(s.code_p, p.code_length)

    return p_prompt, s
Пример #6
0
# parse command-line arguments
# example:
#   ./acquire-gps-l2cm.py /dev/stdin 69984000 -127126

filename = sys.argv[1]        # input data, raw file, i/q interleaved, 8 bit signed (two's complement)
fs = float(sys.argv[2])       # sampling rate, Hz
coffset = float(sys.argv[3])  # offset to L1 carrier, Hz (positive or negative)

# read first 75 ms of file

n = int(fs*0.075)
fp = open(filename,"rb")
x = io.get_samples_complex(fp,n)

# resample to 4.096 MHz

fsr = 4096000.0/fs
nco.mix(x,-coffset/fs,0)
h = scipy.signal.firwin(161,1.5e6/(fs/2),window='hanning')
x = scipy.signal.filtfilt(h,[1],x)
xr = np.interp((1/fsr)*np.arange(75*4096),np.arange(len(x)),np.real(x))
xi = np.interp((1/fsr)*np.arange(75*4096),np.arange(len(x)),np.imag(x))
x = xr+(1j)*xi

# iterate over PRNs of interest

for prn in range(1,33):
  metric,code,doppler = search(x,prn)
  if metric>0.0:    # fixme: need a proper metric and threshold; and estimate cn0
    print('prn %3d doppler % 7.1f metric %7.1f code_offset %6.1f' % (prn,doppler,metric,code))
Пример #7
0
  code_p=code_offset, code_f=e5ai.chip_rate, code_i=0,
  carrier_p=0, carrier_f=doppler, carrier_i=0,
  mode='PLL')

block = 0
coffset_phase = 0.0

while True:
  if s.code_p<e5ai.code_length/2:
    n = int(fs*0.001*(e5ai.code_length-s.code_p)/e5ai.code_length)
  else:
    n = int(fs*0.001*(2*e5ai.code_length-s.code_p)/e5ai.code_length)

  x = io.get_samples_complex(fp,n)
  if x is None:
    break

  nco.mix(x,-coffset/fs,coffset_phase)
  coffset_phase = coffset_phase - n*coffset/fs
  coffset_phase = np.mod(coffset_phase,1)

  p_prompt,s = track(x,s)
  vars = block, np.real(p_prompt), np.imag(p_prompt), s.carrier_f, s.code_f-e5ai.chip_rate, (180/np.pi)*np.angle(p_prompt), s.early, s.prompt, s.late
  print('%d %f %f %f %f %f %f %f %f' % vars)

  block = block + 1
#  if (block%100)==0:
#    sys.stderr.write("%d\n"%block)
#  if block==2000:
#    s.mode = 'PLL'
Пример #8
0
block = 0
coffset_phase = 0.0

while True:
    if s.code_p < ca.code_length / 2:
        n = int(fs * 0.001 * (ca.code_length - s.code_p) / ca.code_length)
    else:
        n = int(fs * 0.001 * (2 * ca.code_length - s.code_p) / ca.code_length)

    x = io.get_samples_complex(fp, n)
    if x is None:
        break

    fm = -(coffset + 437500 * chan) / fs
    nco.mix(x, fm, coffset_phase)
    coffset_phase = coffset_phase + n * fm
    coffset_phase = np.mod(coffset_phase, 1)

    p_prompt, s = track(x, s)
    vars = block, np.real(p_prompt), np.imag(
        p_prompt), s.carrier_f, s.code_f - ca.chip_rate, (
            180 / np.pi) * np.angle(p_prompt), s.early, s.prompt, s.late
    print('%d %f %f %f %f %f %f %f %f' % vars)

    block = block + 1
    #  if (block%100)==0:
    #    sys.stderr.write("%d\n"%block)
    if block == 1000:
        s.mode = 'FLL_NARROW'
    if block == 2000:
coffset = float(args[2])
prns = util.parse_list_ranges(options.prn)
doppler_search = util.parse_list_floats(options.doppler_search)
ms = options.time

# read first portion of file

ms_pad = ms + 5
n = int(fs*0.001*ms_pad)
fp = open(filename,"rb")
x = io.get_samples_complex(fp,n)

# resample to 8.192 MHz

fsr = 8192000.0/fs
nco.mix(x,-coffset/fs,0)
h = scipy.signal.firwin(161,4e6/(fs/2),window='hanning')
x = scipy.signal.filtfilt(h,[1],x)
xr = np.interp((1/fsr)*np.arange(ms_pad*8192),np.arange(len(x)),np.real(x))
xi = np.interp((1/fsr)*np.arange(ms_pad*8192),np.arange(len(x)),np.imag(x))
x = xr+(1j)*xi

# iterate (in parallel) over PRNs of interest

def worker(p):
  x,prn = p
  metric,code,doppler = search(x,prn,doppler_search,ms)
  return 'prn %3d doppler % 7.1f metric % 7.1f code_offset %6.1f' % (prn,doppler,metric,code)

import multiprocessing as mp
s = tracking_state(fs=fs, prn=prn,                    # initialize tracking state
  code_p=code_offset, code_f=e5aq.chip_rate, code_i=0,
  carrier_p=0, carrier_f=doppler, carrier_i=0,
  mode='PLL')

block = 0
coffset_phase = 0.0

while True:
  if s.code_p<e5aq.code_length/2:
    n = int(fs*0.001*(e5aq.code_length-s.code_p)/e5aq.code_length)
  else:
    n = int(fs*0.001*(2*e5aq.code_length-s.code_p)/e5aq.code_length)

  x = io.get_samples_complex(fp,n)
  if x==None:
    break

  nco.mix(x,-coffset/fs,coffset_phase)
  coffset_phase = coffset_phase - n*coffset/fs
  coffset_phase = np.mod(coffset_phase,1)

  p_prompt,s = track(x,s)
  print block, np.real(p_prompt), np.imag(p_prompt), s.carrier_f, s.code_f-e5aq.chip_rate, (180/np.pi)*np.angle(p_prompt), s.early, s.prompt, s.late

  block = block + 1
#  if (block%100)==0:
#    sys.stderr.write("%d\n"%block)
#  if block==1000:
#    s.mode = 'PLL'
Пример #11
0
  mode='FLL_WIDE')

block = 0
coffset_phase = 0.0

while True:
  if s.code_p<ca.code_length/2:
    n = int(fs*0.001*(ca.code_length-s.code_p)/ca.code_length)
  else:
    n = int(fs*0.001*(2*ca.code_length-s.code_p)/ca.code_length)

  x = io.get_samples_complex(fp,n)
  if x is None:
    break

  fm = -(coffset+562500*chan)/fs
  nco.mix(x,fm,coffset_phase)
  coffset_phase = coffset_phase + n*fm
  coffset_phase = np.mod(coffset_phase,1)

  p_prompt,s = track(x,s)
  print(block, np.real(p_prompt), np.imag(p_prompt), s.carrier_f, s.code_f-ca.chip_rate, (180/np.pi)*np.angle(p_prompt), s.early, s.prompt, s.late)

  block = block + 1
#  if (block%100)==0:
#    sys.stderr.write("%d\n"%block)
  if block==1000:
    s.mode = 'FLL_NARROW'
  if block==2000:
    s.mode = 'PLL'
Пример #12
0
def track(x, s):
    n = len(x)
    fs = s.fs

    nco.mix(x, -s.carrier_f / fs, s.carrier_p)
    s.carrier_p = s.carrier_p - n * s.carrier_f / fs
    s.carrier_p = np.mod(s.carrier_p, 1)

    cf = (s.code_f + s.carrier_f / 1540.0) / fs

    p_early = l1cp.correlate(x, s.prn, 0, s.code_p - 0.2, cf,
                             l1cp.l1cp_code(prn), l1cp.boc11)
    p_prompt = l1cp.correlate(x, s.prn, 0, s.code_p, cf, l1cp.l1cp_code(prn),
                              l1cp.boc11)
    p_late = l1cp.correlate(x, s.prn, 0, s.code_p + 0.2, cf,
                            l1cp.l1cp_code(prn), l1cp.boc11)

    #  if s.ms>4000:
    #    for dci in range(320):
    #      dc = 0.0125*(dci-160)
    #      pp = l1cp.correlate(x, s.prn, 0, s.code_p+dc, cf, l1cp.l1cp_code(prn), l1cp.boc11)
    #      if np.real(p_prompt)>0:
    #        s.shape[dci] += pp
    #      else:
    #        s.shape[dci] -= pp
    #  s.ms = s.ms + 1

    if s.mode == 'FLL_WIDE':
        fll_k = 3.0
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'FLL_NARROW':
        fll_k = 0.8
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'PLL':
        pll_k1 = 0.1
        pll_k2 = 3.5
        e = discriminator.pll_costas(p_prompt)
        e1 = s.carrier_e1
        s.carrier_f = s.carrier_f + pll_k1 * e + pll_k2 * (e - e1)
        s.carrier_e1 = e

# code loop

    dll_k1 = 0.00002
    dll_k2 = 0.2
    s.early = np.absolute(p_early)
    s.prompt = np.absolute(p_prompt)
    s.late = np.absolute(p_late)
    if (s.late + s.early) == 0:
        e = 0
    else:
        e = (s.late - s.early) / (s.late + s.early)
    s.eml = e
    e1 = s.code_e1
    s.code_f = s.code_f + dll_k1 * e + dll_k2 * (e - e1)
    s.code_e1 = e

    s.code_p = s.code_p + n * cf
    s.code_p = np.mod(s.code_p, l1cp.code_length)

    return p_prompt, s
Пример #13
0
def track(x, s):
    n = len(x)
    fs = s.fs

    nco.mix(x, -s.carrier_f / fs, s.carrier_p)
    s.carrier_p = s.carrier_p - n * s.carrier_f / fs
    s.carrier_p = np.mod(s.carrier_p, 1)

    cf = (s.code_f + s.carrier_f / 118.0) / fs

    p_early = b2bq.correlate(x, s.prn, 0, s.code_p - 0.5, cf,
                             b2bq.b2bq_code(prn))
    p_prompt = b2bq.correlate(x, s.prn, 0, s.code_p, cf, b2bq.b2bq_code(prn))
    p_late = b2bq.correlate(x, s.prn, 0, s.code_p + 0.5, cf,
                            b2bq.b2bq_code(prn))

    if s.nframe > 200:
        if np.real(p_prompt) > 0:
            nco.accum(x, s.code_p, cf, s.chips, b2bq.code_length)
        else:
            nco.accum(-x, s.code_p, cf, s.chips, b2bq.code_length)

    s.nframe += 1

    if s.mode == 'FLL_WIDE':
        fll_k = 3.0
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'FLL_NARROW':
        fll_k = 0.8
        a = p_prompt
        b = s.prompt1
        e = discriminator.fll_atan(a, b)
        s.carrier_f = s.carrier_f + fll_k * e
        s.prompt1 = p_prompt
    elif s.mode == 'PLL':
        pll_k1 = 0.1
        pll_k2 = 3.5
        e = discriminator.pll_costas(p_prompt)
        e1 = s.carrier_e1
        s.carrier_f = s.carrier_f + pll_k1 * e + pll_k2 * (e - e1)
        s.carrier_e1 = e

# code loop

    dll_k1 = 0.00002
    dll_k2 = 0.2
    s.early = np.absolute(p_early)
    s.prompt = np.absolute(p_prompt)
    s.late = np.absolute(p_late)
    if (s.late + s.early) == 0:
        e = 0
    else:
        e = (s.late - s.early) / (s.late + s.early)
    s.eml = e
    e1 = s.code_e1
    s.code_f = s.code_f + dll_k1 * e + dll_k2 * (e - e1)
    s.code_e1 = e

    s.code_p = s.code_p + n * cf
    s.code_p = np.mod(s.code_p, b2bq.code_length)

    return p_prompt, s
Пример #14
0
def track(x,s):
  n = len(x)
  fs = s.fs

  nco.mix(x,-s.carrier_f/fs, s.carrier_p)
  s.carrier_p = s.carrier_p - n*s.carrier_f/fs
  t = np.mod(s.carrier_p,1)
  dcyc = int(round(s.carrier_p-t))
  s.carrier_cyc += dcyc
  s.carrier_p = t

  cf = (s.code_f+s.carrier_f/1540.0)/fs

  p_early = ca.correlate(x, s.prn, 0, s.code_p-0.05, cf, ca.ca_code(prn))
  p_prompt = ca.correlate(x, s.prn, 0, s.code_p, cf, ca.ca_code(prn))
  p_late = ca.correlate(x, s.prn, 0, s.code_p+0.05, cf, ca.ca_code(prn))

  if s.mode=='FLL_WIDE':
    fll_k = 3.0
    a = p_prompt
    b = s.prompt1
    e = discriminator.fll_atan2(a,b)
    s.carrier_f = s.carrier_f + fll_k*e
    s.prompt1 = p_prompt
  elif s.mode=='FLL_NARROW':
    fll_k = 0.3
    a = p_prompt
    b = s.prompt1
    e = discriminator.fll_atan2(a,b)
    s.carrier_f = s.carrier_f + fll_k*e
    s.prompt1 = p_prompt
  elif s.mode=='PLL':
    pll_k1 = 0.1
    pll_k2 = 5.0
    e = discriminator.pll_costas(p_prompt)
    e1 = s.carrier_e1
    s.carrier_f = s.carrier_f + pll_k1*e + pll_k2*(e-e1)
    s.carrier_e1 = e

# code loop

  dll_k1 = 0.00002
  dll_k2 = 0.2
  s.early = np.absolute(p_early)
  s.prompt = np.absolute(p_prompt)
  s.late = np.absolute(p_late)
  if (s.late+s.early)==0:
    e = 0
  else:
    e = (s.late-s.early)/(s.late+s.early)
  s.eml = e
  e1 = s.code_e1
  s.code_f = s.code_f + dll_k1*e + dll_k2*(e-e1)
  s.code_e1 = e

  s.code_p = s.code_p + n*cf
  t = np.mod(s.code_p,ca.code_length)
  dcyc = int(round(s.code_p-t))
  s.code_cyc += dcyc
  s.code_p = t

  return p_prompt,s