#N canvas 0 0 700 667 10;
#X msg 395 342 getmu;
#X msg 395 321 mu \$1;
#X floatatom 403 302 8 0 0 0 - - -;
#X msg 395 450 getN;
#X msg 395 539 help;
#X msg 395 199 clear;
#X msg 395 266 print;
#X floatatom 37 406 8 0 0 0 - - -;
#X msg 395 507 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 486 write demo.dat;
#X obj 45 320 r message;
#X obj 395 568 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 384 pd unsig~;
#X text 89 260 input signal x[n];
#X text 177 287 reference signal d[n];
#X text 177 302 (desired signal);
#X text 108 385 output signal y[n];
#X text 35 172 init arg1: nr. of coefficients;
#X text 498 141 turn adaptation on/off;
#X text 443 193 clear current coefficients;
#X text 443 206 and set them back to 0;
#X text 444 265 print current coefficients;
#X text 35 185 init arg2: stepsize parameter mu;
#X text 446 325 set/get stepsize parameter;
#X text 447 339 mu (learning rate);
#X text 436 450 get Nr. of coefficients;
#X text 506 503 and mu to file;
#X text 506 489 write/read coefficients;
#X text 206 622 (c) Georg Holzmann <grh@mur.at> \, 2005;
#X text 36 481 some more info:;
#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 nlms~ 10 24 0 14 -228992 -1
0;
#X text 350 38 adaptive systems;
#X text 360 54 for Pure Data;
#X text 34 562 in the example folder !;
#X text 35 548 For much more examples see patches;
#X obj 38 259 sig~ 2;
#X obj 125 286 sig~ 1;
#X text 36 134 Normalized LMS: normalized least mean square;
#X text 146 147 adaptation algorithm;
#N canvas 347 29 502 539 NLMS_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 35 398 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 35 312 mu ... step-size parameter (learning rate);
#X text 34 282 c[n] ... new coefficient vector;
#X text 34 297 c[n-1] ... old coefficient vector;
#X text 34 354 e[n] ... error sample at time n \, LMS tries to minimize
this error;
#X text 35 382 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 36 440 How to choose mu ?;
#X text 36 463 Sufficient (deterministic) stability condition:;
#X text 32 195 The normalized LMS Adaptation Algorithm:;
#X text 70 226 c[n] = c[n-1] + mu/(alpha+abs(x[n])^2) *e[n]*x[n];
#X text 34 327 alpha ... a small positive constant \, only to avoid
division by zero;
#X text 152 490 0 < mu < 2;
#X restore 38 503 pd NLMS_EXPLANATION;
#N canvas 536 326 510 502 NLMS_EXAMPLE 0;
#X obj 31 109 sig~ 2;
#X obj 116 111 sig~ 1;
#X text 36 87 x[n];
#X text 124 92 d[n];
#X text 31 234 y[n];
#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 msg 341 220 adaptation 1;
#X obj 341 199 loadbang;
#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 text 189 461 -- 1024 samples --;
#X obj 37 131 s~ x_;
#X obj 125 133 s~ d_;
#X obj 31 213 s~ y_;
#X obj 40 159 r \$0-nlms;
#X obj 198 207 s \$0-nlms;
#X obj 341 244 s \$0-nlms;
#X obj 30 181 nlms~ 1 0.001;
#X connect 0 0 17 0;
#X connect 0 0 23 0;
#X connect 1 0 18 0;
#X connect 1 0 23 1;
#X connect 9 0 22 0;
#X connect 10 0 9 0;
#X connect 11 0 21 0;
#X connect 12 0 11 0;
#X connect 14 0 21 0;
#X connect 20 0 23 0;
#X connect 23 0 19 0;
#X restore 38 525 pd NLMS_EXAMPLE;
#X floatatom 403 372 8 0 0 0 - - -;
#X msg 395 391 alpha \$1;
#X msg 395 412 getalpha;
#X text 464 393 set/get alpha (normally;
#X text 465 407 you don't need that);
#X obj 38 345 nlms~ 2 0.001;
#X msg 395 236 init_unity;
#X text 475 223 set first coefficient to 1 \,;
#X text 477 236 all others to 0 (= delay;
#X text 476 249 free transmission);
#X connect 0 0 14 0;
#X connect 1 0 14 0;
#X connect 2 0 1 0;
#X connect 3 0 14 0;
#X connect 4 0 14 0;
#X connect 5 0 14 0;
#X connect 6 0 14 0;
#X connect 8 0 14 0;
#X connect 9 0 14 0;
#X connect 10 0 11 0;
#X connect 11 0 14 0;
#X connect 12 0 14 0;
#X connect 13 0 50 0;
#X connect 15 0 7 0;
#X connect 39 0 50 0;
#X connect 40 0 50 1;
#X connect 45 0 46 0;
#X connect 46 0 14 0;
#X connect 47 0 14 0;
#X connect 50 0 15 0;
#X connect 51 0 14 0;
