##// END OF EJS Templates
Se agregó la opción de shift al calcular la transformada de Fourier
Se agregó la opción de shift al calcular la transformada de Fourier

File last commit:

r73:ea60e7ccc5aa
r74:2ede70f6309a
Show More
VoltageProcessor.py
246 lines | 7.0 KiB | text/x-python | PythonLexer
Miguel Valdez
Adicion de directorios de procesamiento y utilitarios
r10 '''
Created on Feb 7, 2012
Daniel Valdez
Fijando variables svn:keywords Author Id
r16 @author $Author$
@version $Id$
Miguel Valdez
Adicion de directorios de procesamiento y utilitarios
r10 '''
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72 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
Miguel Valdez
Adicion de directorios de procesamiento y utilitarios
r10 class VoltageProcessor:
'''
classdocs
'''
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72 def __init__(self, voltageInObj, voltageOutObj=None):
Miguel Valdez
Adicion de directorios de procesamiento y utilitarios
r10 '''
Constructor
'''
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72
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):
Daniel Valdez
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.
r73 if ndata == None: ndata = data.shape[1]
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72
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
Daniel Valdez
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.
r73 fft_data = numpy.fft.fft(data, axis=1)
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72 fft_code = numpy.conj(numpy.fft.fft(newcode))
Daniel Valdez
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.
r73 fft_code = fft_code.reshape(1,len(fft_code))
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72
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]
Daniel Valdez
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.
r73 self.data = numpy.fft.ifft(conv,axis=1)
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72 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):
Daniel Valdez
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.
r73 conv[i,:] = numpy.correlate(data[i,:], newcode, 'same')
Daniel Valdez
Agregando los metodos para VoltageProcessor y SpectraProcessor.
r72
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