Example #1
0
def probeData(settings):

    print "Probing data", settings.fileName

    samplesPerCode = int(
        round(settings.samplingFreq /
              (settings.codeFreqBasis / settings.codeLength)))

    samples = getSamples.int8(settings.fileName, 10 * samplesPerCode,
                              settings.skipNumberOfBytes)

    #Initialize figure
    fig = pylab.figure()
    pylab.clf()

    #X axis
    timeScale = [x*(1/settings.samplingFreq) for x in \
                 range(0,int(round((5e-3 + 1/settings.samplingFreq)*settings.samplingFreq)))]
    #Time domain plot
    pylab.subplot(2, 2, 1)
    plot_max = int(round(samplesPerCode / 50))
    pylab.plot([1000 * i for i in timeScale[0:plot_max]], samples[0:plot_max])
    pylab.title('Time domain plot')
    pylab.xlabel('Time (ms)')
    pylab.ylabel('Amplitude')

    #Frequency domain plot
    (Pxx,freqs) = matplotlib.mlab.psd(x = samples-numpy.mean(samples),\
                                                      noverlap = 1024,\
                                                          NFFT = 2048,\
                                       Fs = settings.samplingFreq/1e6)
    pylab.subplot(2, 2, 2)
    pylab.semilogy(freqs, Pxx)
    pylab.title('Frequency Domain Plot')
    pylab.xlabel('Frequency (MHz)')
    pylab.ylabel('Magnitude')

    #Histogram
    pylab.subplot(2, 2, 3)
    xticks = pylab.unique(samples)
    pylab.hist(samples, len(xticks))
    axis = pylab.axis()
    pylab.axis([min(samples), max(samples), axis[2], axis[3]])
    xticks = pylab.unique(pylab.round_(xticks))
    pylab.xticks(xticks)
    pylab.title('Histogram')

    return fig
Example #2
0
def probeData(settings):

  print "Probing data", settings.fileName

  samplesPerCode = int(round(settings.samplingFreq / (settings.codeFreqBasis / settings.codeLength)))
  
  samples = getSamples.int8(settings.fileName,10*samplesPerCode,settings.skipNumberOfBytes)
  
  #Initialize figure
  fig = pylab.figure()
  pylab.clf()
  
  #X axis
  timeScale = [x*(1/settings.samplingFreq) for x in \
               range(0,int(round((5e-3 + 1/settings.samplingFreq)*settings.samplingFreq)))]
  #Time domain plot
  pylab.subplot(2,2,1)
  plot_max = int(round(samplesPerCode/50))
  pylab.plot([1000*i for i in timeScale[0:plot_max]],samples[0:plot_max])
  pylab.title('Time domain plot')
  pylab.xlabel('Time (ms)')
  pylab.ylabel('Amplitude')
  
  #Frequency domain plot
  (Pxx,freqs) = matplotlib.mlab.psd(x = samples-numpy.mean(samples),\
                                                    noverlap = 1024,\
                                                        NFFT = 2048,\
                                     Fs = settings.samplingFreq/1e6)
  pylab.subplot(2,2,2)
  pylab.semilogy(freqs,Pxx)
  pylab.title('Frequency Domain Plot')
  pylab.xlabel('Frequency (MHz)')
  pylab.ylabel('Magnitude')
  
  #Histogram
  pylab.subplot(2,2,3)
  xticks = pylab.unique(samples)
  pylab.hist(samples,len(xticks))
  axis = pylab.axis()
  pylab.axis([min(samples),max(samples),axis[2],axis[3]])
  xticks = pylab.unique(pylab.round_(xticks))
  pylab.xticks(xticks)
  pylab.title('Histogram');
  
  return fig
Example #3
0
#Initialize constants, settings
settings = initSettings()

#Generate plot of raw data
if settings.plotSignal:
    print "Plotting data", settings.fileName
    probeFigure = probeData(settings)
    pylab.draw()

#Do acquisition
#Get 11ms of acquisition samples for fine frequency estimation
samplesPerCode = int(
    round(settings.samplingFreq /
          (settings.codeFreqBasis / settings.codeLength)))
acqSamples = getSamples.int8(settings.fileName, 11 * samplesPerCode,
                             settings.skipNumberOfBytes)
if settings.skipAcquisition:
    print "\nLoading old acquisition results ...",
    acqResults = pickle.load(open("acqResults.pickle", "rb"))
    print "done"
