HudLac

14/08/2009

Osciladores

Uma ferramenta essencial para a síntese de som é o oscilador, que implementa ou simula um movimento ondulatório periódico, cuja freqüência pode ser controlada.

Há uma variedade de métodos para computar ondas senoidais digitalmente, o que possibilita a implementação de osciladores senoidais que diferem em critérios como velocidade, precisão e uso de memória.

Ondas complexas podem ser obtidas combinando-se vários osciladores senoidais, ou fornecendo-se a forma de onda pré-calculada a um oscilador de tabela de onda.

Formas de onda

Algumas das formas de onda mais usadas são apresentadas a seguir.

  1. Senoidal: Determinada pela função seno (ou cosseno);

    f(x) = cos(x)
    
  2. Dente-de-serra: Um período dessa forma de onda consiste simplesmente de uma rampa ascendente (que então salta abruptamente para o ponto inicial, na passagem para o próximo ciclo).

    Pode-ser obtida com:

    f(x) = x - floor(x)
    

    qué o mesmo que:

    f(x) = mod(x, 1.0)
    

    Pode ser aproximada utilizando-se harmônicos com amplitude inversa ao seu índice (número do harmônico):

    f(x) = cos(x) + cos(2x)/2 + cos(3x)/3 ...
    
  3. Quadrada: Alterna regularmente entre dois valores.
    Pode ser obtida, por exemplo, tomando-se o sinal (+, – ou 0) da saída de um oscilador senoidal:

    f(x) = sgn(sin(x))
    

    ou com o teste:

    mod(x, 1.0) >= 0.5
    

    Nesse caso, se o valor 0.5 for substituído por outro número entre 0 e 1, obtém-se um trem de pulsos ou onda retangular, dos quais a onda quadrada é um caso particular.

    A onda quadrada pode ser aproximada de maneira similar à onda dente-de-serra, mas usando-se somente harmônicos ímpares:

    f(x) = cos(x) + cos(3x)/3 + cos(5x)/5 ...
    
  4. Triangular: Formada por uma rampa ascendente seguida de uma rampa descendente.

    f(x) = abs( x - round(x) )
    

    Pode ser aproximada usando-se harmônicos ímpares, com amplitude inversa ao quadrado do número do harmônico, invertendo-se as fases (sinal) de cada componente com relação ao anterior:

    f(x) = cos(x) + cos(-3x)/9 + cos(5x)/25 + cos(-7x)/49 ...
    

    Usando-se função seno, pode-se inverter as amplitudes (ao invés da fases):

    f(x) = sin(x) - sin(3x)/9 + sin(5x)/25 - sin(7x)/49 ...
    

Como visto acima, as ondas triangular, quadrada e dente-de-serra (ideais) possuem infinitos harmônicos. Devido à limitação de banda determinada pelo Teorema da Amostragem, na forma digital o número de harmônicos deve ser restrito (conforme a freqüência fundamental) quando se quer evitar aliasing.

Tabelas de forma de onda
Para a síntese de sons periódicos complexos, pode-se evitar (re)calcular a função de onda para cada amostra: afinal, uma vez calculado um período da onda, basta repeti-lo ao longo da duração do som. Esse é o princípio básico da síntese por tabela de onda (table-lookup oscilators). Dada uma tabela contendo um período da onda, o oscilador simplesmente repete a tabela na freqüência desejada.

Osciladores com interpolação
O oscilador de tabela deverá decidir entre dois valores adjacentes, quando precisar de algum ponto da onda que inexista na tabela. Para reduzir a distorção causada por esse arredondamento, deve-se utilizar tabelas suficientemente grandes, com alta resolução. A qualidade será claramente superior com o uso de osciladores capazes de interpolar entre dois pontos da tabela, ou seja, calcular valores intermediários (inexistentes na tabela). Contudo, esses osciladores precisam realizar o cálculo de interpolação a cada amostra, o que, dependendo do caso, pode ser menos eficiente (e preciso) do que o cálculo direto da onda.

Filtros digitais

Filed under: Áudio digital — Tags: — ? @ 13:36

