• Nenhum resultado encontrado

2.2 Processamentos representativos para manipula¸c˜ao de ´ audio

2.2.3 S´ıntese aditiva

A s´ıntese aditiva ´e um processo de constru¸c˜ao de um sinal atrav´es da soma de uma s´erie de sinais peri´odicos mais simples. As componentes mais simples em geral n˜ao s˜ao percebidas individu- almente, mas contribuem para a forma¸c˜ao do sinal resultante. Esta t´ecnica tem sido muito utilizada para a obten¸c˜ao de novos sons e tamb´em para a ress´ıntese de sinais ap´os terem passado por al- gum tipo de an´alise e processamento (Moore,1990). As componentes b´asicas da s´ıntese aditiva s˜ao fun¸c˜oes peri´odicas, governadas por fun¸c˜oes de amplitude e fase independentes, `as quais s˜ao dadas o nome de osciladores (veja a Figura 2.3). Quanto maior o n´umero de osciladores utilizados, mais ricos em informa¸c˜ao podem ser os sinais gerados. Mas quanto maior o n´umero de parcelas que tˆem que ser calculadas, tamb´em ´e maior a quantidade de recursos computacionais necess´arios para o c´alculo da forma de onda sintetizada.

Figura 2.3: S´ıntese aditiva: diversos osciladores governados por fun¸c˜oes de amplitude e fase independentes s˜ao combinados para formar um sinal mais complexo.

O teorema de Fourier diz que ´e poss´ıvel sintetizar qualquer sinal peri´odico atrav´es de um conjunto (possivelmente infinito) de sinais senoidais harmonicamente relacionados (Moore,1990). Apesar disso, ´e poss´ıvel utilizar a s´ıntese aditiva para gerar sinais n˜ao peri´odicos com banda de frequˆencias limitada, atrav´es de um conjunto finito de osciladores. A ideia ´e utilizar o janelamento deslizante (veja a Se¸c˜ao 2.2.2) para sintetizar blocos de amostras que podem ser combinados de forma a compor um sinal mais complexo.

Considere inicialmente um conjunto de K frequˆencias constantes fk expressas em Hz e um conjunto de K fun¸c˜oes de amplitude rk(n) que variam com o tempo; neste caso, a soma de K

osciladores senoidais que gera um sinal de ´audio a uma frequˆencia de amostragem de R Hz ´e dada pela seguinte express˜ao:

y(n) = K X k=1 rk(n) sin 2πfk n R  , n ≥ 0.

A express˜ao acima considera que as frequˆencias dos osciladores s˜ao constantes. Para implemen- tar corretamente osciladores cujas frequˆencias podem variar com o tempo, ´e necess´ario adaptar a express˜ao considerando-se valores instantˆaneos de frequˆencia. Nesse sentido, define-se a frequˆencia instantˆanea como uma quantidade proporcional ao valor de incremento da fase (θ) da fun¸c˜ao seno, e assim a express˜ao da s´ıntese aditiva para frequˆencias que mudam ao longo do tempo corresponde a: y(n) = K X k=1 rk(n) sin (θk(n)) , onde θk(n + 1) = θk(n) + ∆θk(n), e ∆θk(n) = 2π R ∆fk(n),

na qual ∆θk(n) ´e a frequˆencia instantˆanea, expressa em radianos, do k−´esimo oscilador e ∆fk(n) ´e a frequˆencia instantˆanea do k−´esimo oscilador expressa em Hz (Moore,1990).

Implementa¸c˜ao utilizando consulta a tabela

Existem diversas implementa¸c˜oes de aproxima¸c˜oes da fun¸c˜ao seno, como por exemplo atrav´es do c´alculo da expans˜ao da s´erie de Taylor ou como uma composi¸c˜ao de fra¸c˜oes, que convergem para o valor procurado com possibilidade de aproxima¸c˜ao arbitr´aria. Outra op¸c˜ao ´e utilizar as fun¸c˜oes trigonom´etricas de c´alculo de seno que em geral est˜ao presentes nas APIs dos dispositivos. Nem sempre estas op¸c˜oes s˜ao as mais econˆomicas em termos de custo computacional. Diferentes implementa¸c˜oes possuem diferentes qualidades de aproxima¸c˜ao e diferentes custos computacionais. Em determinados tipos de plataformas pode ser mais f´acil computar uma solu¸c˜ao em paralelo, enquanto que em outras um c´alculo de uma s´erie com muitas parcelas pode ser invi´avel.

Uma alternativa menos custosa em geral ´e a utiliza¸c˜ao de uma tabela previamente calculada contendo exatamente um per´ıodo da fun¸c˜ao seno amostrada em intervalos iguais. O valor da fase do oscilador pode ser mapeado e modulado para o tamanho da tabela e ´ındices fracion´arios podem ser consultados realizando algum tipo de interpola¸c˜ao no momento da consulta utilizando os valores dos ´ındices inteiros mais pr´oximos.

Na implementa¸c˜ao por consulta a tabela ´e utilizada uma tabela s = (s0, . . . , sS−1) de tamanho S contendo um per´ıodo da fun¸c˜ao seno amostrado em S pontos. Os ´ındices da tabela podem ser previamente calculados de acordo com a seguinte express˜ao:

si= sin(2πi/S), para i = 0, . . . , S − 1.

O intervalo [0, 2π[ pode ser mapeado para o intervalo [0, S[ e, caso o resultado seja um valor fracion´ario, diferentes t´ecnicas podem ser utilizadas para obter um valor intermedi´ario entre dois ´ındices inteiros da tabela s. Dado um valor θk entre 0 e 2π para a fase do k−´esimo oscilador (constante, por enquanto), ´e poss´ıvel obter ´ındices jk para consulta `a tabela atrav´es da seguinte rela¸c˜ao:

