#N canvas -6 5 609 588 12;
#N canvas 300 81 867 775 fft-analysis 0;
#X obj 85 664 *~;
#X obj 35 712 *~;
#X obj 316 148 *~;
#X obj 34 58 *~;
#X obj 34 35 inlet~;
#X obj 34 82 rfft~;
#X obj 35 688 rifft~;
#X obj 35 737 outlet~;
#X obj 277 147 *~;
#X obj 277 198 rsqrt~;
#X obj 105 421 -~;
#X obj 34 663 *~;
#X obj 68 58 tabreceive~ \$0-hann;
#X obj 644 51 loadbang;
#X obj 644 133 r window-size;
#X obj 69 711 tabreceive~ \$0-hann;
#X obj 131 327 *~;
#X msg 644 155 set \$1 4;
#X obj 644 179 block~;
#X msg 643 75 \; pd dsp 1 \; window-size 1024;
#X obj 125 616 /~ 1000;
#X obj 197 616 r window-size;
#X obj 254 229 *~;
#X obj 113 220 *~;
#X obj 277 171 +~ 1e-20;
#X obj 152 246 lrshift~ 1;
#X obj 313 254 lrshift~ 1;
#X obj 152 272 lrshift~ -1;
#X obj 314 281 lrshift~ -1;
#X obj 292 335 *~;
#X obj 105 475 clip~ 0 1;
#X obj 106 448 *~ 1e+20;
#X obj 105 392 +~;
#X obj 105 508 *~;
#X obj 144 508 lrshift~ 1;
#X obj 251 508 lrshift~ -1;
#X obj 125 540 *~;
#X obj 410 411 -~;
#X obj 410 459 clip~ 0 1;
#X obj 411 435 *~ 1e+20;
#X obj 410 488 *~;
#X obj 449 488 lrshift~ 1;
#X obj 553 487 lrshift~ -1;
#X obj 430 517 *~;
#X obj 430 540 *~ -1;
#X obj 430 563 +~ 1;
#X obj 125 582 +~;
#X obj 255 335 *~;
#X obj 98 327 *~;
#X text 195 476 0 if clean;
#X text 170 541 0 if a neighbor is clean;
#X obj 97 301 +~;
#X obj 130 300 +~;
#X obj 255 309 +~;
#X obj 292 308 +~;
#X text 169 558 1 if all neighbors dirty;
#X text 470 584 1 if a neighbor dirty;
#X text 472 568 0 if all neighbors clean;
#X obj 224 679 lrshift~ -1;
#X obj 224 655 sig~ 1;
#X obj 125 638 *~;
#X obj 220 442 expr $f1*$f1/1250;
#X obj 432 385 expr $f1*$f1/1250;
#X obj 220 417 r dirty;
#X obj 432 360 r clean;
#X text 362 148 normalize the amplitudes;
#X text 439 253 add neighboring amplitude to this one;
#X text 437 269 and take squared magnitude of result -;
#X text 437 286 do this for both the left neighbor and;
#X text 436 303 the right one;
#X text 94 82 forward real Hann-windowed FT;
#X text 284 658 I had trouble with the DC bin - this zeros it.;
#X text 594 366 adjust threshold to quadratic;
#X text 594 382 units and scale;
#X text 142 389 total incoherence;
#X text 496 414 compare incoherence with the threshold;
#X text 532 511 multiply by left and right;
#X text 531 529 neighbors \, so 0 if any of;
#X text 531 546 the 3 is "clean".;
#X text 497 429 If greater (dirty) \, the "clip" outputs;
#X text 498 444 1 \, otherwise (if clean) \, zero.;
#X text 161 583 add to let in channels;
#X text 159 597 for either criterion;
#X connect 0 0 6 1;
#X connect 1 0 7 0;
#X connect 2 0 24 0;
#X connect 3 0 5 0;
#X connect 4 0 3 0;
#X connect 5 0 11 0;
#X connect 5 0 8 0;
#X connect 5 0 8 1;
#X connect 5 0 23 0;
#X connect 5 1 0 0;
#X connect 5 1 2 0;
#X connect 5 1 2 1;
#X connect 5 1 22 0;
#X connect 6 0 1 0;
#X connect 8 0 24 0;
#X connect 9 0 23 1;
#X connect 9 0 22 1;
#X connect 10 0 31 0;
#X connect 11 0 6 0;
#X connect 12 0 3 1;
#X connect 13 0 19 0;
#X connect 14 0 17 0;
#X connect 15 0 1 1;
#X connect 16 0 32 0;
#X connect 17 0 18 0;
#X connect 20 0 60 0;
#X connect 21 0 20 1;
#X connect 22 0 26 0;
#X connect 22 0 28 0;
#X connect 22 0 53 0;
#X connect 22 0 54 0;
#X connect 23 0 25 0;
#X connect 23 0 27 0;
#X connect 23 0 51 0;
#X connect 23 0 52 0;
#X connect 24 0 9 0;
#X connect 25 0 51 1;
#X connect 26 0 53 1;
#X connect 27 0 52 1;
#X connect 28 0 54 1;
#X connect 29 0 32 1;
#X connect 30 0 33 0;
#X connect 30 0 35 0;
#X connect 30 0 34 0;
#X connect 31 0 30 0;
#X connect 32 0 10 0;
#X connect 32 0 37 0;
#X connect 33 0 36 0;
#X connect 34 0 33 1;
#X connect 35 0 36 1;
#X connect 36 0 46 0;
#X connect 37 0 39 0;
#X connect 38 0 40 0;
#X connect 38 0 42 0;
#X connect 38 0 41 0;
#X connect 39 0 38 0;
#X connect 40 0 43 0;
#X connect 41 0 40 1;
#X connect 42 0 43 1;
#X connect 43 0 44 0;
#X connect 44 0 45 0;
#X connect 45 0 46 1;
#X connect 46 0 20 0;
#X connect 47 0 32 1;
#X connect 48 0 32 0;
#X connect 51 0 48 0;
#X connect 51 0 48 1;
#X connect 52 0 16 0;
#X connect 52 0 16 1;
#X connect 53 0 47 0;
#X connect 53 0 47 1;
#X connect 54 0 29 0;
#X connect 54 0 29 1;
#X connect 58 0 60 1;
#X connect 59 0 58 0;
#X connect 60 0 11 1;
#X connect 60 0 0 1;
#X connect 61 0 10 1;
#X connect 62 0 37 1;
#X connect 63 0 61 0;
#X connect 64 0 62 0;
#X restore 49 410 pd fft-analysis;
#X floatatom 355 287 0 0 100 0 - - -;
#X text 138 10 PITCHED/UNPITCHED SEPARATION;
#X obj 48 443 output~;
#X floatatom 48 356 0 0 100 0 - - -;
#X text 105 337 noise;
#X floatatom 108 356 0 0 100 0 - - -;
#N canvas 214 193 769 642 test-signal 0;
#X obj 75 328 line~;
#X obj 75 250 f;
#X obj 517 236 *~;
#X obj 76 442 *~;
#X obj 517 127 noise~;
#X obj 371 494 +~;
#X obj 98 415 dbtorms;
#X obj 539 210 dbtorms;
#X obj 98 390 inlet;
#X obj 539 186 inlet;
#X obj 373 568 outlet~;
#X msg 75 304 0 \, \$1 \$2;
#X obj 75 276 pack 0 0;
#X obj 236 248 /;
#X obj 251 190 * 0.001;
#X obj 251 219 t b f;
#X obj 372 543 hip~ 5;
#X obj 75 136 loadbang;
#X obj 75 182 metro 1000;
#X obj 517 152 bp~ 10000 3;
#X obj 75 161 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
;
#X text 270 247 sample duration \, msec;
#X text 126 84 looped sample playback;
#X obj 75 356 tabread4~ \$0-sample;
#X text 514 100 filtered noise;
#X text 105 15 TEST SIGNAL: looped sample plus noise. The inlets control
amplitude of each in dB.;
#X obj 236 139 r \$0-samplength;
#X obj 251 164 r \$0-insamprate;
#X obj 658 244 *~;
#X obj 680 218 dbtorms;
#X obj 680 194 inlet;
#X text 655 108 osc;
#X obj 658 134 osc~ 440;
#X obj 372 519 *~ 3;
#X connect 0 0 23 0;
#X connect 1 0 12 0;
#X connect 2 0 5 1;
#X connect 3 0 5 0;
#X connect 4 0 19 0;
#X connect 5 0 33 0;
#X connect 6 0 3 1;
#X connect 7 0 2 1;
#X connect 8 0 6 0;
#X connect 9 0 7 0;
#X connect 11 0 0 0;
#X connect 12 0 11 0;
#X connect 13 0 12 1;
#X connect 13 0 18 1;
#X connect 14 0 15 0;
#X connect 15 0 13 0;
#X connect 15 1 13 1;
#X connect 16 0 10 0;
#X connect 17 0 20 0;
#X connect 18 0 1 0;
#X connect 19 0 2 0;
#X connect 20 0 18 0;
#X connect 23 0 3 0;
#X connect 26 0 1 1;
#X connect 26 0 13 0;
#X connect 27 0 14 0;
#X connect 28 0 5 1;
#X connect 29 0 28 1;
#X connect 30 0 29 0;
#X connect 32 0 28 0;
#X connect 33 0 16 0;
#X restore 48 380 pd test-signal;
#X text 32 334 sampler;
#X text 56 314 amplitudes (dB);
#N canvas 0 110 565 454 hann-window 0;
#N canvas 0 0 450 300 graph1 0;
#X array \$0-hann 1024 float 0;
#X coords 0 1 1023 0 300 100 1;
#X restore 82 311 graph;
#X obj 378 165 osc~;
#X obj 378 190 *~ -0.5;
#X obj 378 214 +~ 0.5;
#X obj 331 247 tabwrite~ \$0-hann;
#X obj 37 88 r window-size;
#X obj 38 173 /;
#X obj 127 142 samplerate~;
#X obj 38 251 s window-sec;
#X obj 177 204 swap;
#X obj 177 228 /;
#X obj 177 252 s window-hz;
#X obj 49 201 * 1000;
#X obj 49 228 s window-msec;
#X obj 38 115 t f b f;
#X msg 173 92 resize \$1;
#X obj 173 116 s \$0-hann;
#X obj 330 105 r window-hz;
#X msg 382 130 0;
#X obj 330 131 t f b;
#X text 15 8 calculate Hann window table (variable window size) and
constants window-hz (fundamental frequency of analysis) \, window-sec
and window-msec (analysis window size in seconds and msec).;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X connect 3 0 4 0;
#X connect 5 0 14 0;
#X connect 6 0 8 0;
#X connect 6 0 12 0;
#X connect 7 0 6 1;
#X connect 7 0 9 1;
#X connect 9 0 10 0;
#X connect 9 1 10 1;
#X connect 10 0 11 0;
#X connect 12 0 13 0;
#X connect 14 0 6 0;
#X connect 14 0 9 0;
#X connect 14 1 7 0;
#X connect 14 2 15 0;
#X connect 15 0 16 0;
#X connect 17 0 19 0;
#X connect 18 0 1 1;
#X connect 19 0 1 0;
#X connect 19 1 4 0;
#X connect 19 1 18 0;
#X restore 457 458 pd hann-window;
#N canvas 52 71 774 520 tables 0;
#N canvas 0 0 450 300 graph1 0;
#X array \$0-last-real 2048 float 0;
#X coords 0 500 2048 -500 200 150 1;
#X restore 103 15 graph;
#N canvas 0 0 450 300 graph2 0;
#X array \$0-last-imag 2048 float 0;
#X coords 0 500 2048 500 200 150 1;
#X restore 497 6 graph;
#N canvas 0 0 450 300 graph1 0;
#X array \$0-precess-real 2048 float 0;
#X coords 0 500 2048 -500 200 150 1;
#X restore 105 185 graph;
#N canvas 0 0 450 300 graph2 0;
#X array \$0-precess-imag 2048 float 0;
#X coords 0 500 2048 -500 200 150 1;
#X restore 501 178 graph;
#N canvas 0 0 450 300 graph1 0;
#X array \$0-inc-real 2048 float 0;
#X coords 0 1 2048 -1 200 150 1;
#X restore 105 357 graph;
#N canvas 0 0 450 300 graph2 0;
#X array \$0-inc-imag 2048 float 0;
#X coords 0 1 2048 -1 200 150 1;
#X restore 503 342 graph;
#X restore 457 479 pd tables;
#N canvas 388 86 722 350 insample 0;
#N canvas 0 0 450 300 graph1 0;
#X array \$0-sample 62079 float 0;
#X coords 0 1 62078 -1 400 150 1;
#X restore 259 24 graph;
#X obj 19 23 r read-sample;
#X obj 19 74 unpack s f;
#X obj 19 184 soundfiler;
#X text 356 250 read a sample;
#X obj 276 249 loadbang;
#X obj 19 100 t s b;
#X obj 75 99 symbol \$0-sample;
#X obj 19 135 pack s s;
#X msg 19 160 read -resize \$1 \$2;
#X obj 74 46 44100;
#X obj 19 47 t a b;
#X msg 276 273 \; read-sample ../sound/bell.aiff;
#X obj 29 208 s \$0-samplength;
#X obj 116 74 s \$0-insamprate;
#X obj 19 247 /;
#X obj 19 271 * 1000;
#X obj 19 294 s \$0-samp-msec;
#X obj 57 247 r \$0-insamprate;
#X connect 1 0 11 0;
#X connect 2 0 6 0;
#X connect 2 1 14 0;
#X connect 3 0 13 0;
#X connect 3 0 15 0;
#X connect 5 0 12 0;
#X connect 6 0 8 0;
#X connect 6 1 7 0;
#X connect 7 0 8 1;
#X connect 8 0 9 0;
#X connect 9 0 3 0;
#X connect 10 0 14 0;
#X connect 11 0 2 0;
#X connect 11 1 10 0;
#X connect 15 0 16 0;
#X connect 16 0 17 0;
#X connect 18 0 15 1;
#X restore 233 501 pd insample;
#X msg 233 403 ../sound/bell.aiff;
#X msg 233 426 ../sound/voice.wav;
#X msg 233 449 ../sound/voice2.wav;
#X text 236 383 change input sound;
#X obj 233 473 s read-sample;
#X floatatom 233 523 5 0 0 0 - #0-samp-msec -;
#X text 286 522 sample length \, msec;
#X floatatom 233 285 0 0 100 0 - - -;
#X floatatom 169 356 0 0 100 0 - - -;
#X text 167 336 osc;
#X msg 471 325 512;
#X msg 471 346 1024;
#X msg 471 368 2048;
#X obj 471 413 s window-size;
#X msg 471 390 4096;
#X obj 233 308 s clean;
#X text 233 331 0=silent;
#X text 231 351 100=all;
#X obj 355 310 s dirty;
#X text 351 331 100=silent;
#X text 353 348 0=all;
#X text 354 563 updated for Pd version 0.39;
#X text 11 212 Two separate thresholds may be adjusted to listen to
the "clean" or "dirty" part of the signal. You'll hear anything less
incoherent than the clean threshold \, OR more incoherent than the
dirty one.;
#X text 13 35 This patch applies a very simple coherence test to distinguish
between sinusoids and noise in an input signal. It works very imperfectly
(since noise is random \, no matter what test we place on it it will
sometimes spoof its way in.) Here we just test that neighboring channels
are 180 degrees (pi radians) out of phase \, as they should be in the
main lobe in response to a sinusoid. If any three channels are so arranged
\, all three are considered as contributing to a sinusoid. To do this
we make an "incoherence" measure which is zero if the phase relationship
is perfect and progressively larger otherwise.;
#X connect 0 0 3 0;
#X connect 0 0 3 1;
#X connect 1 0 31 0;
#X connect 4 0 7 0;
#X connect 6 0 7 1;
#X connect 7 0 0 0;
#X connect 13 0 17 0;
#X connect 14 0 17 0;
#X connect 15 0 17 0;
#X connect 20 0 28 0;
#X connect 21 0 7 2;
#X connect 23 0 26 0;
#X connect 24 0 26 0;
#X connect 25 0 26 0;
#X connect 27 0 26 0;
