#N struct num float x float y float col; #N canvas 21 113 829 606 10; #X obj 34 430 tgl 20 0 audio_io empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X text 59 432 <- Audio IO; #X text 122 266 x[n]; #X text 251 316 d[n]; #X text 104 379 y[n]; #X obj 75 495 bng 20 250 50 0 clear empty empty 0 -6 0 8 -262144 -1 -1; #X text 104 497 <- clear coefficients \, so adaptation will start again ; #X text 542 496 unknown system:; #X text 571 520 d[n] =; #X floatatom 178 383 5 0 0 1 c0 - C0; #X floatatom 242 383 8 0 0 1 c1 - C1; #X text 31 471 adaptive filter:; #X floatatom 75 523 8 0 0 0 - mur mu; #X text 137 523 <- step size parameter mu (learning rate); #N canvas 215 124 617 210 init 0; #X msg 43 99 2; #X obj 269 45 loadbang; #X obj 43 122 s init_tlp; #X msg 138 98 0.33; #X msg 179 99 0.33; #X msg 223 100 0.33; #X obj 138 121 s a0r; #X obj 178 122 s a1r; #X obj 223 123 s a2r; #X obj 295 123 s mur; #X msg 515 103 \; pd dsp \$1; #X obj 515 78 r audio_io; #X obj 381 123 s signalr; #X msg 380 98 0; #X obj 182 180 s A1r; #X obj 142 179 s A0r; #X msg 183 157 2; #X msg 142 156 1; #X msg 294 99 0.001; #X connect 0 0 2 0; #X connect 1 0 0 0; #X connect 1 0 3 0; #X connect 1 0 4 0; #X connect 1 0 5 0; #X connect 1 0 18 0; #X connect 1 0 13 0; #X connect 1 0 17 0; #X connect 1 0 16 0; #X connect 3 0 6 0; #X connect 4 0 7 0; #X connect 5 0 8 0; #X connect 11 0 10 0; #X connect 13 0 12 0; #X connect 16 0 14 0; #X connect 17 0 15 0; #X connect 18 0 9 0; #X restore 644 578 pd init; #X floatatom 623 521 4 0 1.5 0 - A0r A0; #X text 657 521 x[n] +; #N canvas 425 56 483 381 PROBLEM_DESCRIPTION 0; #X text 35 188 unknown system:; #X text 35 259 adaptive system:; #X text 77 292 step-size parameter mu; #X text 74 209 FIR Filter: h=(1 \, 2) \, order = 2; #X text 75 225 d[n] = h0*x[n] + h1*x[n-1] (N=M); #X text 77 278 nlms2~ \, 2 coefficients (c0 \, c1); #X text 34 124 The unknown system is a FIR filter of order 2 and the adaptive system is an adaptive transversal filter using the NLMS algorithm (see nlms2~ help-patch) with 2 coefficients.; #X text 35 89 In this exmaple the adaptation path is beeing visualized in the c[n]-plane.; #X text 33 340 When can the unknown system be identified successfully ?; #X text 32 42 PERSISTENT EXCITATION; #X restore 34 94 pd PROBLEM_DESCRIPTION; #N canvas 663 87 465 688 OBSERVATIONS 0; #X text 24 20 OBSERVATIONS; #X text 24 60 input signals 1 + 4:; #X text 48 77 The unknown system can be identified successfully.; #X text 24 103 input signals 2:; #X text 54 119 Adaptation doesn't work at all.; #X text 21 149 input signals 3:; #X text 51 165 Adaptation works \, but with an offset.; #X text 23 225 EXPLANATION; #X text 26 256 The unknown system can be identified \, if the Wiener-Hopf equation can be solved:; #X text 69 297 c_opt = R_x^-1 * p; #X text 257 294 (Wiener-Hopf equation); #X text 27 323 c_opt ... optimal coefficient vector c0 \, c1 \, c2 \, ...; #X text 28 338 R_x ... autocorrelation matrix of the input signal x[n] ; #X text 156 429 det(R_x) != 0; #X text 27 393 The Wiener-Hopf equation can only be solved \, if the determinant of R_x is not singular:; #X text 45 511 x[n] = sin(theta*n + phi); #X text 45 530 -> for N=2:; #X text 133 557 R_x =; #X text 275 547 cos(theta); #X text 236 566 cos(theta); #X text 221 567 [; #X text 220 547 [; #X text 355 547 ]; #X text 355 566 ]; #X text 175 558 0.5 *; #X text 239 548 1; #X text 331 567 1; #X text 40 622 -> det(R_x) = 0 \, if theta = 0 \, pi \, 2*pi \, ... ; #X text 40 606 -> det(R_x) = 1 - cos^2(theta); #X text 24 639 (which is the case with input signal 2 = critical sampling) ; #X text 26 483 In our example (signal 1+2):; #X text 28 352 p ... crosscorrelation vector between the desired output d[n] and the input signal x[n]; #X restore 34 120 pd OBSERVATIONS; #X text 33 72 ReadMe:; #X obj 114 166 vradio 15 1 1 4 empty empty empty 0 -6 0 8 -262144 -1 -1 2; #X floatatom 709 521 4 0 2 0 - A1r A1; #X text 743 521 x[n-1]; #X text 132 197 3) x[n]=cos[pi*n]+2; #X text 132 212 4) white noise; #X text 132 164 1) x[n]=cos[0.5*pi*n] -> f=samplerate/4; #X text 132 181 2) x[n]=cos[pi*n] -> f=samplerate/2; #N canvas 0 0 450 300 c-plane 0; #X scalar num 100 200 600 \;; #X scalar num 132.83 181.096 841 \;; #X coords -100 300 200 -100 300 300 1; #X restore 486 131 pd c-plane; #N canvas 220 179 544 257 c-plane-stuff 0; #N canvas 118 400 523 253 num 0; #X text 104 54 float with x \, y values \; col for color \;; #X text 97 157 visualization of the float \, col is the color \;; #X obj 101 88 struct num float x float y float col; #X obj 90 184 filledpolygon col col 0 0 0 0 0 9 9 9 0 0 9; #X restore 27 36 pd num; #N canvas 663 380 461 298 init 0; #X msg 329 146 clear; #X obj 258 241 pointer; #X msg 223 91 bang; #X obj 137 22 loadbang; #X text 263 93 Initialization; #X obj 212 150 t b b b; #X msg 159 91 bang; #X obj 221 120 t b b; #X text 74 90 add another; #X obj 329 172 s pd-c-plane; #X msg 250 216 traverse pd-c-plane \, bang; #X obj 168 264 append num x y; #X obj 137 46 t b b b; #X obj 34 130 s \$0-initp; #X text 29 153 init pointers; #X msg 162 218 0; #X msg 201 220 0; #X connect 0 0 9 0; #X connect 1 0 11 2; #X connect 2 0 7 0; #X connect 3 0 12 0; #X connect 5 0 15 0; #X connect 5 1 16 0; #X connect 5 2 10 0; #X connect 6 0 5 0; #X connect 7 0 5 0; #X connect 7 1 0 0; #X connect 10 0 1 0; #X connect 12 0 13 0; #X connect 12 1 6 0; #X connect 12 2 2 0; #X connect 15 0 11 0; #X connect 16 0 11 1; #X restore 28 75 pd init; #X text 80 37 <- graphical representation of a number; #N canvas 944 527 415 326 coef_h 0; #X obj 219 222 pointer; #X msg 219 147 traverse pd-c-plane \, next; #X obj 175 24 r \$0-initp; #X obj 113 275 set num x y col; #X obj 100 186 * 100; #X obj 146 185 * 100; #X obj 100 159 r A0; #X obj 175 48 t b b b; #X obj 84 240 f 0; #X obj 130 239 f 0; #X msg 84 80 1; #X obj 84 124 t b b; #X obj 146 159 r A1; #X obj 84 101 metro 50; #X msg 197 249 600; #X connect 0 0 3 3; #X connect 1 0 0 0; #X connect 2 0 7 0; #X connect 4 0 8 1; #X connect 5 0 9 1; #X connect 6 0 4 0; #X connect 7 0 10 0; #X connect 7 1 14 0; #X connect 7 2 1 0; #X connect 8 0 3 0; #X connect 9 0 3 1; #X connect 10 0 13 0; #X connect 11 0 8 0; #X connect 11 1 9 0; #X connect 12 0 5 0; #X connect 13 0 11 0; #X connect 14 0 3 2; #X restore 26 137 pd coef_h; #N canvas 796 564 451 326 coef_c 0; #X obj 219 222 pointer; #X obj 175 24 r \$0-initp; #X obj 113 275 set num x y col; #X obj 100 186 * 100; #X obj 146 185 * 100; #X obj 84 240 f 0; #X obj 130 239 f 0; #X msg 84 80 1; #X obj 84 124 t b b; #X obj 100 159 r C0; #X obj 146 159 r C1; #X obj 175 48 t b b b; #X msg 219 147 traverse pd-c-plane \, next \, next; #X obj 84 101 metro 50; #X msg 197 249 841; #X connect 0 0 2 3; #X connect 1 0 11 0; #X connect 3 0 5 1; #X connect 4 0 6 1; #X connect 5 0 2 0; #X connect 6 0 2 1; #X connect 7 0 13 0; #X connect 8 0 5 0; #X connect 8 1 6 0; #X connect 9 0 3 0; #X connect 10 0 4 0; #X connect 11 0 7 0; #X connect 11 1 14 0; #X connect 11 2 12 0; #X connect 12 0 0 0; #X connect 13 0 8 0; #X connect 14 0 2 2; #X restore 27 107 pd coef_c; #X msg 165 126 \; . xticks 0 0.1 5; #X msg 165 164 \; . yticks 0 0.1 5; #X msg 303 128 \; . xlabel -1.15 -1 0 1 2; #X msg 302 163 \; . ylabel -1.1 -1 0 1 2 3; #X obj 165 80 loadbang; #X connect 9 0 5 0; #X connect 9 0 6 0; #X connect 9 0 7 0; #X connect 9 0 8 0; #X restore 698 578 pd c-plane-stuff; #N canvas 0 0 450 300 graph2 0; #X array . 1 float 3; #A 0 -0.97332; #X coords -1 3 2 -1 300 300 1; #X restore 486 131 graph; #X text 479 112 c1; #X text 790 423 c0; #X text 521 87 orange: adaptive system (c0 \, c1); #N canvas 771 151 438 319 input_signal~ 0; #X obj 175 34 inlet; #X obj 188 281 outlet~; #X msg 296 64 print else; #X obj 235 162 noise~; #X obj 262 188 *~; #X obj 190 183 +~ 2; #X obj 190 161 osc~; #X obj 35 39 samplerate~; #X obj 116 160 osc~; #X obj 35 17 loadbang; #X obj 115 194 *~; #X obj 35 157 osc~; #X obj 34 197 *~; #X obj 189 212 *~; #X obj 175 56 sel 0 1 2 3; #N canvas 264 424 366 206 distribute_msg 0; #X obj 66 26 inlet; #X obj 108 26 inlet; #X obj 154 26 inlet; #X obj 206 28 inlet; #X msg 114 91 0; #X msg 166 94 0; #X msg 215 93 0; #X msg 108 66 1; #X msg 154 66 1; #X msg 70 91 0; #X obj 54 124 outlet; #X obj 111 126 outlet; #X obj 165 124 outlet; #X obj 217 124 outlet; #X msg 206 65 0.3; #X msg 64 67 0.3; #X connect 0 0 15 0; #X connect 0 0 4 0; #X connect 0 0 5 0; #X connect 0 0 6 0; #X connect 1 0 7 0; #X connect 1 0 9 0; #X connect 1 0 5 0; #X connect 1 0 6 0; #X connect 2 0 8 0; #X connect 2 0 9 0; #X connect 2 0 4 0; #X connect 2 0 6 0; #X connect 3 0 14 0; #X connect 3 0 9 0; #X connect 3 0 4 0; #X connect 3 0 5 0; #X connect 4 0 11 0; #X connect 5 0 12 0; #X connect 6 0 13 0; #X connect 7 0 11 0; #X connect 8 0 12 0; #X connect 9 0 10 0; #X connect 14 0 13 0; #X connect 15 0 10 0; #X restore 175 86 pd distribute_msg; #X obj 35 133 / 4; #X obj 116 133 / 2; #X obj 190 133 / 2; #X connect 0 0 14 0; #X connect 3 0 4 0; #X connect 4 0 1 0; #X connect 5 0 13 0; #X connect 6 0 5 0; #X connect 7 0 16 0; #X connect 7 0 17 0; #X connect 7 0 18 0; #X connect 8 0 10 0; #X connect 9 0 7 0; #X connect 10 0 1 0; #X connect 11 0 12 0; #X connect 12 0 1 0; #X connect 13 0 1 0; #X connect 14 0 15 0; #X connect 14 1 15 1; #X connect 14 2 15 2; #X connect 14 3 15 3; #X connect 14 4 2 0; #X connect 15 0 12 1; #X connect 15 1 10 1; #X connect 15 2 13 1; #X connect 15 3 4 1; #X connect 16 0 11 0; #X connect 17 0 8 0; #X connect 18 0 6 0; #X restore 114 233 pd input_signal~; #N canvas 10 567 359 314 unknown_system~ 0; #X obj 26 26 inlet~; #X obj 26 268 outlet~; #X obj 26 113 fexpr~ $f2*$x1 + $f3*$x1[-1]; #X obj 217 92 r A1r; #X obj 121 88 r A0r; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 3 0 2 2; #X connect 4 0 2 1; #X restore 243 292 pd unknown_system~; #N canvas 523 194 390 347 adaptive_filter~ 0; #X obj 37 35 inlet~; #X text 22 15 input signal; #X obj 143 35 inlet~; #X text 122 15 desired signal; #X obj 38 275 outlet~; #X msg 249 63 adaptation 1; #X obj 249 42 loadbang; #X obj 249 141 r clear; #X msg 248 162 clear; #X obj 123 249 outlet; #X obj 188 249 outlet; #X obj 249 94 r mu; #X msg 249 116 mu \$1; #X obj 123 221 unpack f f; #X obj 37 156 nlms2~ 2 0.01; #X connect 0 0 14 0; #X connect 2 0 14 1; #X connect 5 0 14 0; #X connect 6 0 5 0; #X connect 7 0 8 0; #X connect 8 0 14 0; #X connect 11 0 12 0; #X connect 12 0 14 0; #X connect 13 0 9 0; #X connect 13 1 10 0; #X connect 14 0 4 0; #X connect 14 2 13 0; #X restore 114 360 pd adaptive_filter~; #X text 484 47 Visualization in the c-plane:; #X text 33 32 PERSISTENT EXCITATION; #X text 521 74 red: unknown system (h0 \, h1); #X connect 20 0 33 0; #X connect 33 0 35 0; #X connect 33 0 34 0; #X connect 34 0 35 1; #X connect 35 1 9 0; #X connect 35 2 10 0;