##// END OF EJS Templates
Se ha definido que el arreglo de datos debe tener el formato [canales, perfiles, alturas]; se han modificado los metodos de lectura, escritura, ploteo, procesamiento que estan relacionados.
Se ha definido que el arreglo de datos debe tener el formato [canales, perfiles, alturas]; se han modificado los metodos de lectura, escritura, ploteo, procesamiento que estan relacionados.

File last commit:

r73:ea60e7ccc5aa
r73:ea60e7ccc5aa
Show More
VoltageProcessor.py
246 lines | 7.0 KiB | text/x-python | PythonLexer
'''
Created on Feb 7, 2012
@author $Author$
@version $Id$
'''
import os, sys
import numpy
path = os.path.split(os.getcwd())[0]
sys.path.append(path)
from Model.Voltage import Voltage
from IO.VoltageIO import VoltageWriter
from Graphics.VoltagePlot import Osciloscope
class VoltageProcessor:
'''
classdocs
'''
def __init__(self, voltageInObj, voltageOutObj=None):
'''
Constructor
'''
self.voltageInObj = voltageInObj
if voltageOutObj == None:
self.voltageOutObj = Voltage()
else:
self.voltageOutObj = voltageOutObj
self.integratorIndex = None
self.decoderIndex = None
self.writerIndex = None
self.plotterIndex = None
self.integratorList = []
self.decoderList = []
self.writerList = []
self.plotterList = []
def init(self):
self.integratorIndex = 0
self.decoderIndex = 0
self.writerIndex = 0
self.plotterIndex = 0
self.voltageOutObj.copy(self.voltageInObj)
def addWriter(self,wrpath):
objWriter = VoltageWriter(self.voltageOutObj)
objWriter.setup(wrpath)
self.writerList.append(objWriter)
def addPlotter(self):
plotObj = Osciloscope(self.voltageOutObj,self.plotterIndex)
self.plotterList.append(plotObj)
def addIntegrator(self,N):
objCohInt = CoherentIntegrator(N)
self.integratorList.append(objCohInt)
def addDecoder(self,code,ncode,nbaud):
objDecoder = Decoder(code,ncode,nbaud)
self.decoderList.append(objDecoder)
def writeData(self,wrpath):
if self.voltageOutObj.flagNoData:
return 0
if len(self.writerList) <= self.writerIndex:
self.addWriter(wrpath)
self.writerList[self.writerIndex].putData()
# myWrObj = self.writerList[self.writerIndex]
# myWrObj.putData()
self.writerIndex += 1
def plotData(self,idProfile, type, xmin=None, xmax=None, ymin=None, ymax=None, winTitle=''):
if self.voltageOutObj.flagNoData:
return 0
if len(self.plotterList) <= self.plotterIndex:
self.addPlotter()
self.plotterList[self.plotterIndex].plotData(type=type, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax,winTitle=winTitle)
self.plotterIndex += 1
def integrator(self, N):
if self.voltageOutObj.flagNoData:
return 0
if len(self.integratorList) <= self.integratorIndex:
self.addIntegrator(N)
myCohIntObj = self.integratorList[self.integratorIndex]
myCohIntObj.exe(self.voltageOutObj.data)
if myCohIntObj.flag:
self.voltageOutObj.data = myCohIntObj.data
self.voltageOutObj.m_ProcessingHeader.coherentInt *= N
self.voltageOutObj.flagNoData = False
else:
self.voltageOutObj.flagNoData = True
self.integratorIndex += 1
def decoder(self,code=None,type = 0):
if self.voltageOutObj.flagNoData:
return 0
if code == None:
code = self.voltageOutObj.m_RadarControllerHeader.code
ncode, nbaud = code.shape
if len(self.decoderList) <= self.decoderIndex:
self.addDecoder(code,ncode,nbaud)
myDecodObj = self.decoderList[self.decoderIndex]
myDecodObj.exe(data=self.voltageOutObj.data,type=type)
if myDecodObj.flag:
self.voltageOutObj.data = myDecodObj.data
self.voltageOutObj.flagNoData = False
else:
self.voltageOutObj.flagNoData = True
self.decoderIndex += 1
def removeDC(self):
pass
def removeSignalInt(self):
pass
def selChannel(self):
pass
def selRange(self):
pass
def selProfiles(self):
pass
class Decoder:
def __init__(self,code, ncode, nbaud):
self.buffer = None
self.profCounter = 1
self.nCode = ncode
self.nBaud = nbaud
self.codeIndex = 0
self.code = code #this is a List
self.fft_code = None
self.flag = False
self.setCodeFft = False
def exe(self, data, ndata=None, type = 0):
if ndata == None: ndata = data.shape[1]
if type == 0:
self.convolutionInFreq(data,ndata)
if type == 1:
self.convolutionInTime(data, ndata)
def convolutionInFreq(self,data,ndata):
newcode = numpy.zeros(ndata)
newcode[0:self.nBaud] = self.code[self.codeIndex]
self.codeIndex += 1
fft_data = numpy.fft.fft(data, axis=1)
fft_code = numpy.conj(numpy.fft.fft(newcode))
fft_code = fft_code.reshape(1,len(fft_code))
conv = fft_data.copy()
conv.fill(0)
conv = fft_data*fft_code # This other way to calculate multiplication between bidimensional arrays
# for i in range(ndata):
# conv[i,:] = fft_data[i,:]*fft_code[i]
self.data = numpy.fft.ifft(conv,axis=1)
self.flag = True
if self.profCounter == self.nCode:
self.profCounter = 0
self.codeIndex = 0
self.profCounter += 1
def convolutionInTime(self, data, ndata):
nchannel = data.shape[1]
newcode = self.code[self.codeIndex]
self.codeIndex += 1
conv = data.copy()
for i in range(nchannel):
conv[i,:] = numpy.correlate(data[i,:], newcode, 'same')
self.data = conv
self.flag = True
if self.profCounter == self.nCode:
self.profCounter = 0
self.codeIndex = 0
self.profCounter += 1
class CoherentIntegrator:
def __init__(self, N):
self.profCounter = 1
self.data = None
self.buffer = None
self.flag = False
self.nCohInt = N
def exe(self,data):
if self.buffer == None:
self.buffer = data
else:
self.buffer = self.buffer + data
if self.profCounter == self.nCohInt:
self.data = self.buffer
self.buffer = None
self.profCounter = 0
self.flag = True
else:
self.flag = False
self.profCounter += 1