Alguns tipos de filtros:

Passa-altas: remove freqüências baixas
Passa-baixas: remove freqüências altas
Passa-banda (ou passa-faixa): permite a passagem apenas de uma faixa de freqüências
Rejeita-banda (ou rejeita-faixa): bloqueia freqüências dentro de uma faixa
Passa-tudo: mantém intactas as amplitudes de toda as freqüências, mas altera suas fases

Equalizador

Resposta em freqüência: espectro do filtro (domínio da freqüência)
Resposta ao impulso: efeito do filtro sobre um impulso (domínio do tempo)

06/08/2009

Ruído

Ruído é caracterizado pela natureza ou aparência aleatória e não periódica de um sinal. Ruído também é entendido como um componente indesejado que interfere no sinal.

Podem ser produzidos eletronicamente vários tipos de ruído.

Ruído branco

A forma mais simples de ruído produzida eletronicamente consiste apenas de uma sucessão de valores aleatórios (numa distribuição uniforme), que resulta no chamado ruído branco. O ruído branco ideal contém todas as freqüências simultaneamente e com igual potência em todas as faixas de freqüência. Obviamente, o ruído branco sintetizado digitalmente não pode conter freqüências superiores à freqüência de Nyquist.

Os valores aleatórios das amostras naturalmente “saltam” de maneira abrupta, o que mostra a presença das freqüências altas.

# Gera 16000 números aleatórios:
x = rand(16000,1);

# Toca a 16 kHz:
sound(x, 16000);
# (Experimente também outras
# taxas de amostragem, como:
# 8000, 44100 e 48000.)

# Plota 100 amostras:
plot(x(1:100),'*-');

Ruído Browniano

Há um outro tipo de ruído fácil de se produzir digitalmente, cujas freqüências altas são mais suaves em comparação com o ruído branco. O ruído browniano caracteriza-se por um espectro em que a amplitude é inversamente proporcional ao quadrado da freqüência, sendo por isso também chamado ruído 1/f^2.

O ruído Browniano pode ser produzido através de uma caminhada randômica: cada nova amostra aleatória “move-se” numa pequena distância em relação à amostra anterior. Se os valores no ruído branco dão (possivelmente grandes) “saltos” de qualquer ponto a qualquer outro, no ruído Browniano os valores dão pequenos “passos” a partir do ponto atual.

# Gera ruído Browniano:
r = zeros(16000,1);
maxpasso = .1;
for i = [2 : 16000]
   anterior = r(i-1);
   passo = maxpasso * (rand-0.5);
   novo = anterior + passo;
   if(novo>1 || novo<0)
       novo = anterior - passo;
   endif
   r(i) = novo;
endfor

# Toca a 16kHz:
sound(r, 16000);
# (Experimente também outras
# taxas de amostragem, como:
# 8000, 44100 e 48000.)

# Plota 100 amostras:
plot(r(1:100),'*-');

Interpolação

Outros tipos de ruídos podem ser obtidos pela “suavização” da onda, reduzindo-se o peso das freqüências altas. Uma faixa de ruído com freqüências baixas pode ser produzida gerando-se os números aleatórios numa taxa baixa (ao invés de um novo valor por amostra), e preenchendo-se as amostras intermediárias com uma progressão suave até o novo valor aleatório. Em outras palavras, utilizando-se interpolação entre os valores aleatórios.

# Gera 10 valores aleatórios:
Y = rand(10,1);
X = 1:10;

# Interpola por um fator de 3,
# para obter 30 valores:
X2 = 1:(9/29):10;
Y2 = interp1(X,Y,X2,'cubic');

# Plota valores:
plot(X,Y, 'b@;Original:;' , \
X2,Y2,'r*-;Interpolado:;' );

Ruído Rosa

O ruído rosa apresenta espectro em que a amplitude é inversamente proporcional à freqüência (1/f). Geralmente é produzido através de filtragem de ruído branco. Não há método matemático simples para obter ruído rosa, porém
há métodos para aproximações.

