(* * LANGUAGE : ANS Forth with extensions * PROJECT : Forth Environments * DESCRIPTION : Leon Chua's chaotic oscillator * CATEGORY : Example * AUTHOR : Marcel Hendrix * LAST CHANGE : October 22, 2006, Marcel Hendrix *) NEEDS -miscutil NEEDS -writewav NEEDS -fsl_util NEEDS -matplot REVISION -chua "ÄÄÄ Chua Oscillator Version 0.01 ÄÄÄ" PRIVATES DOC (* .---.--R2--.-----.-------.-------. a | | | | | | R1 C1 C2 R3 R3 R5 ( negative ) | | | | | | L1 = = v D1 ^ D2 = b | + | - | = Vc Vc - | + | = = CHUA is used to test the accuracy of circuit simulators. This is the minimum possible circuit to get real chaotic behavior. R5 sets circuit undamping. With R5 = -1200 a nice double loop is displayed. X is the initial + source vector [iL0; vC1; vC2; Vc]. Note the subharmonics on the capacitor voltages and the gradual amplitude increases/decreases (when R5=-1200). The circuit is extremely critical ("chaotic") with respect to component tolerances and initial conditions. R5(a,b) can be replaced with an opamp as follows: a >----+---Rx---. | .----. | `-| + | | b >-Rx-+-| - |-+ Rx = 290 Ohms | `----' | `---Rx---' *) ENDDOC -- Circuit parameters -- 75e FVALUE R1 PRIVATE 1300e FVALUE R2 PRIVATE -1200e FVALUE R5 PRIVATE 3300e FVALUE R3 PRIVATE 69e-9 FVALUE C1 PRIVATE 4.6e-9 FVALUE C2 PRIVATE 8.5e-3 FVALUE L1 PRIVATE 1e FVALUE Vc PRIVATE -- Simulation parameters -- #100 VALUE steps PRIVATE #50 VALUE cycles PRIVATE C1 C2 F+ L1 F* FSQRT PI*2 F* steps S>F F/ FVALUE dT PRIVATE -- State matrices and state vector -- 4 1 DOUBLE MATRIX x{ PRIVATE 4 4 DOUBLE MATRIX A{{ PRIVATE DOUBLE DARRAY t{ PRIVATE DOUBLE DARRAY iL1{ PRIVATE DOUBLE DARRAY vC1{ PRIVATE DOUBLE DARRAY vC2{ PRIVATE : INIT-MEM ( -- ) t{ steps cycles * }malloc malloc-fail? iL1{ steps cycles * }malloc malloc-fail? OR vC1{ steps cycles * }malloc malloc-fail? OR vC2{ steps cycles * }malloc malloc-fail? OR ABORT" init-mem :: out of core" ; -- x = [ iL1; vC1; vC2; Vc ]; x{ 4 1 }}FREAD 0e 1e-9 0e 1e A{{ 4 4 }}FREAD 'R1 L1 F/ FNEGATE' 'L1 -1/F' 0e 0e 'C1 1/F' 'R2 C1 F* -1/F' 'R2 C1 F* 1/F' 0e 0e 'R2 C2 F* 1/F' 0e 0e 0e 0e 0e 0e -- simulation loop -- : FCLIP ( F: r1 -- r2 ) 15e FMIN -15e FMAX ; PRIVATE : FSIGN ( F: r1 -- r2 ) FDUP F0> IF FDROP 1e EXIT ENDIF F0= IF 0e ELSE -1e ENDIF ; : SIM-LOOP ( -- ) INIT-MEM steps cycles * 0 DO I S>F dT F* t{ I } DF! x{ 0 } DF@ iL1{ I } DF! x{ 1 } DF@ vC1{ I } DF! x{ 2 } DF@ FCLIP FDUP vC2{ I } DF! FABS Vc F> IF [ R2 1/F R5 1/F F+ R3 1/F F+ C2 F/ FNEGATE ] FLITERAL [ R3 C2 F* 1/F ] FLITERAL vC2{ I } DF@ FSIGN F* ELSE [ R2 1/F R5 1/F F+ C2 F/ FNEGATE ] FLITERAL 0e ENDIF ( F: Gx Bx ) A{{ 2 3 }} DF! A{{ 2 2 }} DF! A{{ dT =scalemat =expm x{ =mat* x{ => LOOP ; PRIVATE -- Display Results -- : DISPLAY1 ( -- ) 1 FIGURE CLF 3 1 1 SUBPLOT t{ 1e6 =scalemat iL1{ S" blue" PLOT S" i_{L1} [A]" YLABEL S" CHUA -- chaotic oscillator" TITLE TRUE ZOOM TRUE GRID 3 1 2 SUBPLOT t{ 1e6 =scalemat vC1{ S" red" PLOT S" v_{C1} [V]" YLABEL TRUE ZOOM TRUE GRID 3 1 3 SUBPLOT t{ 1e6 =scalemat vC2{ S" red" PLOT S" v_{C2} [V]" YLABEL S" time [\mus]" XLABEL TRUE ZOOM TRUE GRID ; PRIVATE : DISPLAY2 ( -- ) 2 FIGURE CLF vC1{ vC2{ S" !blue" PLOT TRUE ZOOM TRUE GRID S" v_{C1} [V]" XLABEL S" v_{C2} [V]" YLABEL S" CHUA -- chaotic oscillator" TITLE ; PRIVATE -- Main Loop -- : SHOW-CHUA ( -- ) #100 TO steps #50 TO cycles 0e 1e-9 0e 1e x{ #=> BEGIN SIM-LOOP DISPLAY1 DISPLAY2 EKEY? UNTIL EKEY DROP ; -- Static preferences for the wav output file: 1 second, 44100 kHz, stereo, 16bit : AUDIOSCALE ( F: r max -- ) ( -- u ) F/ 15e F2^x F* FROUND F>S ; PRIVATE : WRITE-CHUA ( "name" -- ) 0 LOCAL ix 0e 0e FLOCALS| vc1max vc2max | #1000 #44100 TRUE #16 WAV-INIT \ 1 second, 44100 kHz, stereo, 16bits 0e 1e-9 0e 1e x{ #=> #100 TO steps dT 100e F* 1/F F>S TO cycles \ cycles = 1 second / (steps * dT) SIM-LOOP vC1{ MATRANGE FSWAP FABS FMAX TO vc1max vC2{ MATRANGE FSWAP FABS FMAX TO vc2max 'wav /wav@ BOUNDS DO vC1{ ix } DF@ vc1max audioscale I B! vC2{ ix } DF@ vc2max audioscale I 2+ B! 1 +TO ix 4 +LOOP /PARSE WAV-FLUSH ; :ABOUT CR ." Try: SHOW-CHUA" CR ." WRITE-CHUA " ; .ABOUT -chua CR DEPRIVE (* End of Source *)