File: CORREL.MC of Tape: Various/ETH/eth11-3
(Source file text)
.TITLE THE AUTO/CROSS CORRELATION FUNCTION SUBROUTINE(CORREL) ;LABORATORY SUBROUTINES ;DEC-11 ;FILE CORREL.MAC ;FILE ID CORREL.1 .CSECT FCOREL ; COPYRIGHT (C) 1976 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; ; ; ;LDP SOFTWARE DEVELOPMENT GROUP SEPTEMBER, 1977. .SBTTL CONDITIONALS, GLOBALS AND MACROS ;CONDITIONAL ASSEMBLY PARAMETERS ; DEFINE PARAMETERS BY REMOVING FIRST ";" IN LINE WHICH ; PRECEEDS THE APPROPRIATE PARAMETER. ;EIS=1 ;EAE=1 .IF DF,EAE DIV=177300 AC=DIV+2 MQ=AC+2 MUL=MQ+2 EAESR=MUL+3 .ENDC ;CONDITIONAL ASSEMBLY PARAMETER DESCRIPTIONS ;EIS "EIS" SHOULD BE DEFINED IF EIS(KE11-E) HARDWARE IS AVAILABLE ; ON THE SYSTEM WHERE THIS SOFTWARE IS TO BE USED. IF NOT DEFINED, ; SUBROUTINES WHICH MIMIC THE REQUIRED FUNCTIONS OF THIS HARDWARE ; ARE ASSEMBLED AND SUBSTITUTED. ; ;EAE "EAE" SHOULD BE DEFINED IF EIS HARDWARE IS NOT AVAILABLE BUT ; THE EAE IS. ; NOTE: IF EAE HARDWARE IS AVAILABLE AND IS TO BE USED, THE ; DEFAULT ADDRESSES ASSOCIATED WITH THE DEVICE ARE USED. ; IF YOUR "EAE" IS NOT INSTALLED AT THE NORMAL LOCATIONS ; THE DEFAULT ADDRESSES OF THE STATUS WORDS SHOULD BE ; MODIFIED TO REFLECT THIS DESCREPENCY BY REDEFINING "DIV" ; BY EDITING THIS FILE AND SETTING IT EQUAL TO THE STARTING ; ADDRESS OF THE STATUS WORDS ASSOCIATED WITH THE "EAE". ;GLOBALS ; -EXTERNAL .GLOBL FFT,$F.R .IF NDF,EIS .IF NDF,EAE .GLOBL $F.MUL NON=1 .ENDC .ENDC ;INTERNAL .GLOBL CORREL ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .IF DF EAE F.PROD= AC F.MPLI= MQ F.MCND= MUL F.SHFT= MUL+10 .ENDC .SBTTL FORMAT OF CALL IS AS FOLLOWS ; ; CALL CORREL(IERROR,N,IA1,IA2,IFFTA,ISCAL) ; WHERE ; IERROR IS AN INTEGER VALUE RETURNED BY THE SUBROUTINE TO ; INDICATE A POSSIBLE ERROR CONDITION. ; = 0 => NO ERRORS ; = 1 => N IS LESS THAN OR EQUAL TO 8 ; = 2 => N IS GREATER THAN F.MAXN(ASSEMBLY PARAMETER) ; = 3 => N IS NOT A POWER OF 2 ; < 0 => NUMBER OF ARGUMENTS IS WRONG OR AN ARGUMENT IS ; DEFAULTED. ; !!!NOTE:!!! ; IF THIS ARGUMENT IS OMITTED A FATAL ERROR WILL OCCUR ; AS AN M-TRAP OR IN FORTRAN ERR 62 ; N = THE NUMBER OF POINTS IN THE INTEGER ARRAYS "IA1" AND "IA2" ; IA1 => AN INTEGER ARRAY OF LENGTH AT LEAST "N" CONTAINING ; THE SAMPLES FOR THE FIRST FUNCTION TO BE CORRELATED. ; *** ALSO UPON RETURNED, THIS ARRAY WILL CONTAIN THE RAW ; INTEGER ESTIMATE FOR THE CORRELATION FUNCTION. THIS DATA ; SHOULD BE SCALED(SEE "ISCALE") TO OBTAIN ACTUAL RESULTS. ; IA2 => AN INTEGER ARRAY OF LENGTH AT LEAST "N" CONTAINING ; THE SAMPLES FOR THE SECOND FUNCTION TO BE CORRELATED WITH ; THE FIRST. ; NOTE: IF AUTO-CORRELLATION IS DESIRED, "IA1" SHOULD ; ALSO BE "IA2". ; IFFTA => AN INTEGER ARRAY TO BE USED BY THE SUBROUTINE AS ; A STORAGE AREA FOR THE IMAGINARY RESULTS FROM THE ; "FFT" SUBROUTINE(SEE CHAPTER 9). THE LENGTH OF THIS ; ARRAY DEPENDS ON WHETHER AUTO- OR CROSS-CORRELLATION ; IS DESIRED. THAT IS IF ; 1)"IA1" = "IA2" THEN ARRAY "IFFTA" MUST BE ; AT LEAST OF LENGTH "N". ; 2)"IA1" DOES NOT EQUAL "IA2", THEN ARRAY "FFTA" ; MUST BE AT LEAST OF LENGTH 2*"N". ; ISCALE = IS THE POWER OF TWO(2), RETURNED BY THE SUBROUTINE, ; BY WHICH THE OUTPUT DATA MUST BE MULTIPLIED IN ORDER ; TO OBTAIN ACTUAL RESULTS .SBTTL CORRELATION ENTRY AND INITIALIZATION CORREL: MOVB @R5,R1 ;CHECK FOR SOME ARGUMENTS BNE SOME ;IF SOME, BRANCH ; !!! NOTE INTENTIONAL M-TRAP IF FIRST ARG NOT PRESENT TRAPER: MOV R0,1 ;OTHERWISE, TRAP ; SOME: TST (R5)+ ;GET TO NEXT ENTRY MOV #-1,R3 ;NEED TO CHECK FOR DEFAULTED ARGUMENTS CMP R3,@R5 ;CHECK IF DEFAULTED BEQ TRAPER ;IF DEFAUTED, GO M-TRAP MOV @R5,C.ERR1 ;STORE ADDRESS FOR ERROR RETURN MOV (R5)+,C.ERR2 ;DITTO MOV R5,R0 ;GET COPY OF ARG. LIST POINTER MOV #5,R2 ;STORE COUNT OF ARG. FOR ERROR INDICATOR CMP R1,#6 ;CHECK FOR CORRECT NO. OF ARGS BLT 14$ ;IF NOT, EXIT WITH ERROR ADD #12,R0 ;POINT TO END OF LIST 13$: CMP R3,-(R0) ;CHECK EACH ARGUMENT FOR NO DEFAULT BNE 12$ ;IF NOT DEFAULTED, BRANCH 14$: COM R2 ;SET ERROR TO NEG. OF MISSING ARGUMENT MOV R2,@C.ERR1 ;SET ERROR INDICATOR RTS PC ;OTHERWISE RETURN WITH ERROR 12$: DEC R2 ;LOOP FOR 5 ARGS. BNE 13$ MOV @(R5)+,R0 ;GET NO. OF POINTS MOV R0,C.N ;SAVE NO. OF POINTS FOR FFT BGT 11$ ;IF G.E. ZERO, BRANCH MOV #1,@C.ERR1 ;INDICATE ERROR RTS PC ;AND RETURN 11$: MOV (R5)+,-(SP) ;GET FIRST ARRAY - SP WILL BE FLAG MOV @SP,C.REP1 ;STORE FIRST REAL ARRAY ADDRESS MOV (R5)+,C.REP2 ;GET SECOND ARRAY MOV (R5)+,R1 ;GET ADDRESS OF DUMMY ARRAY FOR FFT ; THIS ARRAY IS USED FOR IMAG. PARTS MOV R1,C.IMP1 ;STORE ADDRESS FOR FIRST REAL ARRAY MOV R1,R2 ;PREPARE ADDRESS FOR 2ND REAL ARRAY SUB C.REP2,(SP) ;CHECK FOR AUTO-CORRELATION BEQ 2$ ;IF AUTO-CORRELATION, BRANCH ADD R0,R2 ;POINT TO HALF POINT IN DUMMY ARRAY ADD R0,R2 ; BY ADDING WORD COUNT TWICE 2$: MOV R2,C.IMP2 ;GET SECOND SCRATCH AREA ;CLEAR IMAG1 TWICE. C.CLR1: CLR (R1)+ CLR (R2)+ DEC R0 BNE C.CLR1 NORMAL: MOV @R5,C.SCLF ;GET ADDRESS OF SCALE FACTOR MOV #-16.,@(R5)+ ;NUMBERS WILL BE SCALED BY ; 2**16 MOV #15.,R4 ;PREPARE SCALE FACTOR MOV C.REP1,R1 ;GET ADDRESS OF REAL ARRAY INC R0 ;SET INITIAL TEST FOR MAXIMUM JSR PC,CHECKH ;CHECK FOR HIGHEST TST (SP) ;CHECK FOR AUTO CROSS BEQ 3$ ;IF AUTO, SKIP CHECK FOR HIGH IN ARRAY2 MOV C.REP2,R1 ;OTHERWISE CHECK ARRAY 2 JSR PC,CHECKH ;CHECK FOR HIGHEST IN ARRAY 2 3$: MOV C.REP1,R0 MOV C.REP2,R1 ASL R4 ;SCALING FOR BOTH ARRAYS ADD R4,@C.SCLF ;UPDATE CURRENT SCALE FACTOR ASR R4 ;RESTORE SCALE FACTOR/ARRAY MOV C.N,R2 ;GET BUFFER LENGTH DEC R4 ;SET COUNT FOR SHIFT COUNT IN "SCALE" TST (SP) ;TEST FOR CROSS CORRELATION BNE 5$ ;BRANCH IF CROSS CORRELATION ADD R2,R1 ;IF AUTO, DIVIDE ARRAY IN HALF ASR R2 ; AND NO. OF POINTS FOR SCALING 5$: MOV R4,R3 ;USE NO. OF SHIFTS MINUS ONE AS COUNT BEQ 7$ ;IF ONLY ONE SHIFT, BRANCH 6$: ASL (R0) ;SHIFT REAL ASL (R1) ; AND THEN IMAGINARY PARTS DEC R3 ;LOOP THROUGH SHIFTS BNE 6$ 7$: ASL (R0)+ ;LAST SHIFT ON ARRAYS DONE HERE TO ASL (R1)+ ; UPDATE ADDRESS ALSO DEC R2 ;IS WHOLE ARRAY DONE BNE 5$ ;IF NOT, DO AGAIN NONORM: CLR (PC)+ ;INDICATE FORWARD TRANSFORM C.INVF: .WORD 0 .SBTTL CORRELATION FFT CALLS ;PERFORM TRANSFORM ON BUFFER 1 C.FF1: MOV #FFT1,R5 ;GET ADDRESS OF ADDRESSES FOR FFT JSR PC,FFT ;DO FFT ON FIRST ARRAY TST @C.ERR1 ;TEST FOR FFT ERROR BEQ C.CON1 TST (SP)+ ;POP STACK RTS PC ;AND RETURN C.CON1: MOV $F.R,R1 ;R1 = LOG2(# POINTS)-2 CMPB (R1)+,(R1)+ ;R1 = LOG2(# POINTS) ASL R1 ;R1 = 2*LOG2(# POINTS) = "INTSF" SUB (PC)+,R1 ;R1 = "INTSF"-SCL1 C.SCAL: .WORD 0 ADD R1,@(PC)+ ;ADD AMOUNT NEEDED TO NORMALIZE C.SCLF: .WORD 0 ; SCALE FACTOR TST (SP) ;AUTO OR CROSS CORRELATION? BEQ C.CRSP ;BR IF AUTO ;PERFORM TRANSFORM ON BUFFER 2 MOV #FFT2,R5 JSR PC,FFT ;DO SECOND FFT ;SINCE FFT TYPE ERRORS ARE FOUND IN THE CALL ABOVE, NO TEST ;IS NEEDED HERE. SUB C.SCAL,@C.SCLF ;SF = NORM.SHIFT+"INTSF"-SCL1-SCL2 .SBTTL COMPUTATION OF CROSS POWER SPECTRUM - EAE VERSION ;CROSS POWER SPECTRUM OF COMPLEX FREQUENCY DOMAIN BUFFERS ;"A" (S1=REAL, S3=IMAG) AND "B" (S2=REAL, S4=IMAG) YIELDS "C" ;(S1=REAL, S2=IMAG). ;REAL(C) = REAL(A)*REAL(B) + IMAG(A)*IMAG(B) ;IMAG(C) = IMAG(A)*REAL(B) - REAL(A)*IMAG(B) C.CRSP: MOV C.REP1,R0 MOV C.IMP1,R1 MOV C.REP2,R2 MOV C.IMP2,R3 MOV C.N,(PC)+ ;SET TEMP COUNT C.TMPN: .WORD 0 MOV (SP)+,(PC)+ ;STORE AUTO/CROSS SWITCH C.SWIT: 0 BNE C.CSP1 ;BR IF CROSS CORRELATION MOV R0,R2 ;C.REP1 REPLACED C.REP2 MOV R1,R3 ;C.IMP1 REPLACES C.IMP2 SUB C.SCAL,@C.SCLF ;SCLF = NORM.FACTOR+"INTSF"-SCL1-SCL1 C.CSP1: .IF DF,EAE MOV #F.MPLI,R4 ;EAE HARDWARE ADDRESSES MOV #F.PROD,R5 MOV (R0),(R4)+ ;MPLI=REAL(A) MOV (R2),(R4) ;MCND=REAL(B) MOV (R5),(PC)+ ;TMPR=REAL(A)*REAL(B) C.TMPR: 0 ;TEMPORARY FOR REAL PART OF XPROD MOV (R1),-(R4) ;MPLI=IMAG(A) MOV (R3),@#F.MCND ;MCND=IMAG(B) ADD (R5),C.TMPR ;TMPR=REAL(A)*REAL(B)+IMAG(A)*IMAG(B) BVS C.OFLO ;GO SCALE IF OVERFLOW MOV (R1),(R4)+ ;MPLI=IMAG(A) MOV (R2),(R4) ;MCND=REAL(B) MOV (R5),(PC)+ ;TMPI=IMAG(A)*REAL(B) C.TMPI: 0 ;TEMPORARY FOR IMAG PART OF XPROD MOV (R0),-(R4) ;MPLI=REAL(A) MOV (R3),@#F.MCND ;MCND=IMAG(B) SUB (R5),C.TMPI ;TMPI=IMAG(A)*REAL(B)-REAL(A)*IMAG(B) BVS C.OFLO ;GO SCALE IF OVERFLOW MOV C.TMPR,(R0)+ ;STORE XPROD IN S1 AND S2 MOV C.TMPI,(R1)+ ;AND INCREMENT POINTERS CMP (R2)+,(R3)+ DEC C.TMPN ;ARE WE DONE? BNE C.CSP1 ;BR IF MORE TO DO .ENDC .SBTTL DITTO - EIS VERSION .IF DF,EIS MOV (R0),R4 ;MPLI=REAL(A) MUL (R2),R4 ;MCND=REAL(B) MOV R4,(PC)+ ;TMPR=REAL(A)*REAL(B) C.TMPR: 0 MOV (R1),R4 ;MPLI=IMAG(A) MUL (R3),R4 ;MCND=IMAG(B) ADD R4,C.TMPR ;TMPR=REAL(A)*REAL(B)+IMAG(A)*IMAG(B) BVS C.OFLO ;GO SCALE IF OVERFLOW MOV (R1),R4 ;MPLI=IMAG(A) MUL (R2),R4 ;MCND=REAL(B) MOV R4,(PC)+ ;TMPI=IMAG(A)*REAL(B) C.TMPI: 0 MOV (R0),R4 ;MPLI=REAL(A) MUL (R3),R4 ;MCND=IMAG(B) SUB R4,C.TMPI ;TMPI=IMAG(A)*REAL(B)-REAL(A)*IMAG(B) BVS C.OFLO ;SCALE IF OVERFLOW MOV C.TMPR,(R0)+ ;STORE XPROD IN SI & SJ OR SK IF XCORR MOV C.TMPI,(R1)+ ;AND INCREMENT POINTERS CMP (R2)+,(R3)+ DEC C.TMPN ;ARE WE DONE? BNE C.CSP1 ;BR IF MORE TO DO .ENDC .SBTTL DITTO - NON VERSION .IF DF,NON MOV R2,-(SP) ;MULTIPLY SUBR ZAPS R2-R5 MOV R3,-(SP) MOV (R2),(PC)+ ;REAL(B) C.BR: 0 MOV (R3),(PC)+ ;IMAG(B) C.BI: 0 MOV (R0),R4 ;MPLI=REAL(A) MOV C.BR,R5 ;MCND=REAL(B) JSR PC,$F.MUL ASR R3 MOV R3,(PC)+ ;TMPR=REAL(A)*REAL(B) C.TMPR: 0 MOV (R1),R4 ;MPLI=IMAG(A) MOV C.BI,R5 ;MCND=IMAG(B) JSR PC,$F.MUL ASR R3 ADD R3,C.TMPR ;TMPR=REAL(A)*REAL(B)+IMAG(A)*IMAG(B) BVS C.OFLO ;SCALE IF OVERFLOW MOV (R1),R4 ;MPLI=IMAG(A) MOV C.BR,R5 ;MCND=REAL(B) JSR PC,$F.MUL ASR R3 MOV R3,(PC)+ ;TMPI=IMAG(A)*REAL(B) C.TMPI: 0 MOV (R0),R4 ;MPLI=REAL(A) MOV C.BI,R5 ;MCND=IMAG(B) JSR PC,$F.MUL ASR R3 SUB R3,C.TMPI ;TMPI=IMAG(A)*REAL(B)-REAL(A)*IMAG(B) BVS C.OFLO ;SCALE IF OVERFLOW MOV (SP)+,R3 ;RESTORE POINTERS MOV (SP)+,R2 MOV C.TMPR,(R0)+ ;STORE XPROD IN SI & SJ OR SK IF XCORR MOV C.TMPI,(R1)+ ;AND INCREMENT POINTERS CMP (R2)+,(R3)+ DEC C.TMPN ;ARE WE DONE? BNE C.CSP1 .ENDC .SBTTL COMPUTE CORRELATION COEFFICIENTS INC C.INVF ;SET FOR INVERSE TRANSFORM MOV #FFT1,R5 JSR PC,FFT ;PRODUCE AUTO- OR CROSSCORRELATION ;NO FFT ERROR CHECKING IS DONE HERE SINCE FFT TYPE ERRORS WOULD ;HAVE BEEN DETECTED IN THE FIRST CALL. SUB C.SCAL,@C.SCLF ;SCLF=SCLF-SCL1(FROM FFT) NEG @C.SCLF ;SCLF=-SCLF RTS PC ;RETURN FROM WHENCE WE CAME. .SBTTL SCALING ROUTINE C.OFLO: .IF DF,NON MOV (SP)+,R3 ;RESTORE POINTERS MOV (SP)+,R2 .ENDC SUB #2,@C.SCLF ;UPDATE THE SCALE FACTOR MOV C.REP1,R4 MOV C.IMP1,R5 MOV C.N,-(SP) ;TOTAL NUMBER OF POINTS SUB C.TMPN,(SP) ;MINUS NUMBER LEFT TO SQ & SUM BEQ C.OFL2 ;BR IF OVERFLOW ON FIRST POINTS C.OFL1: ASR (R4) ;SCALE THE CROSS PRODUCTS ASR (R4)+ ;ALREADY CALCULATED TST C.SWIT ;AUTO OR CROSS CORR? BEQ C.OFL4 ;BR IF AUTO ASR (R5) ASR (R5)+ C.OFL4: DEC (SP) ;REDUCE NUMBER OF XPRODS REMAINING BNE C.OFL1 ;BR IF MORE TO GO ;SCALE REMAINING FREQUENCY DOMAIN C.OFL2: MOV R2,(SP) ;TOP OF STACK IS TEMPORARY MOV R3,-(SP) ;WE NEED REGISTERS 2 & 3 MOV C.TMPN,-(SP) ;AGAIN TOP OF STACK IS TEMP C.OFL3: ASR (R2)+ ASR (R3)+ TST C.SWIT ;AUTO OR CROSS CORR? BEQ C.OFL5 ;BR IF AUTO ASR (R4)+ ASR (R5)+ C.OFL5: DEC (SP) BNE C.OFL3 TST (SP)+ ;CLEAR TEMPORARY OFF STACK MOV (SP)+,R3 ;RESTORE POINTERS IN R1 & R3 MOV (SP)+,R2 BR C.CSP1 ;ROUTINE TO CHECK FOR HIGHEST NUMBERS CHECKH: MOV (PC)+,R3 ;GET ARRAY LENGTH C.N: .WORD 0 1$: MOV (R1)+,R2 ;GET NEXT VALUE BGE 2$ ;IF POSITIVE, BRANCH NEG R2 ;OTHERWISE MAKE POSITIVE 2$: CMP R0,R2 ;CHECK FOR HIGHER VALUE BHI 3$ ;IF TESTER "R0" IS HIGHER, BRANCH DEC R4 ;INC POWER OF TWO SCALE FACTOR ASL R0 ;OTHERWISE, DOUBLE TESTER BPL 2$ ;IF NOT MAXIMUM, TEST AGAIN TST (SP)+ ;IF MAXIMUM, NUMBERS ALREADY NORMALIZE JMP NONORM ; SO FIX UP STACK, AND CONTINUE 3$: DEC R3 ;LOOP TILL DONE ARRAY BNE 1$ RTS PC ;AND THEN LEAVE ;CORRELATION DATA AREA ;FFT TABLE FOR COMPLEX ARRAY A FFT1: 6 ;NO. OF ELEMENTS IN CALL C.ERR1: 0 C.N1: C.N ;NUMBER OF POINTS C.REP1: 0 ;POINTER TO REAL(A) C.IMP1: 0 ;POINTER TO IMAG(A) C.INV1: C.INVF ;DIRECTION OF TRANSFORM C.SCL1: C.SCAL ;SCALE FACTOR COMPUTED BY FFTC ;TABLE FOR COMPLEX ARRAY B FFT2: 6 ;NO. OF ELEMENTS IN CALL TO FFT C.ERR2: 0 C.N2: C.N C.REP2: 0 C.IMP2: 0 C.INV2: C.INVF C.SCL2: C.SCAL .END