#N canvas 0 87 1280 713 10; #X obj 48 85 osc~; #X obj 48 120 rfft~; #X obj 48 143 cyclone/cartopol~; #X obj 146 253 -~; #N canvas 0 50 450 250 (subpatch) 0; #X array fase 64 float 2; #X coords 0 3.14 64 -3.14 200 140 1 0 0; #X restore 948 71 graph; #N canvas 0 50 450 250 (subpatch) 0; #X array amplitude 64 float 2; #X coords 0 64 64 0 200 140 1 0 0; #X restore 950 252 graph; #N canvas 0 50 450 250 (subpatch) 0; #X array diferença 64 float 2; #X coords 0 1 64 -1 200 140 1 0 0; #X restore 950 432 graph; #X obj 146 329 wrap~; #X obj 146 276 +~ 3.14159; #X obj 145 304 /~ 6.28319; #X obj 147 359 -~ 0.5; #X obj 357 326 array max amplitude; #X floatatom 684 566 5 0 0 1 (diferença_de_fase_encontrada) - -; #X obj 357 566 +; #X obj 16 120 dac~; #X obj 48 436 tabsend~ amplitude; #X obj 78 413 tabsend~ fase; #X obj 562 145 expr 44100/$f1; #X obj 677 129 block~; #X msg 677 103 set \$1 1 1; #X obj 562 87 t f f f; #X obj 48 58 nbx 5 20 20 20000 1 1 empty empty Frequência 85 10 0 16 -262144 -1 -1 400 256; #X obj 357 282 tgl 15 1 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 357 302 metro 100; #X obj 393 66 vradio 15 1 1 8 empty empty Tamanho_de_bloco 0 -8 0 10 -262144 -1 -1 0; #X text 413 64 64; #X text 413 79 128; #X text 413 94 256; #X text 413 109 512; #X text 413 124 1024; #X obj 393 191 expr 64*pow(2 \, $f1); #X floatatom 562 63 5 0 0 1 Tamanho_de_bloco - -; #X text 413 139 2048; #X text 413 154 4096; #X text 413 169 8192; #X text 86 86 gera sinal senoidal puro; #X text 93 121 calcula FFT; #X text 158 163 usa a diferença de fases iniciais entre janelas sucessivas para re-estimar a frequência do bin de máxima amplitude, f 33; #X text 174 253 diferença de fase; #X text 219 276 transforma diferença de fase para intervalo entre -0.5...+0.5, f 11; #X obj 147 386 tabsend~ diferença; #X obj 376 539 array get diferença 0 1; #X obj 359 653 hsl 512 15 0 1000 0 0 empty empty Frequência_re-estimada_pela_diferença_de_fases -2 -8 0 10 -262144 -1 -1 19370 1; #X text 449 63 obs: [dac~] só funciona com 64, f 15; #X text 485 326 encontra índice de máxima amplitude no espectro; #X text 524 539 encontra a diferença de fase normalizada para aquele índice; #X text 477 590 transforma índice para frequência em Hertz; #X text 43 17 ESTIMAÇÃO DE F0 USANDO DIFERENÇAS ENTRE FASES INICIAIS: ; #X text 384 566 soma ao índice de máxima amplitude; #X text 558 192 A resolução da análise corresponde à diferença entre bins sucessivos da FFT \, e também ao erro de pior caso que se comete ao estimar a frequência fundamental a partir de um índice da FFT., f 50; #X obj 360 458 hsl 512 15 0 1000 0 0 empty empty Frequência_(Hz)_do_bin_de_máxima_amplitude -2 -8 0 10 -262144 -1 -1 35211 1; #X text 477 379 transforma índice para frequência em Hertz; #X obj 357 351 t f f f; #X obj 581 117 v B; #X obj 357 378 expr $f1*44100/B; #X obj 357 589 expr $f1*44100/B; #X text 348 679 0Hz; #X text 853 679 1000Hz; #X text 547 679 400Hz; #X obj 358 418 nbx 5 20 -1e+37 1e+37 0 0 empty empty Frequência_(Hz)_do_bin_de_máxima_amplitude 85 10 0 16 -262144 -1 -1 689.062 256; #X obj 357 614 nbx 5 20 -1e+37 1e+37 0 0 empty empty Frequência_re-estimada_pela_diferença_de_fases 85 10 0 16 -262144 -1 -1 379.067 256; #X text 352 664 |; #X text 559 664 |; #X text 868 664 |; #X text 406 664 |; #X text 457 664 |; #X text 508 664 |; #X text 611 664 |; #X text 662 664 |; #X text 713 664 |; #X text 764 664 |; #X text 815 664 |; #X text 349 484 0Hz; #X text 854 484 1000Hz; #X text 548 484 400Hz; #X text 353 469 |; #X text 560 469 |; #X text 869 469 |; #X text 407 469 |; #X text 458 469 |; #X text 509 469 |; #X text 612 469 |; #X text 663 469 |; #X text 714 469 |; #X text 765 469 |; #X text 816 469 |; #X obj 423 226 array size fase; #X obj 423 270 array size amplitude; #X obj 423 248 array size diferença; #X text 421 208 redimensiona tabelas; #X msg 553 258 \; amplitude bounds 0 \$1 \$1 0; #X obj 161 229 tabreceive~ fase; #X obj 562 169 nbx 5 20 -1e+37 1e+37 0 0 empty empty Resolução_da_análise_(Hz) 85 10 0 16 -262144 -1 -1 689.062 256; #X text 62 496 Observe a diferença de flutuação entre a estimação simples através do bin de máxima amplitude e a re-estimação pela diferença de fases. Mesmo com B=64 (resolução de análise de 689 Hz) já é possível observar valores próximos da frequência verdadeira (400 Hz no exemplo). Com blocos maiores ambas as estimativas melhoram \, mas a re-estimação pela diferença de fase sempre leva alguma vantagem., f 42; #X connect 0 0 14 0; #X connect 0 0 14 1; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 2 1; #X connect 2 0 15 0; #X connect 2 1 3 0; #X connect 2 1 16 0; #X connect 3 0 8 0; #X connect 7 0 10 0; #X connect 8 0 9 0; #X connect 9 0 7 0; #X connect 10 0 40 0; #X connect 11 1 52 0; #X connect 13 0 55 0; #X connect 17 0 92 0; #X connect 19 0 18 0; #X connect 20 0 17 0; #X connect 20 1 53 0; #X connect 20 2 19 0; #X connect 21 0 0 0; #X connect 22 0 23 0; #X connect 23 0 11 0; #X connect 24 0 30 0; #X connect 30 0 31 0; #X connect 30 0 86 0; #X connect 30 0 88 0; #X connect 30 0 87 0; #X connect 30 0 90 0; #X connect 31 0 20 0; #X connect 41 0 12 0; #X connect 41 0 13 1; #X connect 52 0 13 0; #X connect 52 1 41 0; #X connect 52 2 54 0; #X connect 54 0 59 0; #X connect 55 0 60 0; #X connect 59 0 50 0; #X connect 60 0 42 0; #X connect 91 0 3 1;