Skip to content
This repository was archived by the owner on Apr 13, 2021. It is now read-only.

Commit 5a27a38

Browse files
author
Pasi Miettinen
committed
Fix 20 ms integration
1 parent 7713608 commit 5a27a38

File tree

1 file changed

+60
-18
lines changed

1 file changed

+60
-18
lines changed

peregrine/tracking.py

+60-18
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,25 @@ def is_pickleable(self):
344344
"""
345345
return True
346346

347+
def store_track_state(self):
348+
self.stored_track_state = {}
349+
self.stored_track_state['carr_phase'] = self.carr_phase
350+
self.stored_track_state['code_phase'] = self.code_phase
351+
self.stored_track_state['carr_phase_acc'] = self.carr_phase_acc
352+
self.stored_track_state['code_phase_acc'] = self.code_phase_acc
353+
354+
def restore_track_state(self):
355+
if not self.stored_track_state:
356+
logger.error("No stored track state available")
357+
return
358+
359+
self.carr_phase = self.stored_track_state['carr_phase']
360+
self.code_phase = self.stored_track_state['code_phase']
361+
self.carr_phase_acc = self.stored_track_state['carr_phase_acc']
362+
self.code_phase_acc = self.stored_track_state['code_phase_acc']
363+
364+
self.stored_track_state = None
365+
347366
def run(self, samples):
348367
"""
349368
Run tracking channel for the given batch of data.
@@ -372,22 +391,32 @@ def run(self, samples):
372391
samples_processed = 0
373392
samples_total = len(samples[self.signal]['samples'])
374393

375-
estimated_blksize = self.coherent_ms * self.sampling_freq / 1e3
394+
estimated_blksize = 2 * self.coherent_ms * self.sampling_freq / 1e3
376395

377-
self.track_result.status = 'T'
396+
if estimated_blksize > self.samples_to_track:
397+
raise ValueError("Sample file too short")
378398

379-
while self.samples_tracked < self.samples_to_track and \
380-
(sample_index + 2 * estimated_blksize) < samples_total:
399+
# check if there is a problem with batch size unless we are at the last
400+
# batch
401+
if ((sample_index + estimated_blksize) > samples_total and
402+
self.samples_to_track - self.samples_tracked > estimated_blksize):
403+
logging.error("Sample batch too small")
404+
raise ValueError("Sample batch too small")
381405

406+
self.track_result.status = 'T'
407+
408+
while (self.samples_tracked < self.samples_to_track and
409+
(sample_index + estimated_blksize) < samples_total):
382410
self._run_preprocess()
383411

412+
lf_dict = self.loop_filter.to_dict()
384413
if self.pipelining:
385414
# Pipelining and prediction
386415
corr_code_freq = self.next_code_freq
387416
corr_carr_freq = self.next_carr_freq
388417

389-
self.next_code_freq = self.loop_filter.to_dict()['code_freq']
390-
self.next_carr_freq = self.loop_filter.to_dict()['carr_freq']
418+
self.next_code_freq = lf_dict['code_freq']
419+
self.next_carr_freq = lf_dict['carr_freq']
391420

392421
if self.short_n_long and not self.stage1 and not self.short_step:
393422
# In case of short/long cycles, the correction applicable for the
@@ -406,43 +435,56 @@ def run(self, samples):
406435

407436
else:
408437
# Immediate correction simulation
409-
self.next_code_freq = self.loop_filter.to_dict()['code_freq']
410-
self.next_carr_freq = self.loop_filter.to_dict()['carr_freq']
438+
self.next_code_freq = lf_dict['code_freq']
439+
self.next_carr_freq = lf_dict['carr_freq']
411440

412441
corr_code_freq = self.next_code_freq
413442
corr_carr_freq = self.next_carr_freq
414443

415444
coherent_iter, code_chips_to_integrate = self._short_n_long_preprocess()
416445

446+
coherent_idx = 0
447+
# Store state in case of insufficient sample count left
448+
self.store_track_state()
449+
code_freq = corr_code_freq + self.chipping_rate
450+
code_step = code_freq / self.sampling_freq
451+
417452
for _ in range(self.coherent_iter):
418453

419-
if (sample_index + 2 * estimated_blksize) >= samples_total:
420-
break
454+
if (sample_index + coherent_idx + code_step * code_chips_to_integrate >=
455+
samples_total):
456+
# Restore state because loop cannot be finished
457+
self.restore_track_state()
458+
self.sample_index += samples_processed
459+
return self._get_result()
421460

422-
samples_ = samples[self.signal]['samples'][sample_index:]
461+
samples_ =\
462+
samples[self.signal]['samples'][(sample_index + coherent_idx):]
423463

424-
E_, P_, L_, blksize, self.code_phase, self.carr_phase = self.correlator(
464+
E_, P_, L_, blksize, self.code_phase, self.carr_phase = \
465+
self.correlator(
425466
samples_,
426467
code_chips_to_integrate,
427-
corr_code_freq + self.chipping_rate, self.code_phase,
468+
code_freq, self.code_phase,
428469
corr_carr_freq + self.IF, self.carr_phase,
429470
self.prn_code,
430471
self.sampling_freq,
431-
self.signal
432-
)
472+
self.signal)
433473

434474
if blksize > estimated_blksize:
435-
estimated_blksize = blksize
475+
estimated_blksize = 2 * blksize
436476

437-
sample_index += blksize
438-
samples_processed += blksize
477+
coherent_idx += blksize
439478
self.carr_phase_acc += corr_carr_freq * blksize / self.sampling_freq
440479
self.code_phase_acc += corr_code_freq * blksize / self.sampling_freq
441480

442481
self.E += E_
443482
self.P += P_
444483
self.L += L_
445484

485+
sample_index += coherent_idx
486+
samples_processed += coherent_idx
487+
446488
more_integration_needed = self._short_n_long_postprocess()
447489
if more_integration_needed:
448490
continue

0 commit comments

Comments
 (0)