''' 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