2.2 PROCESSAMENTOS REPRESENTATIVOS PARA MANIPULAC¸ ˜AO DE ´AUDIO 33

jk = θkS

2π .

Assim, substituindo θkna rela¸c˜ao acima pelo valor dos argumentos do seno para cada oscilador no c´alculo da s´ıntese aditiva com frequˆencias constantes, ´e poss´ıvel obter K ´ındices para consulta `

a tabela, um para cada oscilador, dados por jk = fknS/R. O c´alculo da s´ıntese aditiva de K osciladores, utilizando a nota¸c˜ao s[l] para expressar a consulta `a tabela no ´ındice (possivelmente fracion´ario) l, fica da seguinte forma:

y(n) = K X

k=1

rk(n)s[fknS/R].

No caso de frequˆencias fk que variam com o tempo, a frequˆencia instantˆanea deve ser levada em conta e o c´alculo da varia¸c˜ao do ´ındice ∆jk(n) fica:

∆jk(n) =

∆θk(n)S

2π = ∆fk(n) S R.

O algoritmo completo de s´ıntese aditiva com frequˆencias que podem variar no tempo, utilizando osciladores calculados por consulta a tabela fica, portanto, assim:

y(n) = K X k=1 rk(n)consulta(s, Lk(n)), Lk(n + 1) = Lk(n) + Ik(n) (mod S), onde

• y(n) ´e a sa´ıda do oscilador.

• rk(n) ´e a amplitude do oscilador k que varia ao longo do tempo.

• s ´e uma tabela de tamanho S contendo exatamente um per´ıodo de uma forma de onda de per´ıodo 2π amostrada nos pontos 0, 2π/S, 4π/S, . . . , (S − 1)2π/S.

• Lk(n) ´e o valor do ´ındice da tabela relacionado ao k−´esimo oscilador no instante n.

• consulta(s, l) ´e uma fun¸c˜ao de consulta (que ser´a comentada a seguir) que obt´em um valor fracion´ario l da tabela s.

• Ik(n) ´e o incremento do ´ındice de consulta a tabela no instante n dado por Ik(n) = fk(n)S/R, onde fk(n) ´e a frequˆencia a ser gerada pelo k−´esimo oscilador no instante n, S ´e o tamanho da tabela, e R ´e a taxa de amostragem.

Poss´ıveis formas de consulta a tabela

Em geral, o resultado da express˜ao ik = Lk(n) ´e um ´ındice fracion´ario para a maioria dos valores de k e n, e portanto alguma decis˜ao tem que ser tomada sobre a forma de consultar a tabela para obter um valor intermedi´ario ˜skque esteja entre ´ındices inteiros. Algumas possibilidades imediatas s˜ao:

• Consulta truncada:

˜

sk = s [⌊ik⌋] . • Consulta arredondada:

˜ sk =

(

s [⌊ik⌋] , ik− ⌊ik⌋ ≤ 0.5, s [⌈ik⌉] , caso contr´ario.

• Interpola¸c˜ao linear: toma-se os dois ´ındices inteiros mais pr´oximos de ik e calcula-se um valor intermedi´ario utilizando interpola¸c˜ao linear:

d = ik− ⌊ik⌋, i0 = ⌊ik⌋ (mod S), i1 = i0+ 1 (mod S), ˜

sk = (s[i1] − s[i0])d + s[i0].

• Interpola¸c˜ao c´ubica: toma-se quatro ´ındices inteiros pr´oximos de ik e calcula-se um valor intermedi´ario utilizando interpola¸c˜ao c´ubica:

d = ik− ⌊ik⌋, i0 = ⌊ik⌋ − 1 (mod S), i1 = i0+ 1 (mod S), i2 = i0+ 2 (mod S), i3 = i0+ 3 (mod S), ˜ s = −d(d − 1)(d − 2)s[i0] 6 + (d + 1)(d − 1)(d − 2)s[i1] 2 −(d + 1)d(d − 2)s[i2] 2 + (d + 1)d(d − 1)s[i3] 6 .

As op¸c˜oes acima s˜ao frequentemente utilizadas no c´alculo de ´ındices fracion´arios, e cada uma possui um custo computacional inversamente proporcional `a qualidade num´erica que proporciona no resultado do valor calculado. ´E interessante notar que qualquer esquema de consulta (mesmo a mais simples, com ´ındice truncado) pode ter sua qualidade num´erica melhorada arbitrariamente aumentando-se o tamanho da tabela. O tamanho da mem´oria de certos dispositivos pode repre- sentar um limite para este procedimento, como no caso do Arduino.

An´alise de desempenho na s´ıntese aditiva

Uma medida simples de desempenho na execu¸c˜ao da s´ıntese aditiva pode ser obtida incrementando- se o n´umero de osciladores e realizando-se uma compara¸c˜ao entre o tempo gasto na s´ıntese para diferentes quantidades de osciladores e o per´ıodo te´orico do ciclo DSP. Desta forma pode-se desco- brir qual ´e a maior quantidade de osciladores que pode ser utilizada em tempo real em uma certa plataforma computacional, dada uma implementa¸c˜ao de s´ıntese aditiva.

Fica claro que, al´em do n´umero de osciladores, diferentes formas de implementa¸c˜ao de consulta a tabela tamb´em possuem custos computacionais distintos. Nos testes realizados nas diferentes plataformas que ser˜ao descritos nos pr´oximos cap´ıtulos, sempre que poss´ıvel ser˜ao realizadas com- para¸c˜oes entre diferentes implementa¸c˜oes. Al´em disso, para plataformas mais limitadas, a utiliza¸c˜ao de frequˆencias constantes ou variantes com o tempo tamb´em pode causar diferen¸cas significativas no desempenho.