@@ -200,9 +200,9 class VoltageProc(ProcessingUnit): | |||||
200 | """ |
|
200 | """ | |
201 | Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] |
|
201 | Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] | |
202 | """ |
|
202 | """ | |
203 |
data = self.dataOut.data[:,minIndex:maxIndex |
|
203 | data = self.dataOut.data[:,:, minIndex:maxIndex] | |
204 | else: |
|
204 | else: | |
205 | data = self.dataOut.data[:,minIndex:maxIndex] |
|
205 | data = self.dataOut.data[:, minIndex:maxIndex] | |
206 |
|
206 | |||
207 | # firstHeight = self.dataOut.heightList[minIndex] |
|
207 | # firstHeight = self.dataOut.heightList[minIndex] | |
208 |
|
208 | |||
@@ -566,6 +566,13 class Decoder(Operation): | |||||
566 | print 'IOError: Number of heights (%d) should be greater than number of bauds (%d)' %(self.__nHeis, self.nBaud) |
|
566 | print 'IOError: Number of heights (%d) should be greater than number of bauds (%d)' %(self.__nHeis, self.nBaud) | |
567 | raise IOError, 'Number of heights (%d) should be greater than number of bauds (%d)' %(self.__nHeis, self.nBaud) |
|
567 | raise IOError, 'Number of heights (%d) should be greater than number of bauds (%d)' %(self.__nHeis, self.nBaud) | |
568 |
|
568 | |||
|
569 | #Frequency | |||
|
570 | __codeBuffer = numpy.zeros((self.nCode, self.__nHeis), dtype=numpy.complex) | |||
|
571 | ||||
|
572 | __codeBuffer[:,0:self.nBaud] = self.code | |||
|
573 | ||||
|
574 | self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1)) | |||
|
575 | ||||
569 | if dataOut.flagDataAsBlock: |
|
576 | if dataOut.flagDataAsBlock: | |
570 |
|
577 | |||
571 | self.ndatadec = self.__nHeis #- self.nBaud + 1 |
|
578 | self.ndatadec = self.__nHeis #- self.nBaud + 1 | |
@@ -573,18 +580,13 class Decoder(Operation): | |||||
573 | self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex) |
|
580 | self.datadecTime = numpy.zeros((self.__nChannels, self.__nProfiles, self.ndatadec), dtype=numpy.complex) | |
574 |
|
581 | |||
575 | else: |
|
582 | else: | |
576 |
|
||||
577 | __codeBuffer = numpy.zeros((self.nCode, self.__nHeis), dtype=numpy.complex) |
|
|||
578 |
|
||||
579 | __codeBuffer[:,0:self.nBaud] = self.code |
|
|||
580 |
|
||||
581 | self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1)) |
|
|||
582 |
|
583 | |||
|
584 | #Time | |||
583 | self.ndatadec = self.__nHeis #- self.nBaud + 1 |
|
585 | self.ndatadec = self.__nHeis #- self.nBaud + 1 | |
584 |
|
586 | |||
585 | self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex) |
|
587 | self.datadecTime = numpy.zeros((self.__nChannels, self.ndatadec), dtype=numpy.complex) | |
586 |
|
588 | |||
587 | def convolutionInFreq(self, data): |
|
589 | def __convolutionInFreq(self, data): | |
588 |
|
590 | |||
589 | fft_code = self.fft_code[self.__profIndex].reshape(1,-1) |
|
591 | fft_code = self.fft_code[self.__profIndex].reshape(1,-1) | |
590 |
|
592 | |||
@@ -594,11 +596,9 class Decoder(Operation): | |||||
594 |
|
596 | |||
595 | data = numpy.fft.ifft(conv,axis=1) |
|
597 | data = numpy.fft.ifft(conv,axis=1) | |
596 |
|
598 | |||
597 | datadec = data#[:,:] |
|
599 | return data | |
598 |
|
600 | |||
599 | return datadec |
|
601 | def __convolutionInFreqOpt(self, data): | |
600 |
|
||||
601 | def convolutionInFreqOpt(self, data): |
|
|||
602 |
|
602 | |||
603 | raise NotImplementedError |
|
603 | raise NotImplementedError | |
604 |
|
604 | |||
@@ -610,7 +610,7 class Decoder(Operation): | |||||
610 | # |
|
610 | # | |
611 | # return datadec |
|
611 | # return datadec | |
612 |
|
612 | |||
613 | def convolutionInTime(self, data): |
|
613 | def __convolutionInTime(self, data): | |
614 |
|
614 | |||
615 | code = self.code[self.__profIndex] |
|
615 | code = self.code[self.__profIndex] | |
616 |
|
616 | |||
@@ -619,7 +619,7 class Decoder(Operation): | |||||
619 |
|
619 | |||
620 | return self.datadecTime |
|
620 | return self.datadecTime | |
621 |
|
621 | |||
622 | def convolutionByBlockInTime(self, data): |
|
622 | def __convolutionByBlockInTime(self, data): | |
623 |
|
623 | |||
624 | repetitions = self.__nProfiles / self.nCode |
|
624 | repetitions = self.__nProfiles / self.nCode | |
625 |
|
625 | |||
@@ -629,10 +629,22 class Decoder(Operation): | |||||
629 |
|
629 | |||
630 | for i in range(self.__nChannels): |
|
630 | for i in range(self.__nChannels): | |
631 | for j in range(self.__nProfiles): |
|
631 | for j in range(self.__nProfiles): | |
632 |
self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode=' |
|
632 | self.datadecTime[i,j,:] = numpy.correlate(data[i,j,:], code_block[j,:], mode='full')[self.nBaud-1:] | |
633 |
|
633 | |||
634 | return self.datadecTime |
|
634 | return self.datadecTime | |
635 |
|
635 | |||
|
636 | def __convolutionByBlockInFreq(self, data): | |||
|
637 | ||||
|
638 | fft_code = self.fft_code[self.__profIndex].reshape(1,-1) | |||
|
639 | ||||
|
640 | fft_data = numpy.fft.fft(data, axis=2) | |||
|
641 | ||||
|
642 | conv = fft_data*fft_code | |||
|
643 | ||||
|
644 | data = numpy.fft.ifft(conv,axis=2) | |||
|
645 | ||||
|
646 | return data | |||
|
647 | ||||
636 | def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, osamp=None, times=None): |
|
648 | def run(self, dataOut, code=None, nCode=None, nBaud=None, mode = 0, osamp=None, times=None): | |
637 |
|
649 | |||
638 | if dataOut.flagDecodeData: |
|
650 | if dataOut.flagDecodeData: | |
@@ -652,25 +664,32 class Decoder(Operation): | |||||
652 | if self.code is None: |
|
664 | if self.code is None: | |
653 | print "Fail decoding: Code is not defined." |
|
665 | print "Fail decoding: Code is not defined." | |
654 | return |
|
666 | return | |
655 |
|
|
667 | ||
|
668 | datadec = None | |||
|
669 | ||||
656 | if dataOut.flagDataAsBlock: |
|
670 | if dataOut.flagDataAsBlock: | |
657 | """ |
|
671 | """ | |
658 | Decoding when data have been read as block, |
|
672 | Decoding when data have been read as block, | |
659 | """ |
|
673 | """ | |
660 | datadec = self.convolutionByBlockInTime(dataOut.data) |
|
674 | if mode == 0: | |
661 |
|
675 | datadec = self.__convolutionByBlockInTime(dataOut.data) | ||
|
676 | if mode == 1: | |||
|
677 | datadec = self.__convolutionByBlockInFreq(dataOut.data) | |||
662 | else: |
|
678 | else: | |
663 | """ |
|
679 | """ | |
664 | Decoding when data have been read profile by profile |
|
680 | Decoding when data have been read profile by profile | |
665 | """ |
|
681 | """ | |
666 | if mode == 0: |
|
682 | if mode == 0: | |
667 | datadec = self.convolutionInTime(dataOut.data) |
|
683 | datadec = self.__convolutionInTime(dataOut.data) | |
668 |
|
684 | |||
669 | if mode == 1: |
|
685 | if mode == 1: | |
670 | datadec = self.convolutionInFreq(dataOut.data) |
|
686 | datadec = self.__convolutionInFreq(dataOut.data) | |
671 |
|
687 | |||
672 | if mode == 2: |
|
688 | if mode == 2: | |
673 | datadec = self.convolutionInFreqOpt(dataOut.data) |
|
689 | datadec = self.__convolutionInFreqOpt(dataOut.data) | |
|
690 | ||||
|
691 | if datadec is None: | |||
|
692 | raise ValueError, "Codification mode selected is not valid: mode=%d. Try selecting 0 or 1" %mode | |||
674 |
|
693 | |||
675 | dataOut.code = self.code |
|
694 | dataOut.code = self.code | |
676 | dataOut.nCode = self.nCode |
|
695 | dataOut.nCode = self.nCode | |
@@ -678,7 +697,7 class Decoder(Operation): | |||||
678 |
|
697 | |||
679 | dataOut.data = datadec |
|
698 | dataOut.data = datadec | |
680 |
|
699 | |||
681 |
dataOut.heightList = dataOut.heightList[0: |
|
700 | dataOut.heightList = dataOut.heightList[0:datadec.shape[-1]] | |
682 |
|
701 | |||
683 | dataOut.flagDecodeData = True #asumo q la data esta decodificada |
|
702 | dataOut.flagDecodeData = True #asumo q la data esta decodificada | |
684 |
|
703 | |||
@@ -794,11 +813,6 class ProfileSelector(Operation): | |||||
794 |
|
813 | |||
795 | dataOut.flagNoData = True |
|
814 | dataOut.flagNoData = True | |
796 |
|
815 | |||
797 | if nProfiles: |
|
|||
798 | self.nProfiles = dataOut.nProfiles |
|
|||
799 | else: |
|
|||
800 | self.nProfiles = nProfiles |
|
|||
801 |
|
||||
802 | if dataOut.flagDataAsBlock: |
|
816 | if dataOut.flagDataAsBlock: | |
803 | """ |
|
817 | """ | |
804 | data dimension = [nChannels, nProfiles, nHeis] |
|
818 | data dimension = [nChannels, nProfiles, nHeis] | |
@@ -823,77 +837,81 class ProfileSelector(Operation): | |||||
823 |
|
837 | |||
824 | return True |
|
838 | return True | |
825 |
|
|
839 | ||
|
840 | """ | |||
|
841 | data dimension = [nChannels, nHeis] | |||
|
842 | """ | |||
|
843 | ||||
|
844 | if nProfiles: | |||
|
845 | self.nProfiles = nProfiles | |||
826 | else: |
|
846 | else: | |
827 | """ |
|
847 | self.nProfiles = dataOut.nProfiles | |
828 | data dimension = [nChannels, nHeis] |
|
848 | ||
|
849 | if profileList != None: | |||
829 |
|
850 | |||
830 | """ |
|
851 | dataOut.nProfiles = len(profileList) | |
831 | if profileList != None: |
|
|||
832 |
|
||||
833 | dataOut.nProfiles = len(profileList) |
|
|||
834 |
|
||||
835 | if self.isThisProfileInList(dataOut.profileIndex, profileList): |
|
|||
836 | dataOut.flagNoData = False |
|
|||
837 | dataOut.profileIndex = self.profileIndex |
|
|||
838 |
|
||||
839 | self.incIndex() |
|
|||
840 | return True |
|
|||
841 |
|
||||
842 |
|
852 | |||
843 | if profileRangeList != None: |
|
853 | if self.isThisProfileInList(dataOut.profileIndex, profileList): | |
844 |
|
854 | dataOut.flagNoData = False | ||
845 |
|
|
855 | dataOut.profileIndex = self.profileIndex | |
846 | maxIndex = profileRangeList[1] |
|
|||
847 |
|
||||
848 | dataOut.nProfiles = maxIndex - minIndex + 1 |
|
|||
849 |
|
856 | |||
850 | if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex): |
|
857 | self.incIndex() | |
851 | dataOut.flagNoData = False |
|
858 | return True | |
852 | dataOut.profileIndex = self.profileIndex |
|
859 | ||
853 |
|
860 | if profileRangeList != None: | ||
854 | self.incIndex() |
|
|||
855 | return True |
|
|||
856 |
|
861 | |||
857 | if rangeList != None: |
|
862 | minIndex = profileRangeList[0] | |
858 |
|
863 | maxIndex = profileRangeList[1] | ||
859 | nProfiles = 0 |
|
864 | ||
860 |
|
865 | dataOut.nProfiles = maxIndex - minIndex + 1 | ||
861 | for thisRange in rangeList: |
|
866 | ||
862 | minIndex = thisRange[0] |
|
867 | if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex): | |
863 | maxIndex = thisRange[1] |
|
868 | dataOut.flagNoData = False | |
864 |
|
869 | dataOut.profileIndex = self.profileIndex | ||
865 | nProfiles += maxIndex - minIndex + 1 |
|
|||
866 |
|
870 | |||
867 | dataOut.nProfiles = nProfiles |
|
871 | self.incIndex() | |
|
872 | return True | |||
|
873 | ||||
|
874 | if rangeList != None: | |||
|
875 | ||||
|
876 | nProfiles = 0 | |||
|
877 | ||||
|
878 | for thisRange in rangeList: | |||
|
879 | minIndex = thisRange[0] | |||
|
880 | maxIndex = thisRange[1] | |||
|
881 | ||||
|
882 | nProfiles += maxIndex - minIndex + 1 | |||
|
883 | ||||
|
884 | dataOut.nProfiles = nProfiles | |||
|
885 | ||||
|
886 | for thisRange in rangeList: | |||
868 |
|
887 | |||
869 |
|
|
888 | minIndex = thisRange[0] | |
|
889 | maxIndex = thisRange[1] | |||
|
890 | ||||
|
891 | if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex): | |||
870 |
|
892 | |||
871 | minIndex = thisRange[0] |
|
|||
872 | maxIndex = thisRange[1] |
|
|||
873 |
|
||||
874 | if self.isThisProfileInRange(dataOut.profileIndex, minIndex, maxIndex): |
|
|||
875 |
|
||||
876 | # print "profileIndex = ", dataOut.profileIndex |
|
893 | # print "profileIndex = ", dataOut.profileIndex | |
877 |
|
||||
878 | dataOut.flagNoData = False |
|
|||
879 | dataOut.profileIndex = self.profileIndex |
|
|||
880 |
|
||||
881 | self.incIndex() |
|
|||
882 | break |
|
|||
883 | return True |
|
|||
884 |
|
894 | |||
885 |
|
||||
886 | if beam != None: #beam is only for AMISR data |
|
|||
887 | if self.isThisProfileInList(dataOut.profileIndex, dataOut.beamRangeDict[beam]): |
|
|||
888 | dataOut.flagNoData = False |
|
895 | dataOut.flagNoData = False | |
889 | dataOut.profileIndex = self.profileIndex |
|
896 | dataOut.profileIndex = self.profileIndex | |
890 |
|
897 | |||
891 | self.incIndex() |
|
898 | self.incIndex() | |
892 |
|
|
899 | break | |
|
900 | return True | |||
|
901 | ||||
|
902 | ||||
|
903 | if beam != None: #beam is only for AMISR data | |||
|
904 | if self.isThisProfileInList(dataOut.profileIndex, dataOut.beamRangeDict[beam]): | |||
|
905 | dataOut.flagNoData = False | |||
|
906 | dataOut.profileIndex = self.profileIndex | |||
|
907 | ||||
|
908 | self.incIndex() | |||
|
909 | ||||
|
910 | return True | |||
893 |
|
911 | |||
894 | raise ValueError, "ProfileSelector needs profileList, profileRangeList or rangeList parameter" |
|
912 | raise ValueError, "ProfileSelector needs profileList, profileRangeList or rangeList parameter" | |
895 |
|
913 | |||
896 |
return |
|
914 | return False | |
897 |
|
915 | |||
898 |
|
916 | |||
899 |
|
917 |
General Comments 0
You need to be logged in to leave comments.
Login now