@@ -2,7 +2,7 import sys | |||||
2 | import numpy,math |
|
2 | import numpy,math | |
3 | from scipy import interpolate |
|
3 | from scipy import interpolate | |
4 | from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator |
|
4 | from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator | |
5 | from schainpy.model.data.jrodata import Voltage |
|
5 | from schainpy.model.data.jrodata import Voltage,hildebrand_sekhon | |
6 | from schainpy.utils import log |
|
6 | from schainpy.utils import log | |
7 | from time import time |
|
7 | from time import time | |
8 |
|
8 | |||
@@ -1355,9 +1355,6 class PulsePairVoltage(Operation): | |||||
1355 | n, |
|
1355 | n, | |
1356 | dataOut.nHeights), |
|
1356 | dataOut.nHeights), | |
1357 | dtype='complex') |
|
1357 | dtype='complex') | |
1358 | #self.noise = numpy.zeros([self.__nch,self.__nHeis]) |
|
|||
1359 | #for i in range(self.__nch): |
|
|||
1360 | # self.noise[i]=dataOut.getNoise(channel=i) |
|
|||
1361 |
|
1358 | |||
1362 | def putData(self,data): |
|
1359 | def putData(self,data): | |
1363 | ''' |
|
1360 | ''' | |
@@ -1372,101 +1369,127 class PulsePairVoltage(Operation): | |||||
1372 | Return the PULSEPAIR and the profiles used in the operation |
|
1369 | Return the PULSEPAIR and the profiles used in the operation | |
1373 | Affected : self.__profileIndex |
|
1370 | Affected : self.__profileIndex | |
1374 | ''' |
|
1371 | ''' | |
|
1372 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Remove DCΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
1375 | if self.removeDC==True: |
|
1373 | if self.removeDC==True: | |
1376 | mean = numpy.mean(self.__buffer,1) |
|
1374 | mean = numpy.mean(self.__buffer,1) | |
1377 | tmp = mean.reshape(self.__nch,1,self.__nHeis) |
|
1375 | tmp = mean.reshape(self.__nch,1,self.__nHeis) | |
1378 | dc= numpy.tile(tmp,[1,self.__nProf,1]) |
|
1376 | dc= numpy.tile(tmp,[1,self.__nProf,1]) | |
1379 | self.__buffer = self.__buffer - dc |
|
1377 | self.__buffer = self.__buffer - dc | |
|
1378 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Calculo de Potencia Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
1379 | pair0 = self.__buffer*numpy.conj(self.__buffer) | |||
|
1380 | pair0 = pair0.real | |||
|
1381 | lag_0 = numpy.sum(pair0,1) | |||
|
1382 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Calculo de Ruido x canalΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
1383 | self.noise = numpy.zeros(self.__nch) | |||
|
1384 | for i in range(self.__nch): | |||
|
1385 | daux = numpy.sort(pair0[i,:,:],axis= None) | |||
|
1386 | self.noise[i]=hildebrand_sekhon( daux ,self.nCohInt) | |||
|
1387 | ||||
|
1388 | self.noise = self.noise.reshape(self.__nch,1) | |||
|
1389 | self.noise = numpy.tile(self.noise,[1,self.__nHeis]) | |||
|
1390 | noise_buffer = self.noise.reshape(self.__nch,1,self.__nHeis) | |||
|
1391 | noise_buffer = numpy.tile(noise_buffer,[1,self.__nProf,1]) | |||
|
1392 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Potencia recibida= P , Potencia senal = S , Ruido= NΒ·Β· | |||
|
1393 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· P= S+N ,P=lag_0/N Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
1394 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Power Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
1395 | data_power = lag_0/(self.n*self.nCohInt) | |||
|
1396 | #------------------ Senal Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
|
1397 | data_intensity = pair0 - noise_buffer | |||
|
1398 | data_intensity = numpy.sum(data_intensity,axis=1)*(self.n*self.nCohInt)#*self.nCohInt) | |||
|
1399 | #data_intensity = (lag_0-self.noise*self.n)*(self.n*self.nCohInt) | |||
|
1400 | for i in range(self.__nch): | |||
|
1401 | for j in range(self.__nHeis): | |||
|
1402 | if data_intensity[i][j] < 0: | |||
|
1403 | data_intensity[i][j] = numpy.min(numpy.absolute(data_intensity[i][j])) | |||
1380 |
|
1404 | |||
1381 | lag_0 = numpy.sum(self.__buffer*numpy.conj(self.__buffer),1) |
|
1405 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Calculo de Frecuencia y Velocidad dopplerΒ·Β·Β·Β·Β·Β·Β·Β· | |
1382 | data_intensity = lag_0/(self.n*self.nCohInt)#*self.nCohInt) |
|
|||
1383 |
|
||||
1384 | pair1 = self.__buffer[:,:-1,:]*numpy.conjugate(self.__buffer[:,1:,:]) |
|
1406 | pair1 = self.__buffer[:,:-1,:]*numpy.conjugate(self.__buffer[:,1:,:]) | |
1385 | lag_1 = numpy.sum(pair1,1) |
|
1407 | lag_1 = numpy.sum(pair1,1) | |
1386 | #angle = numpy.angle(numpy.sum(pair1,1))*180/(math.pi) |
|
1408 | data_freq = (-1/(2.0*math.pi*self.ippSec*self.nCohInt))*numpy.angle(lag_1) | |
1387 | data_velocity = (-1.0*self.lambda_/(4*math.pi*self.ippSec))*numpy.angle(lag_1)#self.ippSec*self.nCohInt |
|
1409 | data_velocity = (self.lambda_/2.0)*data_freq | |
1388 |
|
1410 | |||
1389 | self.noise = numpy.zeros([self.__nch,self.__nHeis]) |
|
1411 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Potencia promedio estimada de la SenalΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |
1390 | for i in range(self.__nch): |
|
1412 | lag_0 = lag_0/self.n | |
1391 | self.noise[i]=dataOut.getNoise(channel=i) |
|
1413 | S = lag_0-self.noise | |
1392 |
|
1414 | |||
1393 | lag_0 = lag_0.real/(self.n) |
|
1415 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Frecuencia Doppler promedio Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |
1394 | lag_1 = lag_1/(self.n-1) |
|
1416 | lag_1 = lag_1/(self.n-1) | |
1395 | R1 = numpy.abs(lag_1) |
|
1417 | R1 = numpy.abs(lag_1) | |
1396 | S = (lag_0-self.noise) |
|
|||
1397 |
|
1418 | |||
|
1419 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Calculo del SNRΒ·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
1398 | data_snrPP = S/self.noise |
|
1420 | data_snrPP = S/self.noise | |
1399 | data_snrPP = numpy.where(data_snrPP<0,1,data_snrPP) |
|
1421 | for i in range(self.__nch): | |
|
1422 | for j in range(self.__nHeis): | |||
|
1423 | if data_snrPP[i][j] < 1.e-20: | |||
|
1424 | data_snrPP[i][j] = 1.e-20 | |||
1400 |
|
1425 | |||
|
1426 | #Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· Calculo del ancho espectral Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β·Β· | |||
1401 | L = S/R1 |
|
1427 | L = S/R1 | |
1402 | L = numpy.where(L<0,1,L) |
|
1428 | L = numpy.where(L<0,1,L) | |
1403 | L = numpy.log(L) |
|
1429 | L = numpy.log(L) | |
1404 |
|
||||
1405 | tmp = numpy.sqrt(numpy.absolute(L)) |
|
1430 | tmp = numpy.sqrt(numpy.absolute(L)) | |
1406 |
|
1431 | data_specwidth = (self.lambda_/(2*math.sqrt(2)*math.pi*self.ippSec*self.nCohInt))*tmp*numpy.sign(L) | ||
1407 | data_specwidth = (self.lambda_/(2*math.sqrt(2)*math.pi*self.ippSec))*tmp*numpy.sign(L) |
|
|||
1408 | #data_specwidth = (self.lambda_/(2*math.sqrt(2)*math.pi*self.ippSec))*k |
|
|||
1409 | n = self.__profIndex |
|
1432 | n = self.__profIndex | |
1410 |
|
1433 | |||
1411 | self.__buffer = numpy.zeros((self.__nch, self.__nProf,self.__nHeis), dtype='complex') |
|
1434 | self.__buffer = numpy.zeros((self.__nch, self.__nProf,self.__nHeis), dtype='complex') | |
1412 | self.__profIndex = 0 |
|
1435 | self.__profIndex = 0 | |
1413 | return data_intensity,data_velocity,data_snrPP,data_specwidth,n |
|
1436 | return data_power,data_intensity,data_velocity,data_snrPP,data_specwidth,n | |
|
1437 | ||||
1414 |
|
1438 | |||
1415 | def pulsePairbyProfiles(self,dataOut): |
|
1439 | def pulsePairbyProfiles(self,dataOut): | |
1416 |
|
1440 | |||
1417 | self.__dataReady = False |
|
1441 | self.__dataReady = False | |
|
1442 | data_power = None | |||
1418 | data_intensity = None |
|
1443 | data_intensity = None | |
1419 | data_velocity = None |
|
1444 | data_velocity = None | |
1420 | data_specwidth = None |
|
1445 | data_specwidth = None | |
1421 | data_snrPP = None |
|
1446 | data_snrPP = None | |
1422 | self.putData(data=dataOut.data) |
|
1447 | self.putData(data=dataOut.data) | |
1423 | if self.__profIndex == self.n: |
|
1448 | if self.__profIndex == self.n: | |
1424 | #self.noise = numpy.zeros([self.__nch,self.__nHeis]) |
|
1449 | data_power,data_intensity, data_velocity,data_snrPP,data_specwidth, n = self.pushData(dataOut=dataOut) | |
1425 | #for i in range(self.__nch): |
|
|||
1426 | # self.noise[i]=data.getNoise(channel=i) |
|
|||
1427 | #print(self.noise.shape) |
|
|||
1428 | data_intensity, data_velocity,data_snrPP,data_specwidth, n = self.pushData(dataOut=dataOut) |
|
|||
1429 | self.__dataReady = True |
|
1450 | self.__dataReady = True | |
1430 |
|
1451 | |||
1431 | return data_intensity, data_velocity,data_snrPP,data_specwidth |
|
1452 | return data_power, data_intensity, data_velocity, data_snrPP, data_specwidth | |
|
1453 | ||||
1432 |
|
1454 | |||
1433 | def pulsePairOp(self, dataOut, datatime= None): |
|
1455 | def pulsePairOp(self, dataOut, datatime= None): | |
1434 |
|
1456 | |||
1435 | if self.__initime == None: |
|
1457 | if self.__initime == None: | |
1436 | self.__initime = datatime |
|
1458 | self.__initime = datatime | |
1437 | #print("hola") |
|
1459 | data_power, data_intensity, data_velocity, data_snrPP, data_specwidth = self.pulsePairbyProfiles(dataOut) | |
1438 | data_intensity, data_velocity,data_snrPP,data_specwidth = self.pulsePairbyProfiles(dataOut) |
|
|||
1439 | self.__lastdatatime = datatime |
|
1460 | self.__lastdatatime = datatime | |
1440 |
|
1461 | |||
1441 |
if data_ |
|
1462 | if data_power is None: | |
1442 | return None, None,None,None,None |
|
1463 | return None, None, None,None,None,None | |
1443 |
|
1464 | |||
1444 | avgdatatime = self.__initime |
|
1465 | avgdatatime = self.__initime | |
1445 | deltatime = datatime - self.__lastdatatime |
|
1466 | deltatime = datatime - self.__lastdatatime | |
1446 | self.__initime = datatime |
|
1467 | self.__initime = datatime | |
1447 |
|
1468 | |||
1448 | return data_intensity, data_velocity,data_snrPP,data_specwidth,avgdatatime |
|
1469 | return data_power, data_intensity, data_velocity, data_snrPP, data_specwidth, avgdatatime | |
1449 |
|
1470 | |||
1450 | def run(self, dataOut,n = None,removeDC= False, overlapping= False,**kwargs): |
|
1471 | def run(self, dataOut,n = None,removeDC= False, overlapping= False,**kwargs): | |
1451 |
|
1472 | |||
1452 | if not self.isConfig: |
|
1473 | if not self.isConfig: | |
1453 | self.setup(dataOut = dataOut, n = n , removeDC=removeDC , **kwargs) |
|
1474 | self.setup(dataOut = dataOut, n = n , removeDC=removeDC , **kwargs) | |
1454 | self.isConfig = True |
|
1475 | self.isConfig = True | |
1455 | data_intensity, data_velocity,data_snrPP,data_specwidth, avgdatatime = self.pulsePairOp(dataOut, dataOut.utctime) |
|
1476 | data_power, data_intensity, data_velocity,data_snrPP,data_specwidth, avgdatatime = self.pulsePairOp(dataOut, dataOut.utctime) | |
1456 | dataOut.flagNoData = True |
|
1477 | dataOut.flagNoData = True | |
1457 |
|
1478 | |||
1458 | if self.__dataReady: |
|
1479 | if self.__dataReady: | |
1459 | dataOut.nCohInt *= self.n |
|
1480 | dataOut.nCohInt *= self.n | |
1460 |
dataOut.data |
|
1481 | dataOut.dataPP_POW = data_intensity # S | |
1461 |
dataOut.data |
|
1482 | dataOut.dataPP_POWER = data_power # P | |
1462 |
dataOut.data |
|
1483 | dataOut.dataPP_DOP = data_velocity | |
1463 |
dataOut.data |
|
1484 | dataOut.dataPP_SNR = data_snrPP | |
|
1485 | dataOut.dataPP_WIDTH = data_specwidth | |||
1464 | dataOut.PRFbyAngle = self.n #numero de PRF*cada angulo rotado que equivale a un tiempo. |
|
1486 | dataOut.PRFbyAngle = self.n #numero de PRF*cada angulo rotado que equivale a un tiempo. | |
1465 | dataOut.utctime = avgdatatime |
|
1487 | dataOut.utctime = avgdatatime | |
1466 | dataOut.flagNoData = False |
|
1488 | dataOut.flagNoData = False | |
1467 | return dataOut |
|
1489 | return dataOut | |
1468 |
|
1490 | |||
1469 |
|
1491 | |||
|
1492 | ||||
1470 | # import collections |
|
1493 | # import collections | |
1471 | # from scipy.stats import mode |
|
1494 | # from scipy.stats import mode | |
1472 | # |
|
1495 | # |
General Comments 0
You need to be logged in to leave comments.
Login now