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
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
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
# 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))
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'
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'
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'
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
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
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