else:
    print "\nAcquiring satellites ...",
    acqResults = acquisition(acqSamples, settings)
    pickle.dump(acqResults, open("acqResults.pickle", "wb"))
#  print "done"
if settings.plotAcquisition:
    acqFigure = plotAcquisition(acqResults, settings)
    pylab.draw()

#Do tracking
#Find if any satellites were acquired
Example #4
0
def track(samples, channel, settings):
  #Create list of tracking channels results (correlations, freqs, etc)
  trackResults = [trackResults_class(settings) for i in range(len(channel))]
  #Initialize tracking variables
  codePeriods = settings.msToProcess
  ##DLL Variables##
  #Define early-late offset
  earlyLateSpc = settings.dllCorrelatorSpacing
  #Summation interval
  PDIcode = 0.001
  #Filter coefficient values
  (tau1code, tau2code) = calcLoopCoef(settings.dllNoiseBandwidth,settings.dllDampingRatio,1.0)
  ##PLL Variables##
  PDIcarr = 0.001
  (tau1carr,tau2carr) = calcLoopCoef(settings.pllNoiseBandwidth,settings.pllDampingRatio,0.25)

  progbar = Waitbar(True)
  
  #Do tracking for each channel
  for channelNr in range(len(channel)):
    trackResults[channelNr].PRN = channel[channelNr].PRN
    #Get a vector with the C/A code sampled 1x/chip
    caCode = np.array(generateCAcode(channel[channelNr].PRN))
    #Add wrapping to either end to be able to do early/late
    caCode = np.concatenate(([caCode[1022]],caCode,[caCode[0]]))
    #Initialize phases and frequencies
    codeFreq = settings.codeFreqBasis
    remCodePhase = 0.0 #residual code phase
    carrFreq = channel[channelNr].acquiredFreq
    carrFreqBasis = channel[channelNr].acquiredFreq
    remCarrPhase = 0.0 #residual carrier phase
    
    #code tracking loop parameters
    oldCodeNco = 0.0
    oldCodeError = 0.0
   
    #carrier/Costas loop parameters
    oldCarrNco = 0.0
    oldCarrError = 0.0

    #number of samples to seek ahead in file
    numSamplesToSkip = settings.skipNumberOfBytes + channel[channelNr].codePhase
  
    #Process the specified number of ms
    for loopCnt in range(settings.msToProcess):
      #Update progress every 50 loops
      if (np.remainder(loopCnt,50)==0):
        progbar.updated(float(loopCnt + channelNr*settings.msToProcess)\
                        / float(len(channel)*settings.msToProcess))
