%%HP: T(3)A(D)F(.);
DIR
  SALLEN
    \<<
"Sallen-Key Low-Pass
Filter. Frequency:"
{ V } INPUT OBJ\->
"Q-factor?" { V }
INPUT OBJ\->
"Resistance values
(E24 or E96)"
{ V \Ga } INPUT
      IF "E24" SAME
      THEN 'STD24'
'FIXR' STO E24 3
ROLLD 1000 24
      ELSE 'STD96'
'FIXR' STO E96 3
ROLLD 100 96
      END 1 \-> f q g
a t
      \<< 1 CF 100
'ER' STO CLLCD
"Analysing..." 1
DISP
        WHILE 1 FC?
        REPEAT DUP
t GET g * 'R' STO
"R: " R \->STR + 2
DISP '1/(4*\pi*q*f*R)
' \->NUM STD12 'C'
STO "C: " C \->STR +
4 DISP '4*q^2' \->NUM
'N' STO 2 CF
          WHILE 2
FC?
          REPEAT C
N * STD12 DUP 'nC'
STO C /
            IF N <
            THEN
'N' 1.5 STO*
            ELSE 2
SF
            END
          END
"nC: " nC \->STR + 5
DISP nC C / 'N' STO
'N/q^2-2' \->NUM 'k'
STO '(k+(k^2-4)^.5)
/2' \->NUM 'M' STO '1
/(2*\pi*(M*N)^.5*f*C)
' \->NUM FIXR 'R' STO
R M * FIXR 'mR' STO
"mR: " mR \->STR + 3
DISP mR R / 'M' STO
'1/(2*\pi*(M*N)^.5*R*
C)' \->NUM 'F' STO '(
M*N)^.5/(M+1)' \->NUM
'Q' STO 'ABS((f-F)/
f)+ABS((q-Q)/q)'
\->NUM 100 *
          IF DUP ER
<
          THEN 'ER'
STO R mR C nC F Q 6
\->LIST 'VER' STO
"f: " F 2 RND \->STR
+ 6 DISP "Q: " Q 4
RND \->STR + 7 DISP
          ELSE DROP
          END 't' 1
STO+
          IF t a ==
          THEN 1 SF
          END
          IF KEY
          THEN DROP
1 SF
          END
        END DROP
      \>> 'VER(5)'
EVAL 2 RND "fo"
\->TAG 'VER(6)' EVAL
4 RND "Q" \->TAG {
FIXR C nC R mR N M
k Q F ER } PURGE 1
CF 2 CF { '1_F' '
100_mF' '10_mF' '1_
mF' '100_\GmF' '10_\GmF
' '1_\GmF' '100_nF' '
10_nF' '1_nF' '100_
pF' '10_pF' '1_pF'
'.1_pF' } 'VER(3)'
EVAL 2 ENG DUP XPON
ABS 1 + 3 PICK SWAP
GET SWAP MANT * "C"
\->TAG SWAP 'VER(4)'
EVAL DUP XPON ABS 1
+ ROT SWAP GET SWAP
MANT * "nC" \->TAG '
VER(1)' EVAL "R"
\->TAG 'VER(2)' EVAL
"mR" \->TAG 'VER'
PURGE STD
    \>>
  STD24
    \<< 2 SCI DUP
XPON STD 1 OVER -
10 SWAP ^ ROT *
SWAP 13 { 6 3 2 1 }
1 4
      FOR t
        IF E24 3
PICK GET 5 PICK >
        THEN DUP t
GET NEG ROT + SWAP
        ELSE DUP t
GET ROT + SWAP
        END
      NEXT DROP
      IF E24 OVER
GET DUP 5 PICK >
      THEN E24 ROT
1 - GET SWAP
      ELSE E24 ROT
1 + GET
      END
      IF OVER 5
PICK - ABS OVER 6
PICK - ABS <
      THEN DROP
      ELSE SWAP
DROP
      END ROT DROP
10 1 4 ROLL - ^ /
    \>>
  E24 { 10 11 12 13
15 16 18 20 22 24
27 30 33 36 39 43
47 51 56 62 68 75
82 91 100 }
  STD96
    \<< 2 SCI DUP
XPON STD 2 OVER -
10 SWAP ^ ROT *
SWAP 49 { 24 12 6 3
2 1 } 1 6
      FOR t
        IF E96 3
PICK GET 5 PICK >
        THEN DUP t
GET NEG ROT + SWAP
        ELSE DUP t
GET ROT + SWAP
        END
      NEXT DROP
      IF E96 OVER
GET DUP 5 PICK >
      THEN E96 ROT
1 - GET SWAP
      ELSE E96 ROT
1 + GET
      END
      IF OVER 5
PICK - ABS OVER 6
PICK - ABS <
      THEN DROP
      ELSE SWAP
DROP
      END ROT DROP
10 2 4 ROLL - ^ /
    \>>
  E96 { 100 102 105
107 110 113 115 118
121 124 127 130 133
137 140 143 147 150
154 158 162 165 169
174 178 182 187 191
196 200 205 210 215
221 226 232 237 243
249 255 261 267 274
280 287 294 301 309
316 324 332 340 348
357 365 374 383 392
402 412 422 432 442
453 464 475 487 499
511 523 536 549 562
576 590 604 619 634
649 665 681 698 715
732 750 768 787 806
825 845 866 887 909
931 953 976 1000 }
  CST { SALLEN
STD12 STD24 STD96 }
  STD12
    \<< 2 SCI DUP
XPON STD 1 OVER -
10 SWAP ^ ROT *
SWAP 7 { 3 2 1 } 1
3
      FOR t
        IF E12 3
PICK GET 5 PICK >
        THEN DUP t
GET NEG ROT + SWAP
        ELSE DUP t
GET ROT + SWAP
        END
      NEXT DROP
      IF E12 OVER
GET DUP 5 PICK >
      THEN E12 ROT
1 - GET SWAP
      ELSE E12 ROT
1 + GET
      END
      IF OVER 5
PICK - ABS OVER 6
PICK - ABS <
      THEN DROP
      ELSE SWAP
DROP
      END ROT DROP
10 1 4 ROLL - ^ /
    \>>
  E12 { 10 12 15 18
22 27 33 39 47 56
68 82 100 }
END
