{ THIS SECTION PRINTS THE TITLE AND REFERANCE INFO } LABEL 100,200,300,400,500; BEGIN CLRSCR;MF:=0.0; SAME_TYPE:=FALSE; { NOT EDITING SO SET TO FALSE } WRITELN(' RF NETWORK ANALYSIS PROGRAM'); WRITELN(' by: WILLIAM L. MUNSON'); WRITELN(' VERSION 1.1 - OCT. 22 1987'); WRITELN; WRITELN('NETWORK may be used for non-commercial purposes only.'); WRITELN('No commercial use of NETWORK may be made without the'); WRITELN('author',chr(39),'s express written permission.');WRITELN; WRITELN('1) Units are ohms, nH, pF, Mhz and inches.'); writeln('2) Maximum number of sections is Two Hundred.'); writeln('3) IL(DB)= Insertion loss in dB.'); writeln('4) RL(DB)= Return loss in dB.'); writeln('5) VSWR = Volatage Standing Wave Ratio.'); writeln('6) RHO = Reflection Coefficient.'); writeln('7) ZIN(R)= Real part of input impedance.'); writeln('8) ZIN(I)= Imag. part of input impedance.');writeln; WRITELN('NOTE: The load resistance can be entered as a complex number.'); writeln; { THIS SECTION CHECKS FOR INPUT FROM FILE REQUEST } BEGIN { THIS SECTION CLEARS ALL OF THE ARRAYS TO 0 } I:=1; REPEAT; R[I]:=0; C[I]:=0; L[I]:=0; ET[I]:=0; I:=I+1 UNTIL I=201; 300: WRITE('DO YOU WANT A (N)EW OR A (S)AVED NETWORK? ');READLN(Q1); IF (Q1='S') OR (Q1='s') THEN BEGIN CLRSCR; WRITE('DO YOU WANT A DIRECTORY (Y/N)? ');READLN(FILENAME); WRITELN; IF (FILENAME='Y') OR (FILENAME='y') THEN FILES; WRITELN;WRITELN;WRITE('WHAT IS THE NAME OF THE FILE? ');READLN(FILENAME); ASSIGN(SAVEFILE,FILENAME); RESET(SAVEFILE); READLN(SAVEFILE,DATA); {READ NUMBER OF SECTIONS} REMOVEBLANKS; VAL(DATA,NS,CODE); READLN(SAVEFILE,DATA); {READ SOURCE RESISTANCE} REMOVEBLANKS; VAL(DATA,RS,CODE); READLN(SAVEFILE,DATA); REMOVEBLANKS; VAL(DATA,RL,CODE); FOR N:=1 TO NS DO BEGIN READLN(SAVEFILE,DATA); REMOVEBLANKS; VAL(DATA,ET[N],CODE); READLN(SAVEFILE,DATA); REMOVEBLANKS; VAL(DATA,R[N],CODE); READLN(SAVEFILE,DATA); REMOVEBLANKS; VAL(DATA,L[N],CODE); READLN(SAVEFILE,DATA); REMOVEBLANKS; VAL(DATA,C[N],CODE); END; CLOSE(SAVEFILE); END; { THIS SECTION INPUTS AND CHECKS THE NUMBER OF CIRCUIT ELEMENTS } IF (Q1<>'S') AND (Q1<>'s') THEN BEGIN CORRECT:=FALSE; REPEAT; WRITELN('HOW MANY SECTIONS [MAX=200]'); WRITE('(DONT COUNT THE LOADS)? ');READLN(NS); IF (NS>0) AND (NS<=200) THEN CORRECT:=TRUE UNTIL CORRECT; CORRECT:=FALSE; REPEAT; WRITELN;WRITE('ENTER THE SOURCE RESISTANCE (OHMS)? '); READLN(RS);IF RS>0.0 THEN CORRECT:=TRUE; UNTIL CORRECT; CORRECT:=FALSE; { THIS SECTION ENTERS THE COMPONENT VALUES INTO THE ARRAYS } N:=1; REPEAT; ENTER_ELEMENT_TYPE; N:=N+1; UNTIL N>NS; CLRSCR; { THIS SECTION ENTERS THE LOAD RESISTANCE } 500: CORRECT:=FALSE; BEGIN WRITELN('TO ENTER A COMPLEX NUMBER FOR THE LOAD VALUE.'); WRITELN('USE THE SERIES EQUIVALENT FORM EG.- (1.28+J12.45) or (1.28-J12.45)'); WRITELN; REPEAT; WRITELN;WRITE('LOAD RESISTANCE (OHMS)? ');READLN(DATA); UNTIL LENGTH(DATA)>0; CORRECT:=FALSE; IF POS('J',DATA)>0 THEN CORRECT:=TRUE; IF POS('j',DATA)>0 THEN CORRECT:=TRUE; IF CORRECT THEN BEGIN WRITELN;WRITELN('WHAT IS THE FREQ. THAT THE COMPLEX NUMBER IS SPECIFIED AT? '); WRITE('FREQUENCY (Mhz)? '); READLN(FREQ); NS:=NS+1;N:=N+1; {MAKE ROOM FOR ONE MORE SECTION } POSITION:=POS('+',DATA); IF POSITION>0 THEN BEGIN RESIST:=COPY(DATA,1,POSITION-1); IMAG:=COPY(DATA,POSITION+2,LENGTH(DATA)-POSITION); INDUCT:=TRUE; CALC_VALUES; END; POSITION:=POS('-',DATA); IF POSITION>0 THEN BEGIN RESIST:=COPY(DATA,1,POSITION-1); IMAG:=COPY(DATA,POSITION+2,LENGTH(DATA)-POSITION); INDUCT:=FALSE; CALC_VALUES; END; END; { THE NUMBER MUST NOT BE COMPLEX SO ASSUME IT IS JUST A SIMPLE VALUE } IF NOT CORRECT THEN BEGIN REMOVEBLANKS; {REMOVE ALL ILLEGAL CHAR FROM THE STRING} VAL(DATA,RL,CODE); IF CODE>0 THEN GOTO 500; END; END; END; { THIS SECTION EDITS THE ELEMENT VALUES } WRITELN;WRITE('EDIT ELEMENTS (Y/N)? ');READLN(Q1); 200: IF (Q1='Y') OR (Q1='y') THEN BEGIN WRITELN(' '); PRINT_ELEMENT_TABLE; REPEAT; WRITE('ENTER (S)OURCE, (L)OAD, ELEMENT #, OR (Q) TO QUIT ? '); READLN(Q1); IF (Q1='S') OR (Q1='s') THEN BEGIN WRITE('SOURCE RESISTANCE (OHMS)? ');READLN(RS); PRINT_ELEMENT_TABLE; END; IF (Q1='L') OR (Q1='l') THEN BEGIN WRITE('LOAD RESISTANCE (OHMS)? ');READLN(RL); PRINT_ELEMENT_TABLE; END; VAL(Q1,N,CODE); IF (CODE=0) AND (N>0) AND (N<=NS) THEN BEGIN WRITELN;WRITE('CHANGE ELEMENT TYPE (Y/N)? ');READLN(Q1); IF (Q1='Y') OR (Q1='y') THEN SAME_TYPE:=FALSE ELSE SAME_TYPE:=TRUE; ENTER_ELEMENT_TYPE;SAME_TYPE:=FALSE; PRINT_ELEMENT_TABLE; END; UNTIL (Q1='Q') OR (Q1='q'); END; { THIS SECTION DEFINES OR EDITS THE FREQUENCY RANGE } CLRSCR; IF MF>0 THEN BEGIN WRITE('SAME FREQUENCY RANGE (Y/N)? ');READLN(Q1); END; 100: IF (Q1='N') OR (Q1='n') OR (MF=0.0) THEN BEGIN WRITE('START FREQUENCY (Mhz)? ');READLN(MF); WRITE('STEP FREQUENCY (Mhz)? ');READLN(DF); WRITE('NUMBER OF STEPS ? ');READLN(NF);NF:=NF-1; END; WRITE('OUTPUT TO (S)CREEN OR (P)RINTER? ');READLN(Q1); IF Q1='p' THEN Q1:='P'; IF Q1='P' THEN BEGIN WRITELN('ENTER A DESCRIPTION OF THE NETWORK TO BE USED AS A HEADER ON THE PRINTOUT.'); WRITE('? ');READLN(DESCRIPTION); END; CLRSCR; { THIS SECTION PRINTS THE HEADER INFO FOR THE SCREEN AND IF SELECTED FOR THE PRINTER } WRITELN(' FREQ(Mhz) IL(DB) RL(DB) VSWR RHO ZIN(R) ZIN(I)'); IF Q1='P' THEN BEGIN WRITELN(LST,' =================================== '); WRITELN(LST,' RF NETWORK ANALYSIS PROGRAM VER 1.1'); WRITELN(LST,' ==================================='); WRITELN(LST,'');WRITELN(LST,DESCRIPTION);WRITELN(LST,''); WRITELN(LST,'NETWORK LISTING.');WRITELN(LST,''); WRITELN(LST,'ELEM TYPE DESCRIPTION R L C'); WRITELN(LST,' (ZO) (L) (E)'); WRITELN(LST,'SOURCE R ',RS:14:3); N:=1;REPEAT; WRITE(LST,N:2,ET[N]:7,' '); PRINT_TYPE; WRITELN(LST,R[N]:14:3,L[N]:14:3,C[N]:14:3); N:=N+1; UNTIL N>NS; WRITELN(LST,'LOAD R ',RL:14:3); WRITELN(LST,'');WRITELN(LST,'NOTE: R,L,C ARE FOR ELEMENT TYPES 1-11.'); WRITELN(LST,' ZO,L,E ARE FOR ELEMENT TYPES 12-16.');WRITELN(LST,''); WRITELN(LST,' FREQ(Mhz) IL(DB) RL(DB) VSWR RHO ZIN(R) ZIN(I)'); END; { THIS SECTION SETS UP THE LOOPS WHICH CALCULATE THE GAIN AND IMPEDANCE OF THE NETWORK.} CO:=MF+DF*NF*FR;K:=0.0; WHILE K<=NF DO (* THIS IS THE START OF THE 'K' LOOP WHICH ENDS WHEN K>NF *) BEGIN F:=(MF+K*DF)*FR;W:=2.0*PI*F; A1:=1.0;D1:=1.0;A4:=0.0;B1:=0.0;B4:=0.0;C1:=0.0;C4:=0.0;D4:=0.0; N:=1; WHILE N<=NS DO { THIS IS THE START OF THE 'N' LOOP WHICH ENDS WHEN N>NS } BEGIN IF ET[N]=1 THEN BEGIN RA:=1.0;IA:=0.0;RB:=R[N];IB:=0.0;RC:=0.0;IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=2 THEN BEGIN RA:=1.0;IA:=0.0;RB:=0.0;IB:=0.0;RC:=1.0/R[N];IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=3 THEN BEGIN RA:=1.0;IA:=0.0;RB:=0.0;IB:=W*L[N]*LC;RC:=0.0;IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=4 THEN BEGIN RA:=1.0;IA:=0.0;RB:=0.0;IB:=0.0;RC:=0.0;IC:=-1.0/(W*L[N]*LC);RD:=1.0;ID:=0.0; END; IF ET[N]=5 THEN BEGIN RA:=1.0;IA:=0.0;RB:=0.0;IB:=-1/(W*C[N]*CC);RC:=0.0;IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=6 THEN BEGIN RA:=1.0;IA:=0.0;RB:=0.0;IB:=0.0;RC:=0.0;IC:=W*C[N]*CC;RD:=1.0;ID:=0.0; END; IF ET[N]=7 THEN BEGIN RA:=1.0;IA:=0.0;RB:=R[N];IB:=W*L[N]*LC-1/(W*C[N]*CC); RC:=0.0;IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=8 THEN BEGIN RA:=1.0;IA:=0.0;RB:=0.0;IB:=0.0;V4:=SQR(W)*L[N]*LC*C[N]*CC-1; RC:=W*W*SQR(C[N]*CC)*R[N]/(W*W*SQR(C[N]*CC)*SQR(R[N])+SQR(W*W*L[N]*LC*C[N]*CC-1)); IC:=-W*C[N]*CC*V4/(SQR(W)*SQR(C[N]*CC)*SQR(R[N])+SQR(V4)); RD:=1.0;ID:=0.0; END; IF ET[N]=9 THEN BEGIN RB:=SQR(W)*R[N]*SQR(L[N]*LC)/(W*W*SQR(L[N]*LC)+SQR(R[N])*SQR(1-W*W*L[N]*LC*C[N]*CC)); RA:=1.0;IA:=0.0;T:=W*W*SQR(L[N]*LC)+SQR(R[N])*SQR(1-W*W*L[N]*LC*C[N]*CC); IB:=W*L[N]*LC*R[N]*R[N]*(1-W*W*L[N]*LC*C[N]*CC)/T;RC:=0.0;IC:=0.0;RD:=1;ID:=0.0; END; IF ET[N]=10 THEN BEGIN RC:=1/R[N];IC:=(-1+W*W*L[N]*LC*C[N]*CC)/(W*L[N]*LC); RA:=1.0;IA:=0.0;RB:=0.0;IB:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=11 THEN BEGIN RB:=R[N]/(SQR(1-W*W*L[N]*LC*C[N]*CC)+SQR(W*C[N]*CC*R[N])); IB:=W*(L[N]*LC*(1-W*W*L[N]*LC*C[N]*CC)-C[N]*CC*SQR(R[N]))*RB/R[N]; RA:=1.0;IA:=0.0;RC:=0.0;IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=12 THEN BEGIN V3:=W*L[N]*CM*EXPON(C[N],0.5)/3.0E+10;RA:=COS(V3);IA:=0.0;RB:=0.0;IB:=R[N]*SIN(V3); RC:=0.0;IC:=SIN(V3)/R[N];RD:=COS(V3);ID:=0.0; END; IF ET[N]=13 THEN BEGIN V3:=W*L[N]*CM*EXPON(C[N],0.5)/3.0E+10; RA:=1.0;IA:=0.0;RB:=0.0;IB:=0.0;RC:=0.0;IC:=TAN(V3)/R[N];RD:=1.0;ID:=0.0; END; IF ET[N]=14 THEN BEGIN V3:=W*L[N]*CM*EXPON(C[N],0.5)/3.0E+10; RA:=1.0;IA:=0.0;RB:=0.0;IB:=0.0;RC:=0.0;IC:=-1/(TAN(V3)*R[N]);RD:=1.0;ID:=0.0; END; IF ET[N]=15 THEN BEGIN V3:=W*L[N]*CM*EXPON(C[N],0.5)/3.0E+10; RA:=1.0;IA:=0.0;RB:=0.0;IB:=-R[N]/TAN(V3);RC:=0.0;IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=16 THEN BEGIN V3:=W*L[N]*CM*EXPON(C[N],0.5)/3.0E+10; RA:=1.0;IA:=0.0;RB:=0.0;IB:=R[N]*TAN(V3);RC:=0.0;IC:=0.0;RD:=1.0;ID:=0.0; END; IF ET[N]=17 THEN BEGIN RA:=TR;IA:=0.0;RB:=0.0;IB:=0.0;RC:=0.0;IC:=0.0;RD:=1/TR;ID:=0.0; END; { THIS SECTION MULTIPLIES THE ABCD MATRICIES TOGETHER } A3:=A1*RA-A4*IA+B1*RC-B4*IC;A6:=A1*IA+A4*RA+B1*IC+B4*RC; B3:=A1*RB-A4*IB+B1*RD-B4*ID;B6:=A1*IB+A4*RB+B1*ID+B4*RD; C3:=C1*RA-C4*IA+D1*RC-D4*IC;C6:=C1*IA+C4*RA+D1*IC+D4*RC; D3:=C1*RB-C4*IB+D1*RD-D4*ID;D6:=C1*IB+C4*RB+D4*RD+D1*ID; A1:=A3;A4:=A6;B1:=B3;B4:=B6;C1:=C3;C4:=C6;D1:=D3;D4:=D6; N:=N+1; END; { END OF 'N' LOOP } { THIS SECTION CALCULATES THE OUTPUT DATA } G:=(A3*RL+B3+C3*RS*RL+D3*RS)/RL; H:=(A6*RL+B6+C6*RS*RL+D6*RS)/RL; II:=SQRT(SQR(G)+SQR(H)); NU[2]:=INT(-10*LN(RL*SQR(II)/(4*RS))/LN(10.0)*100.0+0.5)/100.0; V1:=C3*RL+D3; V2:=C6*RL+D6; Q:=SQR(V1)+SQR(V2); NU[6]:=INT(((A3*RL+B3)*V1+(A6*RL+B6)*V2)/Q*100.0+0.5)/100.0; NU[7]:=INT(((A6*RL+B6)*V1-(A3*RL+B3)*V2)/Q*100.0+0.5)/100.0; NU[1]:=INT(F*1000.0/(1.0E+6)+0.5)/1000.0; R1:=SQRT(SQR(NU[6]-RS)+SQR(NU[7])); R2:=SQRT(SQR(NU[6]+RS)+SQR(NU[7])); RO:=R1/R2; IF RO=1.0 THEN RO:=0.999999; NU[5]:=INT(RO*100.0+0.5)/100.0; NU[3]:=-INT(20.0*LN(1/RO)/LN(10.0)*100.0+0.5)/100.0; NU[4]:=INT((1.0+RO)/(1-RO)*100.0+0.5)/100.0; I:=1; REPEAT; WRITE(NU[I]:11:2); IF Q1='P' THEN WRITE(LST,NU[I]:11:2); I:=I+1; UNTIL I>7; WRITELN; IF Q1='P' THEN WRITELN(LST,''); K:=K+1.0; END; { THIS SECTION HANDLES THE OPTIONS MENU SELECTIONS } WRITELN; IF Q1='P' THEN WRITELN(LST,CHR(12)); 400: REPEAT; WRITE('(1)CHANGE FREQ (2)EDIT ELEMENTS (3)START OVER (4)QUIT OR (5)SAVE ? '); {$I-} READLN(A); UNTIL (A>0) AND (A<6) AND (IORESULT=0); {$I+} CLRSCR; IF A=1 THEN BEGIN Q1:='N'; GOTO 100; END; IF A=2 THEN BEGIN (*CLRSCR;*) Q1:='Y'; GOTO 200; END; IF A=3 THEN GOTO 300; IF A=5 THEN BEGIN WRITE('WHAT NAME TO SAVE THE NETWORK UNDER ? ');READLN(FILENAME);; ASSIGN(SAVEFILE,FILENAME); REWRITE(SAVEFILE); STR(NS,DATA); WRITELN(SAVEFILE,DATA); {WRITE NUMBER OS SECTIONS TO FILE} STR(RS,DATA); WRITELN(SAVEFILE,DATA); {WRITE SOURCE RESISTANCE TO FILE} STR(RL,DATA); WRITELN(SAVEFILE,DATA); {WRITE LOAD RESISTANCE TO FILE} FOR N:= 1 TO NS DO BEGIN STR(ET[N],DATA); WRITELN(SAVEFILE,DATA); {WRITE ELEM TYPE TO FILE} STR(R[N],DATA); WRITELN(SAVEFILE,DATA); {WRITE R VALUE TO FILE} STR(L[N],DATA); WRITELN(SAVEFILE,DATA); {WRITE L VALUE TO FILE} STR(C[N],DATA); WRITELN(SAVEFILE,DATA); {WRITE C VALUE TO FILE} END; CLOSE(SAVEFILE); GOTO 400; END; END; END.