/* This C language subroutine computes the crosscoherence sequence of its floating point inputs. The Run Time Library for the C Language. Gordon A. Sterling (617) 461 - 3076 DSP Development Tools Engineering Created on 5/27/90 Updated on 5/94 by AS #include
float crosscoh(float out[], float x[], \ float y[], int samples, int lags); */ #include "lib_glob.h" #include "sts_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL _crosscoh; _crosscoh: put(R5); put(R6); put(R7); put(R9); put(R11); R2=dma_i; put(R2); R2=dmb_i; put(R2); R5=PASS R4, readparam4(R9); readparam5(R6); F12=FLOAT R9, dm_lnt=dm_0; CALL (PC, ___float_divide) (DB); F11=2.0; F7=1.0; R4=R4-R4, dm_ptr=R8; /*Clear sum, Pt to input*/ R1=R9-1, F0=DM(dm_ptr,dm_1); IF LE JUMP (PC, error_return); /*Must have > 1 point*/ LCNTR=R1, DO sum UNTIL LCE; sum: F4=F4+F0, F0=DM(dm_ptr,dm_1); F4=F4+F0, dm_ptr=R12; F5=F4*F7, R2=R5; R4=R4-R4, F0=DM(dm_ptr,dm_1); /*Clear sum*/ LCNTR=R1, DO sum2 UNTIL LCE; sum2: F4=F4+F0, F0=DM(dm_ptr,dm_1); F4=F4+F0; F4=F4*F7; F5=F4*F5, R11=R12; /*Mean*Mean*/ R1=PASS R8, dm_ptr=R2; LCNTR=R6, DO lag_loop UNTIL LCE; R9=R9-1, dma_i=R11; R0=R0-R0, dmb_i=R1; F4=DM(dmb_i,1); F8=DM(dma_i,1); LCNTR=R9, DO element_loop UNTIL LCE; F8=F8*F4, F4=DM(dmb_i,1); element_loop: F0=F0+F8, F8=DM(dma_i,1); F8=F8*F4; F0=F0+F8; F0=F0*F7; F0=F0-F5; lag_loop: R11=R11+1, DM(dm_ptr,dm_1)=F0; R0=PASS R2, FETCH_RETURN restore_state: get(dmb_i,1); get(dma_i,2); get(R11,3); get(R9,4); get(R7,5); get(R6,6); get(R5,7); RETURN (DB); RESTORE_STACK RESTORE_FRAME error_return: JUMP (PC, restore_state) (DB); R0=0; FETCH_RETURN .ENDSEG;