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