#N canvas 185 80 1021 690 10;
#X declare -lib iem_adaptfilt -lib iemlib -path iemlib -lib zexy -path zexy;
#N canvas 0 0 450 300 (subpatch) 0;
#X array 1_\$0-W 40 float 0;
#X coords 0 1 39 -1 200 140 1 0 0;
#X restore 64 529 graph;
#X msg 40 257 update \$1;
#X msg 117 267 beta \$1;
#X obj 456 36 tgl 15 0 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0 1;
#X obj 456 57 dsp;
#X floatatom 456 103 5 0 0 0 - - - 0;
#X floatatom 469 82 5 0 0 0 - - - 0;
#X obj 452 473 bng 15 150 20 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000;
#X obj 68 287 noise~;
#X obj 40 70 vradio 15 1 0 8 empty empty empty 0 -6 0 8 #d8fcfc #000000 #000000 0;
#N canvas 165 115 464 314 (subpatch) 0;
#X obj 76 61 inlet;
#X msg 32 163 0;
#X msg 63 159 1;
#X msg 97 158 2;
#X msg 132 156 4;
#X msg 159 157 8;
#X msg 191 162 16;
#X msg 219 164 32;
#X msg 248 165 64;
#X obj 76 84 sel 0 1 2 3 4 5 6 7;
#X obj 32 217 outlet;
#X connect 0 0 9 0;
#X connect 1 0 10 0;
#X connect 2 0 10 0;
#X connect 3 0 10 0;
#X connect 4 0 10 0;
#X connect 5 0 10 0;
#X connect 6 0 10 0;
#X connect 7 0 10 0;
#X connect 8 0 10 0;
#X connect 9 0 1 0;
#X connect 9 1 2 0;
#X connect 9 2 3 0;
#X connect 9 3 4 0;
#X connect 9 4 5 0;
#X connect 9 5 6 0;
#X connect 9 6 7 0;
#X connect 9 7 8 0;
#X restore 40 217 pd;
#X text 22 51 internal downsampling of update;
#X msg 75 349 gamma \$1;
#X text 90 375 input signal;
#X text 335 374 desired signal;
#N canvas 0 0 450 300 (subpatch) 0;
#X array \$0-IR 40 float 0;
#X coords 0 1 39 -1 200 140 1;
#X restore 240 35 graph;
#X obj 69 472 unsig~;
#X floatatom 69 498 9 0 0 0 - - - 0;
#X obj 155 472 unsig~;
#X floatatom 155 498 9 0 0 0 - - - 0;
#X text 426 374 d(n);
#X obj 516 280 loadbang;
#X text 704 57 (array-sizes have to be >= then FIR_size);
#X text 654 47 1.arg: <float> number of order of FIR-filter;
#X text 57 83 update every sample;
#X text 57 68 stop \, no update;
#X text 57 98 update every 2nd sample;
#X text 57 113 update every 4th sample;
#X text 57 128 update every 8th sample;
#X text 57 143 update every 16th sample;
#X text 57 158 update every 32nd sample;
#X text 57 173 update every 64th sample;
#N canvas 0 0 486 336 (subpatch) 0;
#X obj 48 46 inlet;
#X obj 205 47 inlet;
#X obj 92 84 loadbang;
#X obj 48 182 s \$0-IR;
#X msg 205 71 const 0;
#X msg 48 120 0 0 0 0 0 0 0.314287 0.8 0.75 0 0 0 0 -0.7 -0.65 0 0 0 0.157143 0.128572 0 0 -0.128572 -0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
#X connect 0 0 5 0;
#X connect 1 0 4 0;
#X connect 2 0 5 0;
#X connect 4 0 3 0;
#X connect 5 0 3 0;
#X restore 517 255 pd;
#X obj 530 237 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000;
#X text 547 234 clear;
#X obj 517 218 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000;
#X text 534 215 load;
#X text 579 224 IR;
#X text 19 407 filtered output signal;
#X text 339 406 error signal;
#X text 469 467 constrain;
#X text 469 477 coefficients;
#X msg 452 432 0;
#X obj 452 452 speedlim 100;
#X obj 110 424 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0;
#N canvas 0 0 482 332 (subpatch) 0;
#X obj 137 73 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1;
#X msg 137 115 39;
#X msg 92 190 \$1 39;
#X msg 136 53 1;
#X obj 137 92 metro 200;
#X obj 136 24 inlet;
#X obj 92 169 tabread 1_\$0-W;
#X obj 92 214 tabwrite 1_\$0-W;
#X msg 177 192 \$1 39;
#X msg 260 191 \$1 39;
#X obj 260 170 tabread 3_\$0-W;
#X obj 260 215 tabwrite 3_\$0-W;
#X obj 177 171 tabread 2_\$0-W;
#X obj 177 216 tabwrite 2_\$0-W;
#X connect 0 0 4 0;
#X connect 1 0 6 0;
#X connect 1 0 12 0;
#X connect 1 0 10 0;
#X connect 2 0 7 0;
#X connect 3 0 0 0;
#X connect 4 0 1 0;
#X connect 5 0 3 0;
#X connect 6 0 2 0;
#X connect 8 0 13 0;
#X connect 9 0 11 0;
#X connect 10 0 9 0;
#X connect 12 0 8 0;
#X restore 516 301 pd;
#X text 541 307 update of W;
#X text 540 296 graphical;
#X text 111 329 minimum input value;
#X msg 117 230 0.1;
#X msg 75 311 1e-05;
#X text 170 268 beta [0 .. 2];
#X text 131 348 gamma [0 .. 1];
#X obj 574 48 cnv 15 68 17 empty empty empty 20 12 0 14 #d8fcfc #404040 0;
#N canvas 0 0 568 372 FORMULAS 0;
#X obj 167 52 cnv 15 150 40 empty empty empty 20 12 0 14 #d8fcfc #404040 0;
#X obj 167 205 cnv 15 260 30 empty empty empty 20 12 0 14 #d8fcfc #404040 0;
#X text 6 135 normalized learn rate:;
#X text 119 73 error:;
#X text 116 55 output:;
#X text 7 212 coefficient iteration:;
#X text 176 213 W(k+1 \, i) = W(k \, i) + µ(n)* e(n)* x(n);
#X text 173 54 y(n) = Wᴴ * x(n);
#X text 173 72 e(n) = d(n) - Wᴴ * x(n);
#X obj 167 123 cnv 15 270 50 empty empty empty 20 12 0 14 #d8fcfc #404040 0;
#X text 280 129 beta;
#X text 174 135 µ(n) =;
#X text 223 145 ∑ x[n-i]² + gamma²*blocksize;
#X text 223 130 ____________________________;
#X restore 573 49 pd FORMULAS;
#X obj 117 250 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0;
#X floatatom 117 250 5 0 2 0 - - - 0;
#X text 153 249 learn-rate;
#X obj 75 331 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0;
#X floatatom 75 331 5 0 1 0 - - - 0;
#X floatatom 40 238 5 0 0 0 - - - 0;
#X text 572 24 Normalized Least Mean Square (linear adaptive FIR-filter);
#N canvas 0 0 450 300 (subpatch) 0;
#X array 2_\$0-W 40 float 0;
#X coords 0 1 39 -1 200 140 1;
#X restore 314 529 graph;
#N canvas 0 0 450 300 (subpatch) 0;
#X array 3_\$0-W 40 float 0;
#X coords 0 1 39 -1 200 140 1;
#X restore 564 529 graph;
#X obj 244 473 unsig~;
#X floatatom 244 499 9 0 0 0 - - - 0;
#X obj 334 471 unsig~;
#X floatatom 334 497 9 0 0 0 - - - 0;
#X text 304 243 minimum input value;
#X obj 268 245 cnv 14 31 14 empty empty empty 20 12 0 14 #d8fcfc #404040 0;
#X floatatom 268 245 5 0 10000 0 - - - 0;
#X msg 268 263 kappa \$1;
#X text 324 262 kappa [0 .. 1];
#X msg 268 225 1;
#X obj 423 303 FIR~ \$0-IR 32;
#X obj 186 303 z~ 2;
#X obj 304 303 z~ 4;
#X text 41 375 x1(n);
#X text 272 375 x3(n);
#X text 191 374 x2(n);
#X text 39 420 y1(n) = 1_W * x1(n);
#X obj 196 439 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0;
#X obj 286 413 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0;
#X text 125 435 y2(n) = 2_W * x2(n);
#X text 215 409 y3(n) = 3_W * x3(n);
#X obj 375 435 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0;
#X text 341 431 - 1_W * x1(n);
#X text 312 420 e(n) = d(n);
#X obj 375 445 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0;
#X text 341 441 - 2_W * x2(n);
#X obj 375 455 cnv 8 1 1 empty empty * 0 7 0 14 #fcfcfc #000000 0;
#X text 341 451 - 3_W * x3(n);
#X text 572 13 Multi Channel Constraint;
#X text 654 160 (C) 2005 \, m.noisternig & t.musil \, IEM \, Graz \, Austria;
#X text 682 173 [noisternig \, musil]_AT_iem.at;
#X text 655 74 2.arg: <float> number of order of FIR-filter;
#X text 655 88 3.arg: <float> learn-rate = beta;
#X text 656 113 5.arg: <float> constraint = kappa;
#X text 655 100 4.arg: <float> regularization parameter = gamma;
#X text 656 128 6.arg: <symbol> table-name of W;
#X obj 783 267 declare -lib iem_adaptfilt -lib iemlib -path iemlib -lib zexy -path zexy, f 27;
#X msg 458 139 bang;
#N canvas 735 418 450 300 RESET 0;
#X obj 37 37 inlet;
#X msg 37 60 const 0;
#X obj 76 106 s 1_\$0-W;
#X obj 56 129 s 2_\$0-W;
#X obj 37 152 s 3_\$0-W;
#X obj 37 83 t a a a;
#X connect 0 0 1 0;
#X connect 1 0 5 0;
#X connect 5 0 4 0;
#X connect 5 1 3 0;
#X connect 5 2 2 0;
#X restore 458 162 pd RESET TABLES;
#X obj 68 392 n_CNLMS~ 3 32 0.1 1e-05 1 \$0-W, f 60;
#X connect 1 0 103 0;
#X connect 2 0 103 0;
#X connect 3 0 4 0;
#X connect 4 0 5 0;
#X connect 4 1 6 0;
#X connect 8 0 74 0;
#X connect 8 0 75 0;
#X connect 8 0 76 0;
#X connect 8 0 103 0;
#X connect 9 0 10 0;
#X connect 10 0 60 0;
#X connect 12 0 103 0;
#X connect 16 0 17 0;
#X connect 18 0 19 0;
#X connect 21 0 45 0;
#X connect 33 0 32 1;
#X connect 35 0 32 0;
#X connect 42 0 43 0;
#X connect 43 0 7 0;
#X connect 49 0 56 0;
#X connect 50 0 59 0;
#X connect 56 0 2 0;
#X connect 59 0 12 0;
#X connect 60 0 1 0;
#X connect 64 0 65 0;
#X connect 66 0 67 0;
#X connect 70 0 71 0;
#X connect 71 0 103 0;
#X connect 73 0 70 0;
#X connect 74 0 103 3;
#X connect 75 0 103 1;
#X connect 76 0 103 2;
#X connect 101 0 102 0;
#X connect 103 0 16 0;
#X connect 103 1 18 0;
#X connect 103 2 64 0;
#X connect 103 3 66 0;
#X connect 103 4 42 0;
