#N canvas 135 23 1094 710 10;
#X obj 603 351 triangle~ 0;
#X obj 603 315 phasor~;
#X obj 620 390 output~;
#X obj 751 525 cnv 15 198 138 empty empty empty 20 12 0 14 -203904
-66577 0;
#N canvas 0 22 450 300 (subpatch) 0;
#X array \$0-band-limited 100 float 1;
#A 0 -0.176896 -0.267545 -0.358195 -0.448845 -0.539495 -0.630145 -0.720795
-0.811445 -0.902095 -0.259732 0.96431 0.914756 0.705089 0.637685 0.557316
0.462006 0.371039 0.281004 0.190274 0.0995664 0.00893701 -0.08171 -0.172363
-0.263013 -0.353662 -0.444312 -0.534962 -0.625612 -0.716262 -0.806912
-0.897562 -0.359123 0.930306 0.931732 0.710951 0.640385 0.562032 0.46672
0.375515 0.285526 0.194815 0.104099 0.0134687 -0.0771772 -0.16783 -0.25848
-0.34913 -0.43978 -0.53043 -0.62108 -0.71173 -0.802379 -0.89303 -0.35459
0.934839 0.936264 0.715483 0.644918 0.566564 0.471252 0.380048 0.290059
0.199348 0.108631 0.0180012 -0.0726446 -0.163298 -0.253948 -0.344597
-0.435247 -0.525897 -0.616547 -0.707197 -0.797847 -0.888497 -0.449867
0.894302 0.95296 0.722051 0.647501 0.571216 0.475992 0.384526 0.294577
0.20389 0.113164 0.0225328 -0.0681118 -0.158765 -0.249415 -0.340065
-0.430715 -0.521364 -0.612014 -0.702664 -0.793314 -0.883964 -0.539572
0.847041 0.969092;
#X coords 0 1.1 99 -1.1 200 140 1;
#X restore 750 524 graph;
#X text 736 519 1;
#X text 730 651 -1;
#X text 736 586 0;
#N canvas 232 59 321 281 plot 0;
#X obj 85 111 metro 441;
#X obj 85 60 loadbang;
#X obj 85 87 tgl 15 0 empty empty empty 17 7 0 10 -203904 -1 -1 1 1
;
#X obj 56 164 tabwrite~ \$0-band-limited;
#X obj 56 28 inlet~;
#X connect 0 0 3 0;
#X connect 1 0 2 0;
#X connect 2 0 0 0;
#X connect 4 0 3 0;
#X restore 720 446 pd plot;
#X obj 734 368 output~;
#N canvas 232 59 321 281 plot 0;
#X obj 85 111 metro 441;
#X obj 85 60 loadbang;
#X obj 85 87 tgl 15 0 empty empty empty 17 7 0 10 -203904 -1 -1 1 1
;
#X obj 56 28 inlet~;
#X obj 56 164 tabwrite~ \$0-non-limited;
#X connect 0 0 4 0;
#X connect 1 0 2 0;
#X connect 2 0 0 0;
#X connect 3 0 4 0;
#X restore 603 450 pd plot;
#X obj 516 522 cnv 15 198 138 empty empty empty 20 12 0 14 -212542
-66577 0;
#N canvas 0 22 450 300 (subpatch) 0;
#X array \$0-non-limited 100 float 1;
#A 0 -0.26176 -0.352463 -0.443166 -0.533869 -0.624572 -0.715274 -0.805977
-0.89668 -0.987383 0.921914 0.831211 0.740508 0.649805 0.559102 0.468399
0.377696 0.286993 0.19629 0.105587 0.0148842 -0.0758187 -0.166522 -0.257225
-0.347927 -0.43863 -0.529333 -0.620036 -0.710739 -0.801442 -0.892145
-0.982848 0.926449 0.835746 0.745043 0.65434 0.563637 0.472934 0.382231
0.291528 0.200825 0.110122 0.0194196 -0.0712833 -0.161986 -0.252689
-0.343392 -0.434095 -0.524798 -0.615501 -0.706204 -0.796907 -0.88761
-0.978313 0.930984 0.840281 0.749578 0.658875 0.568172 0.477469 0.386767
0.296064 0.205361 0.114658 0.0239549 -0.0667481 -0.157451 -0.248154
-0.338857 -0.42956 -0.520263 -0.610966 -0.701669 -0.792372 -0.883075
-0.973778 0.935519 0.844817 0.754114 0.663411 0.572708 0.482005 0.391302
0.300599 0.209896 0.119193 0.0284901 -0.0622129 -0.152916 -0.243619
-0.334322 -0.425025 -0.515728 -0.606431 -0.697134 -0.787836 -0.878539
-0.969242 0.940055 0.849352 0.758649;
#X coords 0 1.1 99 -1.1 200 140 1;
#X restore 515 521 graph;
#X text 501 516 1;
#X text 495 648 -1;
#X text 501 583 0;
#X obj 603 262 nbx 5 20 -1e+37 1e+37 0 0 empty \$0-Hz empty 0 -8 0
15 -261234 -1 -1 2000 256;
#X obj 860 392 s \$0-Hz;
#X obj 860 334 loadbang;
#X msg 860 361 2000;
#X text 85 36 Este exemplo remete ao J07.Oversampling dos exemplos
do Pd \, onde filtramos um sinal para evitar o aliasing antes de um
resampleamento. Essa técnica serve para gerar formas de ondas de banda
limitada com boa qualidade.;
#X text 86 99 Reforçando que o aliasing ocorre para frequências acima
da frequência de Nyquist \, é pertinente que tenhamos osciladores digitais
com banda limitada - isso é \, com frequências até a de Nyquist.;
#X text 87 159 Uma forma de atingir esse objetivo é com um processo
de filtragem que elimine as frequências acima do Nyquist. Um filtro
desse tipo se chama "Passa Baixa" \, pois permite apenas que as frequências
abaixo de uma certa frequência dada permaneçam intactas \, enquanto
as frequências altas são "barradas".;
#X text 88 245 Veremos em detalhes sobre filtros somente depois. Mas
isso não impede que já tratemos do assunto para complementarmos essa
seção sobre síntese. Basta que fique claro que o mais importante é
filtrar o sinal com um Passa Baixa e cortar todas as frequências acima
de Nyquist. Como queremos evitar o aliasing \, esse tipo de filtro
pode ser chamado de Anti-Aliasing - mas na prática é somente um Passa
Baixa.;
#X text 88 346 O outro recurso para gerarmos ondas de boa qualidade
é o Oversampling \, que implica em aumentamos bastante a Taxa de Amostragem
\, de modo que a frequência de Nyquist é jogada lá pra cima!;
#X text 87 409 Temos neste exemplo um Oversampling de 16 vezes. No
caso de uma taxa de 44.1 Khz \, isso significa que a Taxa de Amostragem
vai para 705.6 Khz (44.1 x 16 = 705.6)! E a frequência de Nyquist fica
em 352.8 Khz!;
#X text 88 471 Ou seja \, com o Pd rodando em 44.1 Khz \, o Oversampling
nos permite gerar frequências até em torno de 350 Khz sem problemas.
Na verdade \, nosso filtro Passa Baixa tem uma frequência de corte
de 240 Khz (correspondendo a 15 Khz em 44.1 KHz - 240/16 = 15) \, a
partir da qual começa a agir. Em torno de 350 Khz \, a ação de corte
nos agudos do filtro já é mais que suficiente.;
#X text 86 581 Esse processamento todo de Oversampling precisa ser
feito em um suboatch \, com o objeto [block~]. Você pode ainda rodar
o Pd em uma taxa de amostragem ainda maior para testar \, se sua placa
de som permitir \, é claro.;
#X text 554 21 No subpatch abaixo [pd Banda-Limitada] \, depois que
geramos essa forma de onda com bastante qualidade e aplicamos o filtro
\, basta mandar para o [outlet~] que o sinal será ressampleado para
a Taxa que o Pd está rodando.;
#X text 555 90 Por mais que \, em tese \, perde-se um pouco da qualidade
da forma de onda ao resamplearmos abaixo para a Taxa de Amostragem
que o Pd está rodando \, muito da qualidade de geração do sinal em
oversampling se mantém e faz diferença!;
#X text 557 160 Compare abaixo o resultado sonoro de uma dente de serra
limitada com uma não limitada e confira a implementação no subpatch
[pd Banda-Limitada]. A frequência do oscilador está bem aguda (2.000
Hz) para que o efeito de aliasing seja mais perceptível.;
#N canvas 184 25 718 293 Anti-Aliasing 0;
#X obj 64 76 phasor~;
#X obj 64 31 inlet;
#X obj 64 244 outlet~;
#N canvas 68 23 584 356 Passa_Baixa 0;
#X obj 39 192 *~ 0.125;
#X obj 39 215 rzero~ -1;
#X obj 39 238 rzero~ -1;
#X obj 39 261 rzero~ -1;
#X obj 39 292 outlet~;
#X obj 39 90 rpole~ 0.87467;
#X obj 39 64 *~ 0.12532;
#X obj 39 115 *~ 0.01668;
#X obj 39 140 cpole~ 0.9293 0.10812;
#X obj 39 166 cpole~ 0.9293 -0.10812;
#X obj 39 35 inlet~;
#X text 205 71 Como dito \, a teoria sobre filtros só será apresentada
posteriormente \, portanto não se preocupe em entender como funcionam
esses objetos.;
#X text 207 127 Dos detalhes técnicos \, podemos dizer que esse subpatch
implementa um filtro Passa Baixa Butterworth \, de 3-Polos e 3-Zeros
a partir de filtros crus do Vanilla. O filtro considera uma frequência
de corte de 15kHz (assumindo o upsampling de 16 vezes neste subpatch).
;
#X text 209 208 Na seção de Filtros-II é que essa teoria e implementação
deverá ficar mais clara.;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X connect 3 0 4 0;
#X connect 5 0 7 0;
#X connect 6 0 5 0;
#X connect 7 0 8 0;
#X connect 8 0 9 0;
#X connect 8 1 9 1;
#X connect 9 0 0 0;
#X connect 10 0 6 0;
#X restore 64 204 pd Passa_Baixa;
#X obj 64 108 triangle~ 0;
#X text 160 90 <= Dente de Serra;
#X text 97 139 A geração do sinal pelo oscilador precisa ser realizada
no subpatch com Oversampling.;
#X obj 303 50 cnv 15 380 70 empty empty empty 20 12 0 14 -233017 -66577
0;
#X obj 544 88 block~ 1024 1 16;
#X text 315 61 Upsampling de 16 vezes (o tamanho do bloco também precisa
ser ajustado como 64 * 16 = 1024):;
#X text 179 203 <= Filtro Anti-Aliasing (abra);
#X connect 0 0 4 0;
#X connect 1 0 0 0;
#X connect 3 0 2 0;
#X connect 4 0 3 0;
#X restore 720 319 pd Anti-Aliasing;
#X connect 0 0 2 1;
#X connect 0 0 2 0;
#X connect 0 0 10 0;
#X connect 1 0 0 0;
#X connect 16 0 31 0;
#X connect 16 0 1 0;
#X connect 18 0 19 0;
#X connect 19 0 17 0;
#X connect 31 0 8 0;
#X connect 31 0 9 0;
#X connect 31 0 9 1;
