Processing math: 100%

terça-feira, 17 de fevereiro de 2015

Convolução discreta usando Scilab


Antes de começar uma advertência: esta é uma postagem "técnica", somente para pessoas com alguma formação matemática. Dito isso, vamos começar!

Suponha que um sistema discreto tenha uma resposta ao impulso dada por um certo h(n). Então, é fácil mostrar que a resposta desse sistema a uma entrada x(n) qualquer é dada por:
y(n) = h(n) * x(n) = x(n)*h(n) = \sum_{k=-\infty}^{k=+\infty} x(k)h(n-k)

Um exemplo: h(n) = a^n u(n), onde u(n) é a função degrau unitário, x(n) = b^n u(n), sendo |a| < 1, |b| < 1 e a \neq b, então a saída y(n) é dada por:
y(n) = \sum_{k=0}^{k=n} x(k)h(n-k)

y(n) = \sum_{k=0}^{k=n} b^k a^{n-k}

y(n) = a^n \sum_{k=0}^{k=n} (b/a)^{k}

y(n) = a^n \frac{1-(b/a)^{n+1}}{1-(b/a)}

y(n) = \frac{a^{n+1}-b^{n+1}}{a-b}


A convolução pode ser facilmente calculada usando-se o comando convol do Scilab:

convol - convolution

Calling Sequence

[y]=convol(h,x)
[y,e1]=convol(h,x,e0)

Arguments

h - a vector, first input sequence ("short" one)
x - a vector, second input sequence ( "long" one)
e0 - a vector,old tail to overlap add (not used in first call)
y - a vector, the convolution.
e1 - new tail to overlap add (not used in last call)

Description

Calculates the convolution y= h*x of two discrete sequences by using the fft. 

Obs: mais informação "teórica" sobre convolução aqui e aqui.

--------------------=================-------------------

Um código exemplo:

clc;
close;

k=0:30;
x1 = [ones(1,10), zeros(1,15)];
x2 = sin(%pi*k/6);
h1 = (0.8).^(k);

y1 = convol(h1,x1);
y2 = convol(h1,x2);

subplot(3,2,1); bar(x1,0.2); title('x1');
subplot(3,2,2); bar(x2,0.2); title('x2');
subplot(3,2,3); bar(y1,0.2); title('y1 = h1*x1');
subplot(3,2,4); bar(y2(1:31),0.2); title('y1 = h1*x2');
subplot(3,1,3); bar(h1,0.2); title('h1');

Saída gráfica:


Nenhum comentário:

Postar um comentário