aboutsummaryrefslogtreecommitdiff
path: root/adaptive/examples/02.persistent_excitation.pd
blob: 9bafbba314b4536d35268303aaf3a167c7d84ecc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
#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;