1. Revisão da teoria:
- A convolução é uma operação matemática que toma dois sinais para gerar um terceiro sinal.
- É uma operação bastante importante em DSP, pois relaciona 3 sinais de interesse operação de um sistema linear: a entrada, a saída e a resposta a impulso.
- Existem duas formas de se ver a convolução: o algoritmo do lado da entrada e o algoritmo do lado da saída.
- O algoritmo do lado da entrada utiliza o teorema da superposição: o sinal de entrada é decomposto em vários sinais, que são aplicados individualmente no sistema. A saída é então calculada como sendo a soma de cada um destes sinais. Esta é uma abordagem bastante importante para entender a convolução e o teorema da superposição para sistemas lineares.
- O algoritmo do lado da saída é a forma como a operação de convolução é implementada em sistemas reais.
- Se o sinal de entrada tem N amostras e a resposta a impulso tem M amostras, então o sinal de saída terá (N+M-1) amostras.
- Se a resposta a impulso de um sistema linear tem M amostras, então as (M-1) amostras iniciais e as (M-1) amostras finais do sinal de saída não representam exatamente o sinal filtrado, pois nestas regiões a resposta a impulso não está totalmente imersa no sinal (lembre-se da figura do carrinho).
2. Experiências
1. Primeiramente vamos ver se realmente a convolução de um sinal de N pontos com outro de M pontos gera um sinal de N+M-1 pontos.
% Gerando um sinal de 3 pontos x = [1 2 3] % Gerando um sinal de 4 pontos h = [3 1 2 4] % Convoluindo os dois sinais z = conv(x,h) |
2. Agora vamos verificar o algoritmo do lado da entrada. Na verdade, esta é uma aplicação direta do teorema da superposição de sistemas lineares, que você viu na prática passada.
a) Decomponha o sinal x do exercício anterior em três sinais, cada um com apenas um impulso:
x1 = [1 0 0] x2 = [0 2 0] x3 = [0 0 3] |
b) Faça a convolução de cada um destes sinais com o sinal h. Qual a semelhança entre y1, y2 e y3 com h?
y1 = conv(x1,h) y2 = conv(x2,h) y3 = conv(x3,h) |
c) Faça ytotal = y1+y2+y3 e compare com y.
3. Agora vamos ao algoritmo do lado da saída. A idéia aqui é simplesmente validar a idéia de que a relação entre entrada e saída de um sistema linear é dada pela convolução do sinal de entrada com a resposta a impulso do mesmo.
Inicialmente, vamos gerar a resposta a impulso h[n] do nosso filtro:
h = zeros(1,99); for i = 0:98 h(i+1) = 0.31752 * sin(0.314159 * (i-49.00001)) / (i-49.00001); h(i+1) = h(i+1) * (0.54 - 0.46 * cos(0.0641114 * i)); end |
Vamos ver mais adiante que este é o kernel de um filtro FIR passa-baixas.
O presente filtro foi projetado para deixar passas senóides que façam menos de 25 ciclos em 500 amostras e bloquear senóides com frequências mais altas. Os filtros FIR passa baixas têm como característica uma resposta a impulso que consiste de várias amostras positivas. Podem haver amostras negativas, mas a maioria é positiva. Plote esta resposta a impulso para ver como ela é.
plot(h); |
4. Se você fizer a convolução de h[n] com o sinal descrito abaixo, qual deveria ser a resposta? Porque? Teste para ver.
x[n] = 1 para n = 0
x[n] = 0 caso contrário
5. Gere um sinal de teste x[n] um pouco mais complicado, que consiste da soma de duas senóides.
A primeira deve ter amplitude 1 e fazer 6 ciclos completos em 500 amostras. (baixa frequência)
A segunda deve ter amplitude 0.5 e fazer 44 ciclos completos em 500 amostras. (alta frequência)
Plote estes três sinais para ver como eles são
N=500; k = 6; for i=0:499 x1(i+1) = sin(2*pi*k*i/N); end k = 44; for i=0:499 x2(i+1) = 0.5*sin(2*pi*k*i/N); end x = x1+x2; plot(x1) figure plot(x2) figure plot(x) |
6. Vamos agora filtrar o sinal criado no exercício anterior com o nosso filtro, e ver como ficou:
y = conv(x,h); plot(y); |
O filtro conseguiu bloquear o sinal de alta frequência enquanto manteve o sinal de baixa frequência intacto? Comente sobre sua eficácia.
7. Transforme o kernel do filtro para um filtro passa-altas alterando o sinal de todas as suas amostras e somando 1 à amostra central. Teste este filtro da mesma forma que fez no exercício 6. Comente os resultados.
hpa = -h; hpa(50) = hpa(50)+1; plot(hpa); |