#        print "Channel %d/%d, %d/%d ms" % (channelNr+1,len(channel),loopCnt, settings.msToProcess)
      #Update the code phase rate based on code freq and sampling freq
      codePhaseStep = codeFreq/settings.samplingFreq
      codePhaseStep = codePhaseStep*(10**12) #round it in the same way we are in octave
      codePhaseStep = round(codePhaseStep)
      codePhaseStep = codePhaseStep*(10**(-12))
      blksize = int(np.ceil((settings.codeLength - remCodePhase)/codePhaseStep))
      #Read samples for this integration period
      rawSignal = np.array(getSamples.int8(settings.fileName,blksize,numSamplesToSkip))

      numSamplesToSkip = numSamplesToSkip + blksize

      #Define index into early code vector
      tcode = np.r_[(remCodePhase-earlyLateSpc) : \
                    (blksize*codePhaseStep+remCodePhase-earlyLateSpc) : \
                    codePhaseStep]
      earlyCode = caCode[np.int_(np.ceil(tcode))]
      #Define index into late code vector
      tcode = np.r_[(remCodePhase+earlyLateSpc) : \
                    (blksize*codePhaseStep+remCodePhase+earlyLateSpc) : \
                    codePhaseStep]
      lateCode = caCode[np.int_(np.ceil(tcode))]
      #Define index into prompt code vector
      tcode = np.r_[(remCodePhase) : \
                    (blksize*codePhaseStep+remCodePhase) : \
                    codePhaseStep]
      promptCode = caCode[np.int_(np.ceil(tcode))]
      
      remCodePhase = (tcode[blksize-1] + codePhaseStep) - 1023
      
      #Generate the carrier frequency to mix the signal to baseband
      time = np.r_[0:blksize+1] / settings.samplingFreq #(seconds)
      
      #Get the argument to sin/cos functions
      trigarg = (carrFreq * 2.0 * math.pi)*time + remCarrPhase
      remCarrPhase = np.remainder(trigarg[blksize],(2*math.pi))

      #Finally compute the signal to mix the collected data to baseband
      carrCos = np.cos(trigarg[0:blksize])
      carrSin = np.sin(trigarg[0:blksize])
      
      #Mix signals to baseband
      qBasebandSignal = carrCos*rawSignal
      iBasebandSignal = carrSin*rawSignal

      #Get early, prompt, and late I/Q correlations
      I_E = np.sum(earlyCode * iBasebandSignal)
      Q_E = np.sum(earlyCode * qBasebandSignal)
      I_P = np.sum(promptCode * iBasebandSignal)
      Q_P = np.sum(promptCode * qBasebandSignal)
      I_L = np.sum(lateCode * iBasebandSignal)
      Q_L = np.sum(lateCode * qBasebandSignal)

      #Find PLL error and update carrier NCO
      #Carrier loop discriminator (phase detector)
      carrError = math.atan(Q_P/I_P) / (2.0 * math.pi)
      #Carrier loop filter and NCO
      carrNco = oldCarrNco + (tau2carr/tau1carr) * \
                 (carrError-oldCarrError) + carrError*(PDIcarr/tau1carr)
      oldCarrNco = carrNco
      oldCarrError = carrError
      #Modify carrier freq based on NCO
      carrFreq = carrFreqBasis + carrNco
      trackResults[channelNr].carrFreq[loopCnt] = carrFreq

      #Find DLL error and update code NCO
      codeError = (math.sqrt(I_E*I_E + Q_E*Q_E) - math.sqrt(I_L*I_L + Q_L*Q_L)) / \
                   (math.sqrt(I_E*I_E + Q_E*Q_E) + math.sqrt(I_L*I_L + Q_L*Q_L))
      codeNco = oldCodeNco + (tau2code/tau1code)*(codeError-oldCodeError) \
                   + codeError*(PDIcode/tau1code)
      oldCodeNco = codeNco
      oldCodeError = codeError
      #Code freq based on NCO
      codeFreq = settings.codeFreqBasis - codeNco
      trackResults[channelNr].codeFreq[loopCnt] = codeFreq

      #Record stuff for postprocessing
      trackResults[channelNr].absoluteSample[loopCnt] = numSamplesToSkip

      trackResults[channelNr].dllDiscr[loopCnt] = codeError
      trackResults[channelNr].dllDiscrFilt[loopCnt] = codeNco
      trackResults[channelNr].pllDiscr[loopCnt] = carrError
      trackResults[channelNr].pllDiscrFilt[loopCnt] = carrNco

      trackResults[channelNr].I_E[loopCnt] = I_E
      trackResults[channelNr].I_P[loopCnt] = I_P
      trackResults[channelNr].I_L[loopCnt] = I_L
      trackResults[channelNr].Q_E[loopCnt] = Q_E
      trackResults[channelNr].Q_P[loopCnt] = Q_P
      trackResults[channelNr].Q_L[loopCnt] = Q_L

#      print ("tR[%d].absoluteSample[%d] = %d" % (channelNr,loopCnt,trackResults[channelNr].absoluteSample[loopCnt]))
#
#      print ("tR[%d].dllDiscr[%d]       = %f" % (channelNr,loopCnt,trackResults[channelNr].dllDiscr[loopCnt]))
#      print ("tR[%d].dllDiscrFilt[%d]   = %f" % (channelNr,loopCnt,trackResults[channelNr].dllDiscrFilt[loopCnt]))
#      print ("tR[%d].codeFreq[%d]       = %f" % (channelNr,loopCnt,trackResults[channelNr].codeFreq[loopCnt]))
#      print ("tR[%d].pllDiscr[%d]       = %f" % (channelNr,loopCnt,trackResults[channelNr].pllDiscr[loopCnt]))
#      print ("tR[%d].pllDiscrFilt[%d]   = %f" % (channelNr,loopCnt,trackResults[channelNr].pllDiscrFilt[loopCnt]))
#      print ("tR[%d].carrFreq[%d]       = %f" % (channelNr,loopCnt,trackResults[channelNr].carrFreq[loopCnt]))
#
#      print ("tR[%d].I_E[%d] = %f" % (channelNr,loopCnt,trackResults[channelNr].I_E[loopCnt]))
#      print ("tR[%d].I_P[%d] = %f" % (channelNr,loopCnt,trackResults[channelNr].I_P[loopCnt]))
#      print ("tR[%d].I_L[%d] = %f" % (channelNr,loopCnt,trackResults[channelNr].I_L[loopCnt]))
#      print ("tR[%d].Q_E[%d] = %f" % (channelNr,loopCnt,trackResults[channelNr].Q_E[loopCnt]))
#      print ("tR[%d].Q_P[%d] = %f" % (channelNr,loopCnt,trackResults[channelNr].Q_P[loopCnt]))
#      print ("tR[%d].Q_L[%d] = %f" % (channelNr,loopCnt,trackResults[channelNr].Q_L[loopCnt]))
#      print ""

    #Possibility for lock-detection later
    trackResults[channelNr].status = 'T'

  print ""

  return (trackResults,channel)
