#N canvas 148 190 700 570 10; #X msg 395 341 getmu; #X msg 395 320 mu \$1; #X floatatom 403 301 8 0 0 0 - - -; #X msg 395 376 getN; #X msg 395 465 help; #X msg 395 196 clear; #X msg 395 263 print; #X floatatom 37 365 8 0 0 0 - - -; #X msg 395 433 read demo.dat; #X msg 395 163 getadaptation; #X obj 395 120 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X msg 395 141 adaptation \$1; #X msg 395 412 write demo.dat; #X text 36 122 LMS: least mean square adaptation algorithm; #X obj 45 279 r message; #X obj 395 494 s message; #N canvas 0 0 260 260 unsig~ 0; #X obj 22 42 inlet~; #X text 62 42 ~signal_in~; #X obj 22 168 outlet; #X text 69 169 float-out; #X obj 22 142 snapshot~; #X obj 39 119 metro 300; #X obj 40 70 loadbang; #X msg 40 95 1; #X connect 0 0 4 0; #X connect 4 0 2 0; #X connect 5 0 4 0; #X connect 6 0 7 0; #X connect 7 0 5 0; #X restore 37 343 pd unsig~; #X text 89 219 input signal x[n]; #X text 169 248 reference signal d[n]; #X text 169 263 (desired signal); #X text 108 344 output signal y[n]; #X obj 37 304 lms~ 2 1e-04; #X text 35 160 init arg1: nr. of coefficients; #X text 498 141 turn adaptation on/off; #X text 443 190 clear current coefficients; #X text 443 203 and set them back to 0; #X text 444 262 print current coefficients; #X text 35 173 init arg2: stepsize parameter mu; #X text 446 324 set/get stepsize parameter; #X text 447 338 mu (learning rate); #X text 436 376 get Nr. of coefficients; #X text 506 429 and mu to file; #X text 506 415 write/read coefficients; #X text 223 536 (c) Georg Holzmann \, 2005; #N canvas 347 29 502 634 LMS_EXPLANATION 0; #X text 35 135 x[n] ... input signal of the system; #X text 35 120 c[n] ... coefficient vector of the system; #X text 35 104 y[n] ... output signal of the system; #X text 43 369 d[n] ... desired signal \, reference signal; #X text 50 74 -> y[n] = c0[n]*x[n] + c1[n]*x[n-1] + c2[n]*x[n-2] + ...; #X text 32 195 The LMS Adaptation Algorithm:; #X text 70 226 c[n] = c[n-1] + mu*e[n]*x[n]; #X text 43 309 mu ... step-size parameter (learning rate); #X text 42 279 c[n] ... new coefficient vector; #X text 42 294 c[n-1] ... old coefficient vector; #X text 42 325 e[n] ... error sample at time n \, LMS tries to minimize this error; #X text 43 353 x[n] ... tap-input vector at time n; #X text 71 241 with e[n] = d[n] - y[n]; #X text 33 33 An adaptive system is simply a FIR filter with the coefficients c[n] \, which can be learned.; #X text 104 485 0 < mu < 2/(abs(x[n])^2); #X text 38 517 -> abs(x[n])^2 is the tap-input energy; #X text 60 532 at time n (lenght of x[n] is PDs; #X text 35 579 Note: this only ensures "stability on average"; #X text 60 547 blocksize - so use block~ to change it!); #X text 34 432 How to choose mu ?; #X text 34 455 Sufficient (deterministic) stability condition:; #X restore 38 429 pd LMS_EXPLANATION; #X text 36 407 some more info:; #N canvas 536 326 510 502 LMS_EXAMPLE 0; #X obj 31 109 sig~ 2; #X obj 108 109 sig~ 1; #X text 36 87 x[n]; #X text 116 90 d[n]; #X text 31 234 y[n]; #X obj 40 159 r \$0-lms; #X text 115 28 x[n] = 2 \, d[n] = 1 \, N = 1 (= nr. of coefficients) ; #X text 26 29 EXAMPLE:; #N canvas 0 0 450 300 graph3 0; #X array x 1024 float 0; #X array y 1024 float 0; #X array d 1024 float 0; #X coords 0 2 1023 0 400 140 1; #X restore 51 302 graph; #N canvas 422 247 725 220 plot_logic 0; #X obj 72 168 tabwrite~ x; #X obj 158 168 tabwrite~ y; #X obj 244 168 tabwrite~ d; #X obj 191 105 metro 100; #X obj 191 54 loadbang; #X msg 191 80 1; #X obj 386 57 loadbang; #X obj 72 142 r~ x_; #X obj 158 142 r~ y_; #X obj 244 142 r~ d_; #X msg 362 153 \; x yticks 0 0.25 2; #X msg 346 121 \; x xticks 0 32 2; #X msg 503 150 \; x ylabel 1060 0 0.5 1 1.5 2; #X msg 479 105 \; x xlabel -0.2 0 256 512 768 1024; #X connect 3 0 0 0; #X connect 3 0 1 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 3 0; #X connect 6 0 11 0; #X connect 6 0 10 0; #X connect 6 0 13 0; #X connect 6 0 12 0; #X connect 7 0 0 0; #X connect 8 0 1 0; #X connect 9 0 2 0; #X restore 198 246 pd plot_logic; #X obj 341 244 s \$0-lms; #X msg 341 220 adaptation 1; #X obj 341 199 loadbang; #X obj 198 207 s \$0-lms; #X msg 198 171 mu \$1; #X floatatom 210 150 8 0 0 0 - - -; #X text 275 147 <- try different mu; #X msg 199 109 clear; #X text 242 110 <- clear to start new adaptation; #X obj 30 181 lms~ 1 1e-05; #X text 189 461 -- 1024 samples --; #X obj 37 131 s~ x_; #X obj 117 131 s~ d_; #X obj 31 213 s~ y_; #X connect 0 0 19 0; #X connect 0 0 21 0; #X connect 1 0 19 1; #X connect 1 0 22 0; #X connect 5 0 19 0; #X connect 11 0 10 0; #X connect 12 0 11 0; #X connect 14 0 13 0; #X connect 15 0 14 0; #X connect 17 0 13 0; #X connect 19 0 23 0; #X restore 38 451 pd LMS_EXAMPLE; #X obj 219 24 cnv 15 258 58 empty empty empty 10 22 0 14 -1 -66577 0; #X obj 223 28 cnv 15 250 50 empty empty lms~ 10 24 0 14 -228992 -1 0; #X text 350 38 adaptive systems; #X text 360 54 for Pure Data; #X text 34 488 in the example folder !; #X text 35 474 For much more examples see patches; #X obj 38 218 sig~ 2; #X obj 117 247 sig~ 1; #X msg 395 232 init_unity; #X text 475 219 set first coefficient to 1 \,; #X text 477 232 all others to 0 (= delay; #X text 476 245 free transmission); #X connect 0 0 15 0; #X connect 1 0 15 0; #X connect 2 0 1 0; #X connect 3 0 15 0; #X connect 4 0 15 0; #X connect 5 0 15 0; #X connect 6 0 15 0; #X connect 8 0 15 0; #X connect 9 0 15 0; #X connect 10 0 11 0; #X connect 11 0 15 0; #X connect 12 0 15 0; #X connect 14 0 21 0; #X connect 16 0 7 0; #X connect 21 0 16 0; #X connect 43 0 21 0; #X connect 44 0 21 1; #X connect 45 0 15 0;