##// END OF EJS Templates
test 3.0
test 3.0

File last commit:

r1167:1f521b07c958
r1222:8e3e1ad5000f v3.0-devel
Show More
jroproc_correlation.py
178 lines | 6.7 KiB | text/x-python | PythonLexer
/ schainpy / model / proc / jroproc_correlation.py
import numpy
from .jroproc_base import ProcessingUnit, Operation
from schainpy.model.data.jrodata import Correlation, hildebrand_sekhon
class CorrelationProc(ProcessingUnit):
pairsList = None
data_cf = None
def __init__(self, **kwargs):
ProcessingUnit.__init__(self, **kwargs)
self.objectDict = {}
self.buffer = None
self.firstdatatime = None
self.profIndex = 0
self.dataOut = Correlation()
def __updateObjFromVoltage(self):
self.dataOut.timeZone = self.dataIn.timeZone
self.dataOut.dstFlag = self.dataIn.dstFlag
self.dataOut.errorCount = self.dataIn.errorCount
self.dataOut.useLocalTime = self.dataIn.useLocalTime
self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
self.dataOut.channelList = self.dataIn.channelList
self.dataOut.heightList = self.dataIn.heightList
self.dataOut.dtype = numpy.dtype([('real','<f4'),('imag','<f4')])
# self.dataOut.nHeights = self.dataIn.nHeights
# self.dataOut.nChannels = self.dataIn.nChannels
self.dataOut.nBaud = self.dataIn.nBaud
self.dataOut.nCode = self.dataIn.nCode
self.dataOut.code = self.dataIn.code
# self.dataOut.nProfiles = self.dataOut.nFFTPoints
self.dataOut.flagDiscontinuousBlock = self.dataIn.flagDiscontinuousBlock
self.dataOut.utctime = self.firstdatatime
self.dataOut.flagDecodeData = self.dataIn.flagDecodeData #asumo q la data esta decodificada
self.dataOut.flagDeflipData = self.dataIn.flagDeflipData #asumo q la data esta sin flip
self.dataOut.nCohInt = self.dataIn.nCohInt
# self.dataOut.nIncohInt = 1
self.dataOut.ippSeconds = self.dataIn.ippSeconds
self.dataOut.nProfiles = self.dataIn.nProfiles
self.dataOut.utctime = self.dataIn.utctime
# self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
# self.dataOut.timeInterval = self.dataIn.timeInterval*self.dataOut.nPoints
def removeDC(self, jspectra):
nChannel = jspectra.shape[0]
for i in range(nChannel):
jspectra_tmp = jspectra[i,:,:]
jspectra_DC = numpy.mean(jspectra_tmp,axis = 0)
jspectra_tmp = jspectra_tmp - jspectra_DC
jspectra[i,:,:] = jspectra_tmp
return jspectra
def removeNoise(self, mode = 2):
indR = numpy.where(self.dataOut.lagR == 0)[0][0]
indT = numpy.where(self.dataOut.lagT == 0)[0][0]
jspectra = self.dataOut.data_corr[:,:,indR,:]
num_chan = jspectra.shape[0]
num_hei = jspectra.shape[2]
freq_dc = indT
ind_vel = numpy.array([-2,-1,1,2]) + freq_dc
NPot = self.dataOut.getNoise(mode)
jspectra[:,freq_dc,:] = jspectra[:,freq_dc,:] - NPot
SPot = jspectra[:,freq_dc,:]
pairsAutoCorr = self.dataOut.getPairsAutoCorr()
# self.dataOut.signalPotency = SPot
self.dataOut.noise = NPot
self.dataOut.SNR = (SPot/NPot)[pairsAutoCorr]
self.dataOut.data_corr[:,:,indR,:] = jspectra
return 1
def run(self, lags=None, mode = 'time', pairsList=None, fullBuffer=False, nAvg = 1, removeDC = False, splitCF=False):
self.dataOut.flagNoData = True
if self.dataIn.type == "Correlation":
self.dataOut.copy(self.dataIn)
return
if self.dataIn.type == "Voltage":
nChannels = self.dataIn.nChannels
nProfiles = self.dataIn.nProfiles
nHeights = self.dataIn.nHeights
data_pre = self.dataIn.data
#--------------- Remover DC ------------
if removeDC:
data_pre = self.removeDC(data_pre)
#---------------------------------------------
# pairsList = list(ccfList)
# for i in acfList:
# pairsList.append((i,i))
#
# ccf_pairs = numpy.arange(len(ccfList))
# acf_pairs = numpy.arange(len(ccfList),len(pairsList))
self.__updateObjFromVoltage()
#----------------------------------------------------------------------
#Creating temporal buffers
if fullBuffer:
tmp = numpy.zeros((len(pairsList), len(lags), nProfiles, nHeights), dtype = 'complex')*numpy.nan
elif mode == 'time':
if lags == None:
lags = numpy.arange(-nProfiles+1, nProfiles)
tmp = numpy.zeros((len(pairsList), len(lags), nHeights),dtype='complex')
elif mode == 'height':
if lags == None:
lags = numpy.arange(-nHeights+1, nHeights)
tmp = numpy.zeros(len(pairsList), (len(lags), nProfiles),dtype='complex')
#For loop
for l in range(len(pairsList)):
ch0 = pairsList[l][0]
ch1 = pairsList[l][1]
for i in range(len(lags)):
idx = lags[i]
if idx >= 0:
if mode == 'time':
ccf0 = data_pre[ch0,:nProfiles-idx,:]*numpy.conj(data_pre[ch1,idx:,:]) #time
else:
ccf0 = data_pre[ch0,:,nHeights-idx]*numpy.conj(data_pre[ch1,:,idx:]) #heights
else:
if mode == 'time':
ccf0 = data_pre[ch0,-idx:,:]*numpy.conj(data_pre[ch1,:nProfiles+idx,:]) #time
else:
ccf0 = data_pre[ch0,:,-idx:]*numpy.conj(data_pre[ch1,:,:nHeights+idx]) #heights
if fullBuffer:
tmp[l,i,:ccf0.shape[0],:] = ccf0
else:
tmp[l,i,:] = numpy.sum(ccf0, axis=0)
#-----------------------------------------------------------------
if fullBuffer:
tmp = numpy.sum(numpy.reshape(tmp,(tmp.shape[0],tmp.shape[1],tmp.shape[2]/nAvg,nAvg,tmp.shape[3])),axis=3)
self.dataOut.nAvg = nAvg
self.dataOut.data_cf = tmp
self.dataOut.mode = mode
self.dataOut.nLags = len(lags)
self.dataOut.pairsList = pairsList
self.dataOut.nPairs = len(pairsList)
#Se Calcula los factores de Normalizacion
if mode == 'time':
delta = self.dataIn.ippSeconds*self.dataIn.nCohInt
else:
delta = self.dataIn.heightList[1] - self.dataIn.heightList[0]
self.dataOut.lagRange = numpy.array(lags)*delta
# self.dataOut.nCohInt = self.dataIn.nCohInt*nAvg
self.dataOut.flagNoData = False
# a = self.dataOut.normFactor
return