Example #5
0
print 'is free software  you  are  welcome  to  redistribute  it under'
print 'the terms described in the license.'

#Initialize constants, settings
settings = initSettings()

#Generate plot of raw data
if settings.plotSignal:
  print "Plotting data", settings.fileName
  probeFigure = probeData(settings)
  pylab.draw()

#Do acquisition
#Get 11ms of acquisition samples for fine frequency estimation
samplesPerCode = int(round(settings.samplingFreq / (settings.codeFreqBasis / settings.codeLength)))
acqSamples = getSamples.int8(settings.fileName,11*samplesPerCode,settings.skipNumberOfBytes)
if settings.skipAcquisition:
  print "\nLoading old acquisition results ...",
  acqResults = pickle.load(open("acqResults.pickle","rb"))
  print "done"
else:
  print "\nAcquiring satellites ...",
  acqResults = acquisition(acqSamples,settings)
  pickle.dump(acqResults,open("acqResults.pickle","wb"))
#  print "done"
if settings.plotAcquisition:
  acqFigure = plotAcquisition(acqResults,settings)
  pylab.draw()

#Do tracking
#Find if any satellites were acquired
    else:
      print ".",
      sys.stdout.flush()
    for i in range(32): #Add PRN number to each result
      acqResults[i].append(i)
  #Acquisition is over 
  print ")"
  return acqResults

if __name__ == "__main__":
  from initSettings import initSettings
  import getSamples
  from showChannelStatus import showChannelStatus
  from preRun import preRun
  from plotAcquisition import plotAcquisition
  settings = initSettings()
  #11 ms of samples
  samplesPerCode = int(round(settings.samplingFreq / (settings.codeFreqBasis / settings.codeLength)))
  acqSamples = getSamples.int8(settings.fileName,11*samplesPerCode,settings.skipNumberOfBytes)
  print "Acquiring satellites ...",
  acqResults = acquisition(acqSamples,settings)
  acqFigure = plotAcquisition(acqResults,settings)
  #if satellite wasn't found, pop it off the list
  for i in range(32-1,-1,-1):
    if acqResults[i][0] > settings.acqThreshold:
      acqSuccessful = True
    else: 
      acqResults.pop(i)
  showChannelStatus(preRun(acqResults,settings),settings)
  pylab.show()
Example #7
0
    return acqResults


if __name__ == "__main__":
    from initSettings import initSettings
    import getSamples
    from showChannelStatus import showChannelStatus
    from preRun import preRun
    from plotAcquisition import plotAcquisition
    settings = initSettings()
    settings.fileName = '../gnss_signal_records/v2_3_samples.dat'
    settings.IF = 4.092e6
    settings.samplingFreq = 16.368e6
    #11 ms of samples
    samplesPerCode = int(
        round(settings.samplingFreq /
              (settings.codeFreqBasis / settings.codeLength)))
    acqSamples = getSamples.int8(settings.fileName, 11 * samplesPerCode,
                                 settings.skipNumberOfBytes)
    print "Acquiring satellites ...",
    acqResults = acquisition(acqSamples, settings)
    acqFigure = plotAcquisition(acqResults, settings)
    #if satellite wasn't found, pop it off the list
    for i in range(32 - 1, -1, -1):
        if acqResults[i][0] > settings.acqThreshold:
            acqSuccessful = True
        else:
            acqResults.pop(i)
    showChannelStatus(preRun(acqResults, settings), settings)
    pylab.show()