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
% 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)
 
% Passo -> Deslocar h[-m] por n unidades
% 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.