Um certo tipo de ruído 1/f pode ser produzido por um método determinístico, através da seguinte recorrência, cujo resultado caótico alterna trechos “quietos” e “agitados”:

# Prealoca vetor e inicializa primeiro ponto:
r = zeros(16000,1);
r(1) = rand();

# Calcula cada ponto seguinte a partir do anterior:
for i=2:16000
    anterior = r(i-1);
    r(i) = mod ( anterior + anterior*anterior , 1.0 );
endfor

# Toca a 16kHz:
sound(r, 16000);
# (Experimente também outras
# taxas de amostragem, como:
# 8000, 44100 e 48000.)

# Plota 2500 amostras:
plot(r(1:2500),'*-');

Interessantes efeitos podem ser conseguidos gerando-se o ruído acima a uma taxa de amostragem baixa e interpolando-se os valores obtidos. Ele pode ser utilizado então, por exemplo, como uma envoltória de freqüência.

Espectro

Além da representação de um som digital no domínio do tempo, há outra forma de representação muito útil: no domínio das freqüências. É o chamado espectro.

A figura abaixo mostra duas representações de um mesmo sinal composto por freqüências de 2, 6 e 20 Hz, sendo que o componente de 20 Hz tem metade da amplitude dos outros. Essas informações são facilmente visualizadas no espectro (parte superior da figura). A onda complexa é mostrada no domínio do tempo, na parte inferior da figura.

Análise de Fourier

Jean-Baptiste Joseph Fourier demonstrou que qualquer função periódica pode ser representada como um somatório de ondas senoidais harmônicas, com amplitudes e fases particulares.

Através da transformada de Fourier, pode-se analisar um sinal (no domínio do tempo) em seus componentes de freqüência. Cada componente é um vetor representado como um número complexo: o comprimento do vetor (distância em relação ao ponto (0,0), ou valor absoluto ou módulo) é a amplitude, e seu ângulo de inclinação em relação ao eixo horizontal é a fase.

Espectro de amplitude e espectro de potência

A amplitude de cada componente senoidal é o valor absoluto do número complexo, calculado através do Teorema de Pitágoras:

amp = sqrt(real(x)^2 + imag(x)^2)

Se a operação de raiz quadrada (sqrt) for omitida, obtemos a potência, que nada mais é do que o quadrado da amplitude:

pot = real(x)^2 + imag(x)^2

Espectrograma

Freqüentemente é útil visualizar a evolução do espectro ao longo do tempo, ou seja, ver como as freqüências e amplitudes variam no decorrer do tempo. A essa forma de visualização chamamos espectrograma.

O sinal é dividido em curtos trechos (“janelas”), cujas transformadas de Fourier são apresentadas lado a lado (seqüencialmente) num gráfico. O eixo horizontal é o tempo, o eixo vertical é a freqüência; as amplitudes são representada por cores ou tons de cinza.

Janelas de análise

A transformada de Fourier é definida somente para sons periódicos, o que não é o caso das porções arbitrárias de um som usadas para gerar um espectrograma. Presumindo-se que essa porção do sinal fosse um período completo de onda, a passagem do final de um ciclo para o início de outro provavelmente causaria uma descontinuidade inexistente no sinal. Em conseqüência, o resultado da análise de Fourier, embora exato, não corresponde ao que é intuitivamente “esperado” ou útil.

Para reduzir esse inconveniente, uma técnica comum é multiplicar o trecho do sinal por uma janela de análise apropriada, que cria uma espécie de “fade-in” e “fade-out” no trecho a ser analizado. O início e o final do pseudo-ciclo seriam próximos (ou iguais) a zero, evitando-se a descontinuidade que poderia ocorrer ao se repetir periodicamente essa porção do sinal (o final de um ciclo “emenda-se” melhor com o início de outro ciclo).

Para esse fim (janelamento), costumam ser usadas as janelas de Hamming e de Hann.

Software

Alguns programas que exibem espectros e/ou espectrogramas de sons são: Audacity, Praat, jaaa, snd e Sonic Visualizer.

Crie um website ou blog gratuito no WordPress.com.