home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug083.ark / LPFILTAN.BAS < prev    next >
Encoding:
BASIC Source File  |  1984-04-29  |  7.9 KB  |  238 lines

  1.     REM * PROGRAM LPFILTAN BY E.R. LE CLEAR 8-15-79
  2.     CONSOLE
  3.     REM * THIS PROGRAM EVALUATES LOW PASS FILTERS FOR
  4.     REM * TRANSMISSION CHARACTERISTICS AND INPUT IN-
  5.     REM * PEDANCE VERSUS FREQUENCY. THE FILTER IS TER-
  6.     REM * MINATED IN A LOAD RESISTANCE RL AND CONSISTS
  7.     REM * OF N "L" SECTIONS. EACH "L" SECTION CONSISTS
  8.     REM * OF THE FOLLOWING COMPONENTS:
  9.     REM *
  10.     REM *      ----<  LA >-------< RLA >-----
  11.     REM *      l                            l
  12.     REM *      l                            l
  13.     REM * O--------<  CA >-------< RCA >-----------O
  14.     REM *      l
  15.     REM *    <RB>
  16.     REM *      l
  17.     REM *    <LB>
  18.     REM *      l
  19.     REM *    <CB>
  20.     REM *      l
  21.     REM * O---------------------------------------O
  22.     REM *
  23.      DIM LA(10),RLA(10),CA(10),RCA(10),RB(10),LB(10),CB(10)
  24. 1.00    PRINT TAB(24);"LOW PASS FILTERS"
  25.     REM *
  26.     REM ***** REQUEST COMPONENT DATA *****
  27.     REM *
  28.     INPUT "NUMBER OF SECTIONS ?";N
  29.     INPUT "RG,RL ? ";RG,RL
  30.     PRINT "TYPE IN SECTION PARAMETERS. TYPE - IF ELEMENT NOT USED"
  31.     PRINT "FOR SHORTED SERIES ARM, SET LA=RLA=0"
  32.     PRINT "FOR OPEN SHUNT ARM, SET RB=1E15"
  33.     MIN=1E-15 : MAX=1E15
  34.     FOR LOOP=1 TO N
  35.         PRINT "LA,RLA FOR SECTION ";LOOP;
  36.         INPUT LA$,RLA$
  37.         IF LA$="-" THEN LA(LOOP)=MAX ELSE LA(LOOP)=VAL(LA$)
  38.         IF RLA$="-" THEN RLA(LOOP)=MIN ELSE RLA(LOOP)=VAL(RLA$)
  39.         PRINT "CA,RCA FOR SECTION ";LOOP;
  40.         INPUT CA$,RCA$
  41.         IF CA$="-" THEN CA(LOOP)=MIN ELSE CA(LOOP)=VAL(CA$)
  42.         IF RCA$="-" THEN RCA(LOOP)=MIN ELSE RCA(LOOP)=VAL(RCA$)
  43.         PRINT "RB,LB,CB FOR SECTION ";LOOP;
  44.         INPUT RB$,LB$,CB$
  45.         IF RB$="-" THEN RB(LOOP)=MIN ELSE RB(LOOP)=VAL(RB$)
  46.         IF LB$="-" THEN LB(LOOP)=MIN ELSE LB(LOOP)=VAL(LB$)
  47.         IF CB$="-" THEN CB(LOOP)=MAX ELSE CB(LOOP)=VAL(CB$)
  48.     NEXT LOOP
  49.     REM *
  50.     REM ***** PRINT HEADING AND INPUT DATA *****
  51.     REM *
  52.     INPUT "HARD COPY ? (Y OR N)";Q$
  53.     IF Q$="Y" THEN LPRINTER WIDTH 80
  54.     PRINT
  55.     PRINT "    LOW PASS FILTER ANALYSIS "
  56.     PRINT
  57.     PRINT "FILTER CONSTANTS"
  58.     PRINT
  59.     PRINT "RG=";RG
  60.     PRINT "RL=";RL
  61.     PRINT
  62.     FOR LOOP=1 TO N
  63.         PRINT "LA";LOOP;" =";LA(LOOP),"RLA";LOOP;" =";RLA(LOOP)
  64.         PRINT "CA";LOOP;" =";CA(LOOP),"RCA";LOOP;" =";RCA(LOOP)
  65.         PRINT "RB";LOOP;" =";RB(LOOP),"LB";LOOP;" =";LB(LOOP),"CB";LOOP;" =";CB(LOOP)
  66.         PRINT
  67.     NEXT LOOP
  68.     REM *
  69.     REM ***** INPUT FREQUENCY DATA *****
  70.     REM *
  71. 2.00    CONSOLE
  72.     INPUT "FMIN,FMAX ?";FMIN,FMAX
  73.     INPUT "NUMBER OF DATA POINTS ?";M
  74.     DEL=(LOG(FMAX)-LOG(FMIN))/(M-1)
  75.     IF Q$="Y" THEN LPRINTER WIDTH 80
  76.     REM *
  77.     REM ***** CALCULATE AND PRINT DATA *****
  78.     REM *
  79.     PRINT "FREQ         ALPHA(DB)    ANG(ALPHA)        ZIN          ANG(ZIN)"
  80.     PRINT "-------------------------------------------------------------------"
  81.     PRINT
  82.     FOR LOOPF=0 TO (M-1)
  83.         F=EXP(LOG(FMIN)+DEL*LOOPF)
  84.         W=6.2832*F
  85.         A11.REAL=1.0 : A11.IMAG=MIN            REM UNIT MATRIX
  86.         A12.REAL=MIN : A12.IMAG=MIN
  87.         A21.REAL=MIN : A21.IMAG=MIN
  88.         A22.REAL=1.0 : A22.IMAG=MIN
  89.         FOR LOOP=1 TO N
  90.             REM *
  91.             REM ***** COMPUTE ZA *****
  92.             REM *
  93.             IF RLA(LOOP) GT MAX/2 OR LA(LOOP) GT MAX/2 THEN GOTO 3.00
  94.             IF RCA(LOOP) GT MAX/2 OR CA(LOOP) LT 2*MIN THEN GOTO 4.00
  95.             TEMP.REAL=RLA(LOOP) : TEMP.IMAG=W*LA(LOOP) 
  96.             TEMP1.REAL=RCA(LOOP) : TEMP1.IMAG=-1/(W*CA(LOOP))
  97.             GOSUB 103.100                REM COMPLEX MULTIPLY
  98.             TEMP1.REAL=RLA(LOOP)+RCA(LOOP) : TEMP1.IMAG=W*LA(LOOP)-1/(W*CA(LOOP))
  99.             GOSUB 104.100                REM COMPLEX DIVIDE
  100.             ZA.REAL=TEMP.REAL : ZA.IMAG=TEMP.IMAG
  101.             GOTO 5.00
  102. 3.00            IF RCA(LOOP) GT MAX/2 OR CA(LOOP) LT 2*MIN THEN \
  103.                 PRINT "ERROR IN SERIES ARM";LOOP : GOTO 1.00
  104.             ZA.REAL=RCA(LOOP) : ZA.IMAG=-1/(W*CA(LOOP))
  105.             GOTO 5.00
  106. 4.00            IF RLA(LOOP) GT MAX/2 OR LA(LOOP) GT MAX/2 THEN \
  107.                 PRINT "ERROR IN SERIES ARM";LOOP : GOTO 1.00
  108.             ZA.REAL=RLA(LOOP) : ZA.IMAG=W*LA(LOOP)
  109.             REM *
  110.             REM ***** COMPUTE ZB *****
  111.             REM *
  112. 5.00            IF RB(LOOP) GT MAX/2 OR LA(LOOP) GT MAX/2 OR CB(LOOP) LT 2*MIN THEN \
  113.                 PRINT "ERROR IN SHUNT ARM";LOOP : GOTO 1.00
  114.             ZB.REAL=RB(LOOP) : ZB.IMAG=W*LB(LOOP)-1/(W*CB(LOOP))
  115.             REM *
  116.             REM ***** COMPUTE X MATRIX FOR SECTION *****
  117.             REM *
  118.             TEMP.REAL=ZA.REAL+ZB.REAL : TEMP.IMAG=ZA.IMAG+ZB.IMAG
  119.             TEMP1.REAL=ZB.REAL : TEMP1.IMAG=ZB.IMAG
  120.             GOSUB 104.100                REM COMPLEX DIVIDE
  121.             B22.REAL=TEMP.REAL : B22.IMAG=TEMP.IMAG
  122.             B12.REAL=ZA.REAL : B12.IMAG=ZA.IMAG
  123.             TEMP.REAL=1.0 : TEMP.IMAG=MIN
  124.             TEMP1.REAL=ZB.REAL : TEMP1.IMAG=ZB.IMAG
  125.             GOSUB 104.100                REM COMPLEX DIVIDE
  126.             B21.REAL=TEMP.REAL : B21.IMAG=TEMP.IMAG
  127.             B11.REAL=1.0 : B11.IMAG=MIN
  128.             GOSUB 111.100                REM MULTIPLY X MATRICES [C]=[A]X[B]
  129.             A11.REAL=C11.REAL : A11.IMAG=C11.IMAG    REM RENAME MATRIX FOR NEXT LOOP
  130.             A12.REAL=C12.REAL : A12.IMAG=C12.IMAG
  131.             A21.REAL=C21.REAL : A21.IMAG=C21.IMAG
  132.             A22.REAL=C22.REAL : A22.IMAG=C22.IMAG
  133.         NEXT LOOP
  134.         REM *
  135.         REM ***** SET UP TERMINATION MATRIX *****
  136.         REM *
  137.         B11.REAL=1.0 : B11.IMAG=MIN
  138.         B12.REAL=MIN : B12.IMAG=MIN
  139.         B21.REAL=1/RL : B21.IMAG=MIN
  140.         B22.REAL=1.0 : B22.IMAG=MIN
  141.         GOSUB 111.100                    REM MULTIPLY X MATRICES [C]=[A]X[B]
  142.         TEMPA.REAL=C11.REAL : TEMPA.IMAG=C11.IMAG
  143.         TEMPB.REAL=C12.REAL : TEMPB.IMAG=C12.IMAG
  144.         TEMPC.REAL=C21.REAL : TEMPC.IMAG=C21.IMAG
  145.         TEMPD.REAL=C22.REAL : TEMPD.IMAG=C22.IMAG
  146.         GOSUB 109.100                    REM [X] TO [Z]
  147.         REM *
  148.         REM ***** COMPUTE POLAR INPUT INPEDANCE *****
  149.         REM *
  150.         ZINR=TEMPA.REAL : ZINI=TEMPA.IMAG
  151.         TEMP.REAL=ZINR : TEMP.IMAG=ZINI
  152.         GOSUB 100.100                    REM CONVERT TO POLAR ZIN    
  153.         ZIN.MAG=TEMP.MAG : ZIN.PHA=TEMP.PHA
  154.         TEMP.REAL=2*ZINR : TEMP.IMAG=2*ZINI        REM NORMALIZE TRANSFER FUNCTION
  155.         TEMP1.REAL=RG+ZINR : TEMP1.IMAG=ZINI
  156.         GOSUB 104.100                    REM TEMP=2*ZIN/(RG+ZIN)
  157.         TEMP1.REAL=C11.REAL : TEMP1.IMAG=C11.IMAG
  158.         GOSUB 104.100                    REM COMPLEX DIVIDE
  159.         GOSUB 100.100                    REM CONVERT TO POLAR
  160.         ALPHA.MAG=20*LOG(TEMP.MAG)/LOG(10)
  161.         ALPHA.PHA=TEMP.PHA
  162.         PRINT USING "#.###^^     ####.##       ####.##      #.###^^      ####.##";\
  163.             F,ALPHA.MAG,ALPHA.PHA,ZIN.MAG,ZIN.PHA
  164.     NEXT LOOPF
  165.     PRINT
  166.     REM *
  167.     REM ***** PROGRAM OPTIONS *****
  168.     REM *
  169.     FOR I=1 TO 10
  170.         PRINT
  171.     NEXT I
  172.     CONSOLE
  173.     INPUT "NEW FREQ PLOT(F), NEW PARAMETERS(P) OR QUIT(Q)";S$
  174.     IF S$="F" THEN GOTO 2.00
  175.     IF S$="P" THEN GOTO 1.00
  176.     IF S$="Q" THEN STOP
  177.     GOTO 1.00
  178. 100.100    REM ***********REC/POL***********
  179.     TEMP.MAG=SQR(TEMP.REAL*TEMP.REAL+TEMP.IMAG*TEMP.IMAG)
  180.     TEMP.PHA=57.296*ATN(TEMP.IMAG/TEMP.REAL)
  181.     RETURN
  182. 103.100    REM ***********MPYCOM***********
  183.     A=TEMP.REAL : B=TEMP.IMAG
  184.     C=TEMP1.REAL : D=TEMP1.IMAG
  185.     TEMP.REAL=A*C-B*D
  186.     TEMP.IMAG=A*D+B*C
  187.     RETURN
  188. 104.100 REM ***********DIVCOM***********
  189.     A=TEMP.REAL : B=TEMP.IMAG
  190.     C=TEMP1.REAL : D=TEMP1.IMAG
  191.     E=C*C+D*D
  192.     IF E<1E-12 THEN E=1E-12
  193.     TEMP.REAL=(A*C+B*D)/E
  194.     TEMP.IMAG=(B*C-A*D)/E
  195.     RETURN
  196. 109.100    REM ***********ZXXZ***********
  197.     TEMP.REAL=TEMPA.REAL : TEMP.IMAG=TEMPA.IMAG
  198.     TEMP1.REAL=TEMPD.REAL : TEMP1.IMAG=TEMPD.IMAG
  199.     GOSUB 103.100
  200.     TEM1R=TEMP.REAL : TEM1I=TEMP.IMAG
  201.     TEMP.REAL=TEMPB.REAL : TEMP.IMAG=TEMPB.IMAG
  202.     TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.IMAG
  203.     GOSUB 103.100
  204.     TEM2R=TEMP.REAL : TEM2I=TEMP.IMAG
  205.     DELR=TEM1R-TEM2R : DELI=TEM1I-TEM2I
  206.     TEMP.REAL=TEMPA.REAL : TEMP.IMAG=TEMPA.IMAG
  207.     TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.IMAG
  208.     GOSUB 104.100
  209.     TEMPA.REAL=TEMP.REAL : TEMPA.IMAG=TEMP.IMAG
  210.     TEMP.REAL=DELR : TEMP.IMAG=DELI
  211.     TEMP1.REAL=TEMPC.REAL : TEMP1.IMAG=TEMPC.IMAG
  212.     GOSUB 104.100
  213.     TEMPB.REAL=TEMP.REAL : TEMPB.IMAG=TEMP.IMAG
  214.     TEM3R=TEMPC.REAL : TEM3I=TEMPC.IMAG
  215.     TEMP.REAL=1 : TEMP.IMAG=0
  216.     TEMP1.REAL=TEM3R : TEMP1.IMAG=TEM3I
  217.     GOSUB 104.100
  218.     TEMPC.REAL=TEMP.REAL : TEMPC.IMAG=TEMP.IMAG
  219.     TEMP.REAL=TEMPD.REAL : TEMP.IMAG=TEMPD.IMAG
  220.     TEMP1.REAL=TEM3R : TEMP1.IMAG=TEM3I
  221.     GOSUB 104.100
  222.     TEMPD.REAL=TEMP.REAL : TEMPD.IMAG=TEMP.IMAG
  223.     RETURN
  224. 111.100    REM ***********MTXMPY***********
  225.     A1=A11.REAL : B1=A11.IMAG : C1=A12.REAL : D1=A12.IMAG
  226.     E1=A21.REAL : F1=A21.IMAG : G1=A22.REAL : H1=A22.IMAG
  227.     A2=B11.REAL : B2=B11.IMAG : C2=B12.REAL : D2=B12.IMAG
  228.     E2=B21.REAL : F2=B21.IMAG : G2=B22.REAL : H2=B22.IMAG
  229.     C11.REAL=A1*A2-B1*B2+C1*E2-D1*F2
  230.     C11.IMAG=B1*A2+A1*B2+C1*F2+D1*E2
  231.     C12.REAL=A1*C2-B1*D2+C1*G2-D1*H2
  232.     C12.IMAG=B1*C2+A1*D2+D1*G2+C1*H2
  233.     C21.REAL=A2*E1-B2*F1+E2*G1-F2*H1
  234.     C21.IMAG=A2*F1+B2*E1+E2*H1+F2*G1
  235.     C22.REAL=C2*E1-D2*F1+G1*G2-H1*H2
  236.     C22.IMAG=C2*F1+D2*E1+H1*G2+G1*H2
  237.     RETURN
  238.