#N canvas 0 87 1280 713 10; #N canvas 0 50 450 250 (subpatch) 0; #X array onda 512 float 0; #X coords 0 1.1 511 -1.1 200 140 1 0 0; #X restore 37 124 graph; #X obj 278 145 bng 15 250 50 0 empty quadrada Quadrada 17 7 0 10 -262144 -1 -1; #N canvas 0 50 450 250 (subpatch) 0; #X array ressíntese 512 float 0; #X coords -2 1.1 514 -1.1 200 140 1 0 0; #X restore 41 310 graph; #N canvas 0 50 450 250 (subpatch) 0; #X array a 257 float 0; #X coords 0 1 256 -1 200 140 1 0 0; #X restore 283 314 graph; #N canvas 0 50 450 250 (subpatch) 0; #X array b 257 float 0; #X coords 0 1 256 -1 200 140 1 0 0; #X restore 503 315 graph; #X floatatom 339 528 5 0 256 2 Seleciona_até_Mésimo_harmônico - -; #X obj 583 181 switch~ 512; #X obj 583 158 tgl 15 0 empty switch empty 17 7 0 10 -262144 -1 -1 1 1; #N canvas 0 50 450 250 (subpatch) 0; #X array amp 257 float 0; #X coords 0 1 256 0 200 140 1 0 0; #X restore 734 315 graph; #N canvas 0 50 450 250 (subpatch) 0; #X array phi 257 float 0; #X coords 0 3.15 256 -3.15 200 140 1 0 0; #X restore 956 315 graph; #X floatatom 45 526 5 0 256 2 Seleciona_1_harmônico - -; #X obj 315 165 bng 15 250 50 0 empty empty Dente-de-serra 17 7 0 10 -262144 -1 -1; #X obj 353 190 bng 15 250 50 0 empty empty Triangular 17 7 0 10 -262144 -1 -1; #X obj 20 10 cnv 15 1200 40 empty empty Exemplo_109:_exploração_de_formas_de_onda_clássicas_e_seus_harmônicos 20 20 0 16 -262130 -4160 0; #X obj 483 146 loadbang; #X text 709 106 Análise da forma de onda:; #X text 275 106 Inicializações da forma de onda:; #X text 480 107 Inicialização do patch:, f 13; #X text 581 106 Liga/Desliga processamento DSP do patch:, f 13; #X text 709 155 Ressíntese da forma de onda:; #X text 280 269 Coeficientes de Fourier: Forma Cartesiana; #X text 730 269 Coeficientes de Fourier: Forma Polar; #X text 913 107 Refaz análise:; #X text 1017 107 Ressintetiza:; #X text 705 209 Vetores auxiliares (cópias de a e b):; #X msg 1020 133 \; ressintetiza 1 \;; #X msg 916 133 \; analisa 1 \;; #X msg 483 169 \; pd dsp 1 \; quadrada 1 \; switch 1 \; analisa 1 \; ; #N canvas 0 89 676 424 Análise 0; #X obj 49 98 tabplay~ onda; #X obj 48 251 tabwrite~ a; #X obj 76 221 tabwrite~ b; #X obj 399 295 tabwrite~ phi; #X obj 301 295 tabwrite~ amp; #X obj 49 72 bng 15 250 50 0 empty analisa empty 17 7 0 10 -262144 -1 -1; #X obj 59 233 bng 15 250 50 0 empty analisa empty 17 7 0 10 -262144 -1 -1; #X obj 84 203 bng 15 250 50 0 empty analisa empty 17 7 0 10 -262144 -1 -1; #X obj 311 277 bng 15 250 50 0 empty analisa empty 17 7 0 10 -262144 -1 -1; #X obj 409 276 bng 15 250 50 0 empty analisa empty 17 7 0 10 -262144 -1 -1; #X obj 49 153 rfft~; #X obj 301 256 cyclone/cartopol~; #X obj 49 331 tabwrite~ _a; #X obj 76 301 tabwrite~ _b; #X obj 86 283 bng 15 250 50 0 empty analisa empty 17 7 0 10 -262144 -1 -1; #X obj 59 313 bng 15 250 50 0 empty analisa empty 17 7 0 10 -262144 -1 -1; #X text 141 97 lê a tabela onda (=1 bloco de áudio); #X text 157 223 escreve o resultado nas tabelas a e b, f 14; #X text 159 302 copia os coeficientes nas tabelas _a e _b, f 16; #X text 297 209 conversão Cartesiano->Polar (depende da biblioteca cyclone), f 35; #X text 48 22 Realiza a transformada de Fourier da tabela "onda" \, armazenando os coeficientes nas tabelas a e b (forma Cartesiana) e nas tabelas amp e phi (forma Polar). Além disso \, copia os coeficientes a e b em vetores auxiliares _a e _b para permitir a ressíntese a partir de subconjuntos de harmônicos., f 102; #X text 71 70 (todos os bangs desse subpatch recebem comandos através do identificador "analisa"), f 85; #X obj 49 123 /~ 512; #X text 103 146 calcula a FFT real (igual a da aula \, a menos do fator 1/N \, compensado na entrada). Os coeficientes são a[k] = 2Σ x[n]cos(2πkn/N) e b[k] = 2Σ x[n]sen(2πkn/N)., f 84; #X connect 0 0 22 0; #X connect 5 0 0 0; #X connect 6 0 1 0; #X connect 7 0 2 0; #X connect 8 0 4 0; #X connect 9 0 3 0; #X connect 10 0 1 0; #X connect 10 0 11 0; #X connect 10 0 12 0; #X connect 10 1 2 0; #X connect 10 1 11 1; #X connect 10 1 13 0; #X connect 11 0 4 0; #X connect 11 1 3 0; #X connect 14 0 13 0; #X connect 15 0 12 0; #X connect 22 0 10 0; #X restore 709 130 pd Análise; #N canvas 0 89 450 300 Ressíntese 0; #X obj 47 220 tabwrite~ ressíntese; #X obj 125 118 tabplay~ _b; #X obj 49 118 tabplay~ _a; #X obj 49 99 bng 15 250 50 0 empty ressintetiza empty 17 7 0 10 -262144 -1 -1; #X obj 125 99 bng 15 250 50 0 empty ressintetiza empty 17 7 0 10 -262144 -1 -1; #X obj 57 197 bng 15 250 50 0 empty ressintetiza empty 17 7 0 10 -262144 -1 -1; #X obj 48 170 rifft~; #X text 47 15 Ressíntese da forma de onda a partir dos vetores de coeficientes _a e _b:; #X text 209 118 Lê as tabelas _a e _b gerando fluxos de áudio (=1 bloco de áudio); #X text 101 171 Transformada inversa; #X text 187 219 Escreve resultado na tabela ressíntese; #X text 52 59 (todos os bangs aqui recebem a mensagem "ressintetiza") ; #X connect 1 0 6 1; #X connect 2 0 6 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 0 0; #X connect 6 0 0 0; #X restore 709 179 pd Ressíntese; #N canvas 0 89 589 375 Inicializa 0; #X obj 190 65 ofelia f \; v=ofArray("onda") \; N=v:getSize() \; for i=0 \, N-1 do \; v[i]=1-2*i/N \; end \; return bang \;; #X obj 190 261 s analisa; #X obj 328 65 ofelia f \; v=ofArray("onda") \; N=v:getSize() \; for i=0 \, N/2-1 do \; v[i]=1-4*i/N \; v[N/2+i]=-v[i] \; end \; return bang \;; #X obj 53 65 ofelia f \; v=ofArray("onda") \; N=v:getSize() \; for i=0 \, N/2-1 do \; v[i]=1 \; v[N/2+i]=-1 \; end \; return bang \;; #X obj 53 32 inlet; #X obj 190 32 inlet; #X obj 328 32 inlet; #X connect 0 0 1 0; #X connect 2 0 1 0; #X connect 3 0 1 0; #X connect 4 0 3 0; #X connect 5 0 0 0; #X connect 6 0 2 0; #X restore 278 213 pd Inicializa; #N canvas 0 89 565 343 vetores 0; #N canvas 0 50 450 250 (subpatch) 0; #X array _a 257 float 0; #X coords 0 256 256 -256 200 140 1 0 0; #X restore 54 82 graph; #N canvas 0 50 450 250 (subpatch) 0; #X array _b 257 float 0; #X coords 0 256 256 -256 200 140 1 0 0; #X restore 286 81 graph; #X text 54 49 Cópias dos vetores a e b usadas na ressíntese:; #X restore 708 231 pd vetores auxiliares; #N canvas 0 89 450 364 Gera_M_Harmônicos 0; #X obj 57 132 r últimoharmônico; #X msg 57 43 \; _a const 0 \; _b const 0 \; últimoharmônico \$1 \; ressintetiza 1 \;; #X obj 57 157 ofelia f \; va=ofArray("a") \; vb=ofArray("b") \; v_a=ofArray("_a") \; v_b=ofArray("_b") \; N=va:getSize() \; v_a[0]=va[0] \; v_b[0]=vb[0] \; for i=1 \, a do \; v_a[i]=va[i] \; v_b[i]=vb[i] \; end \;; #X text 201 46 copiatodos os harmônicos até um certo ponto \, para permitir a observação de ressínteses parciais., f 35; #X obj 57 9 inlet; #X connect 0 0 2 0; #X connect 4 0 1 0; #X restore 339 558 pd Gera_M_Harmônicos; #N canvas 484 162 499 405 Gera_1_Harmônico 0; #X obj 64 140 r harmônico; #X msg 65 54 \; _a const 0 \; _b const 0 \; harmônico \$1 \; ressintetiza 1 \;; #X obj 65 15 inlet; #X text 112 16 recebe o número do harmônico; #X text 175 58 esvazia os vetores _a e _b e copia os coeficientes que correspondem ao k-ésimo harmônico., f 35; #X obj 64 332 outlet; #X text 64 361 devolve a amplitude e fase do harmônico; #X obj 349 332 outlet; #X obj 64 172 ofelia f -c12 \; va=ofArray("a") \; vb=ofArray("b") \; v_a=ofArray("_a") \; v_b=ofArray("_b") \; v_a[a]=va[a] \; v_b[a]=vb[a] \; amp=math.sqrt(va[a]^2+vb[a]^2) \; if amp<1e-10 then return ofTable(0 \, 0) \; else return ofTable(amp \, math.atan(vb[a]/va[a])) \; end \;; #X connect 0 0 8 0; #X connect 2 0 1 0; #X connect 8 0 5 0; #X connect 8 1 7 0; #X restore 45 556 pd Gera_1_Harmônico; #X obj 277 86 cnv 15 10 10 empty empty 1°_passo_-_selecione_a_forma_de_onda_desejada: 0 0 0 16 -262144 -1 0; #X obj 42 483 cnv 15 10 10 empty empty 2°_passo_-_selecione_o(s)_harmônico(s)_desejado: 0 0 0 16 -262144 -1 0; #X text 902 14 Obs: esse patch depende da biblioteca cyclone \, disponível no Deken (Ajuda->Procurar por externals), f 52; #X floatatom 45 585 5 0 0 1 Amplitude_do_harmônico - -; #X floatatom 156 613 5 0 0 1 Fase_do_harmônico - -; #X connect 1 0 30 0; #X connect 5 0 32 0; #X connect 7 0 6 0; #X connect 10 0 33 0; #X connect 11 0 30 1; #X connect 12 0 30 2; #X connect 14 0 27 0; #X connect 33 0 37 0; #X connect 33 1 38 0;