@@ -344,6 +344,23 @@ def is_pickleable(self):
344
344
"""
345
345
return True
346
346
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
+
347
364
def run (self , samples ):
348
365
"""
349
366
Run tracking channel for the given batch of data.
@@ -372,22 +389,32 @@ def run(self, samples):
372
389
samples_processed = 0
373
390
samples_total = len (samples [self .signal ]['samples' ])
374
391
375
- estimated_blksize = self .coherent_ms * self .sampling_freq / 1e3
392
+ estimated_blksize = 2 * self .coherent_ms * self .sampling_freq / 1e3
376
393
377
- self .track_result .status = 'T'
394
+ if estimated_blksize > self .samples_to_track :
395
+ raise ValueError ("Sample file too short" )
378
396
379
- while self .samples_tracked < self .samples_to_track and \
380
- (sample_index + 2 * estimated_blksize ) < samples_total :
397
+ # check if there is a problem with batch size unless we are at the last
398
+ # batch
399
+ if ((sample_index + estimated_blksize ) > samples_total and
400
+ self .samples_to_track - self .samples_tracked > estimated_blksize ):
401
+ logging .error ("Sample batch too small" )
402
+ raise ValueError ("Sample batch too small" )
381
403
404
+ self .track_result .status = 'T'
405
+
406
+ while (self .samples_tracked < self .samples_to_track and
407
+ (sample_index + estimated_blksize ) < samples_total ):
382
408
self ._run_preprocess ()
383
409
410
+ lf_dict = self .loop_filter .to_dict ()
384
411
if self .pipelining :
385
412
# Pipelining and prediction
386
413
corr_code_freq = self .next_code_freq
387
414
corr_carr_freq = self .next_carr_freq
388
415
389
- self .next_code_freq = self . loop_filter . to_dict () ['code_freq' ]
390
- self .next_carr_freq = self . loop_filter . to_dict () ['carr_freq' ]
416
+ self .next_code_freq = lf_dict ['code_freq' ]
417
+ self .next_carr_freq = lf_dict ['carr_freq' ]
391
418
392
419
if self .short_n_long and not self .stage1 and not self .short_step :
393
420
# In case of short/long cycles, the correction applicable for the
@@ -406,43 +433,56 @@ def run(self, samples):
406
433
407
434
else :
408
435
# 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' ]
436
+ self .next_code_freq = lf_dict ['code_freq' ]
437
+ self .next_carr_freq = lf_dict ['carr_freq' ]
411
438
412
439
corr_code_freq = self .next_code_freq
413
440
corr_carr_freq = self .next_carr_freq
414
441
415
442
coherent_iter , code_chips_to_integrate = self ._short_n_long_preprocess ()
416
443
444
+ coherent_idx = 0
445
+ # Store state in case of insufficient sample count left
446
+ self .store_track_state ()
447
+ code_freq = corr_code_freq + self .chipping_rate
448
+ code_step = code_freq / self .sampling_freq
449
+
417
450
for _ in range (self .coherent_iter ):
418
451
419
- if (sample_index + 2 * estimated_blksize ) >= samples_total :
420
- break
452
+ if (sample_index + coherent_idx + code_step * code_chips_to_integrate >=
453
+ samples_total ):
454
+ # Restore state because loop cannot be finished
455
+ self .restore_track_state ()
456
+ self .sample_index += samples_processed
457
+ return self ._get_result ()
421
458
422
- samples_ = samples [self .signal ]['samples' ][sample_index :]
459
+ samples_ = \
460
+ samples [self .signal ]['samples' ][(sample_index + coherent_idx ):]
423
461
424
- E_ , P_ , L_ , blksize , self .code_phase , self .carr_phase = self .correlator (
462
+ E_ , P_ , L_ , blksize , self .code_phase , self .carr_phase = \
463
+ self .correlator (
425
464
samples_ ,
426
465
code_chips_to_integrate ,
427
- corr_code_freq + self . chipping_rate , self .code_phase ,
466
+ code_freq , self .code_phase ,
428
467
corr_carr_freq + self .IF , self .carr_phase ,
429
468
self .prn_code ,
430
469
self .sampling_freq ,
431
- self .signal
432
- )
470
+ self .signal )
433
471
434
472
if blksize > estimated_blksize :
435
- estimated_blksize = blksize
473
+ estimated_blksize = 2 * blksize
436
474
437
- sample_index += blksize
438
- samples_processed += blksize
475
+ coherent_idx += blksize
439
476
self .carr_phase_acc += corr_carr_freq * blksize / self .sampling_freq
440
477
self .code_phase_acc += corr_code_freq * blksize / self .sampling_freq
441
478
442
479
self .E += E_
443
480
self .P += P_
444
481
self .L += L_
445
482
483
+ sample_index += coherent_idx
484
+ samples_processed += coherent_idx
485
+
446
486
more_integration_needed = self ._short_n_long_postprocess ()
447
487
if more_integration_needed :
448
488
continue
0 commit comments