Assista ao vídeo e descubra mais sobre convolução discreta;
https://www.youtube.com/watch?v=Td58okYbhDk
Curiosidade:
https://www.youtube.com/watch?v=O1MkuE4nFro
Código utilizado:
Soma de Convolução (gráfica)
################################################################################
# Soma de convolução de dois sinais causais através do
# procedimento gráfico
# autor: Elias J.
# data: 01/04/2019
################################################################################
clc;
clear all;
close all;
fontsize = 20;
fontsize2 = 18;
# Definindo o numero de amostras e os sinais
# x[n] e g[n]
n = -10:1:10;
% Sinal x[n]
x = zeros(1,length(n));
x(12) = 1; % n = 1 -> x[n] = 1
x(13) = 2; % n = 2 -> x[n] = 2
x(14) = 3; % n = 3 -> x[n] = 3
x(15) = 2; % n = 4 -> x[n] = 2
x(16) = 1; % n = 5 -> x[n] = 1
%Sinal g[n]
g = zeros(1,length(n));
g(11) = 1;
g(12) = 1;
g(13) = 1;
g(14) = 1;
g(15) = 1;
g(16) = 1;
##
% Verificando os sinais
figure
subplot(3,1,1)
stem(n,x,'b')
set(gca, "linewidth", 1, "fontsize", fontsize2)
hold on
grid on
grid minor on
xlabel('n',"fontsize", fontsize)
ylabel('x[n]',"fontsize", fontsize)
subplot(3,1,2)
stem(n,g,'r')
set(gca, "linewidth", 1, "fontsize", fontsize2)
grid on
grid minor on
xlabel('n',"fontsize", fontsize)
ylabel('g[n]',"fontsize", fontsize)
####################################################################################
% Convolução
% 1º Passo -> Inverter g[m] para obter g[-m]
gmenos = zeros(1,length(g));
for i = 1:length(g)-1
gmenos(i) = g(length(g)-i+1)
endfor
subplot(3,1,3)
stem(n,gmenos,'g')
set(gca, "linewidth", 1, "fontsize", fontsize2)
grid on
grid minor on
xlabel('n',"fontsize", fontsize)
ylabel('g[-n]',"fontsize", fontsize)
% 2º Passo -> Deslocar h[-m] por n unidades
% 3º Passo -> Multiplicar x[m] por h[-m] e somar todos
% os produtos enquanto para cada descolamento de n
figure
y = [];
for n_desloc = -10:10
gdesloc = desloc(gmenos,-n_desloc); #invertido pois h foi invertido
yn = sum(x.*gdesloc)
y = [y, yn]
subplot(2,1,1)
stem(n,x,'b')
hold on
stem(n,gdesloc,'xr')
set(gca, "linewidth", 1, "fontsize", fontsize2)
title('Soma de convolução')
grid on
grid minor on
axis([-10 10 0 5])
xlabel('n',"fontsize", fontsize)
legend(['x[m]'; strcat('g[', num2str(n_desloc),' - m]')])
hold off
subplot(2,1,2)
stem(n(1:length(y)),y,'r')
set(gca, "linewidth", 1, "fontsize", fontsize2)
grid on
grid minor on
axis([-10 10 0 10])
xlabel('n',"fontsize", fontsize)
ylabel(strcat('y[', num2str(n_desloc), '] = \Sigma_m x[m]\cdot g[', num2str(n_desloc),' - m]'),"fontsize", 16)
pause(3)
n_desloc
endfor
% Outra maneira é utilizando a função do Octave.
% y = conv(x,h,"same");
Soma de Convolução (direta)
% Soma de Convolução
% Autor: Elias J
% Data: 03/09/2020
clear all;
close all;
% Definindo o número de amostras
N = 10;
n_time = -N:N;
% Convolucão = x[n]*h[n] onde h[n] é a resposta do
% sistema ao impulso
% Convolução = somatorio de m = -infinito a +infinito de
% x[m].h[n-m]
% Entrada x[n]:
% Exemplo: Degrau unitário x[n] = u[n]
x = [zeros(1,N), ones(1,N+1)];
% Resposta ao impulso h[n]:
% Iremos precisar para a convolução conhecer os termos dessa resposta
% Exemplo: h[m] = (gamma)^n * u[n]
gamma = 0.8;
% Desde -2*N até 2*N quando estamos desejando encontrar a resposta ao sistema
% de -N a N
% Porque -2N até 2N?
% n -> -N até N
% m -> -N até N
% NMin = -N + (-N) = -2N
% NMax = N + N = 2N
h = zeros(1,2*N);
for ni=0:2*N
hi = gamma^(ni);
h = [h, hi];
end
% Convolução
% Convolução = somatorio de m = -infinito a +infinito de
% x[m].h[n-m]
% m = -N ate N
% n = -N ate N
y =[]; % armazenará a resposta do sistema y[n] (condições iniciais nulas)
for n = -N:N % tempo em que se deseja avaliar o sistema
yn = 0; % valor de y[n] para um dado n
for m = -N:N % somatório
% Conversao do tempo discreto da convolução n-m para índice
idH = (n - m) + 2*N+1 % indice p/ acessar o termo h[n-m]
idX = m + N + 1; % indice para acessar o termo x[m]
yn += x(idX)*h(idH);
end
y = [y, yn]; % insere yn no vetor y
end
% Outra maneira é utilizando a função do Octave.
% y = conv(x,h,"same");
% Visualizando os resultados
figure
subplot(3,1,1)
stem(n_time,x)
title('Entrada x[n]')
subplot(3,1,2)
stem(n_time,h(-N+2*N+1:N+2*N+1),'r')
title('Resposta ao impulso h[n]')
subplot(3,1,3)
stem(n_time,y,'g')
title('Convolução')
desloc.m
% Função para deslocar no tempo discreto de ndesloc unidades um sinal qualquer
% obs.: preenche de zeros quando não tiver informação do sinal
% autor: Elias J.
% data: 25/03/2019
function signal_desloc = desloc(signal, ndesloc)
if ndesloc > 0
signal_desloc = [signal(ndesloc+1:length(signal)), zeros(1, ndesloc)];
else
signal_desloc = [zeros(1, -ndesloc) , signal(1:length(signal)+ndesloc)];
endif
endfunction
No Octave/Matlab para realizar a convolução discreta, também é possível por meio do comando conv(x,h), vejam mais detalhes aqui.