HudLac

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.

Blog no WordPress.com.