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