Convolução

Convolução é uma operação matemática que faz a integral do produto de 2 funções (sinais), com um dos sinais invertido. Por exemplo, abaixo convolvemos 2 sinais f(t) e g(t).

Assim, a atividade principal é girar o sinal g em um plano de nível (180 graus), nesse ponto deslizar o g invertido sobre f, aumentando e agregando cada uma de suas qualidades.

O pedido de que você convolva o sinal não faz diferença para o produto final, então conv(a,b)==conv(b,a)

Neste caso pense que o sinal azul f(τ) é o nosso sinal de informação e g(t) o nosso bit, o termo parte é utilizado quando você usa convoluções para canalizar sinais.

Tamanho do sinal de saída 1D

No caso da convolução 1D, o tamanho da saída é calculado assim:

outputSize=(InputSize-KernelSize)+1

Aplicação de convoluções

As pessoas usam a convolução no processamento de sinais para os seguintes casos de uso:

Filtrar sinais (áudio 1D, processamento de imagem 2D)

Verifique o quanto um sinal está correlacionado com outro

Encontrar padrões em sinais

Exemplo simples em matlab e python(entorpecido)

A seguir convolvemos dois sinais x = (0,1,2,3,4) com w = (1,-1,2).

Fazendo à mão

Para ver melhor a ideia de convolução, devemos fazer o modelo acima à mão. Essencialmente vamos convolver 2 sinais (x,w). O principal é virar W em um plano de nível (ou virar à esquerda 180 graus).

Veja que nos estágios 3,4,5 a janela invertida está totalmente dentro do sinal de informação. Esses resultados são chamados de convoluções “substanciais”. As situações em que a janela invertida não está completamente dentro da janela de informação(X), podemos considerar zero, ou determinar o que é concebível de ser determinado, por exemplo, no estágio 1 duplicamos 1 por zero, e o resto é basicamente desconsiderado.

Forro de entrada

Para manter o tamanho do resultado da convolução semelhante ao da informação, e para evitar um impacto chamado convolução redonda, amortecemos o sinal com zeros.

Onde você coloca os zeros depende do que você precisa fazer, ou seja: no caso 1D você pode ligá-los em cada extremidade, no entanto, em 2D é normalmente colocado ao redor do primeiro sinal.

No matlab você pode usar o comando ‘padarray’ para preencher a entrada:

>> x

x(:,:,1) =

 1 1 0 2 0

 2 2 2 2      1

 0 0 0 2 1

 2 2 2 2      1

 2 0 2 2 1

x(:,:,2) =

 2 1 0 0 0

 0 2 0 1 0

 1 0 1 2 0

 1 2 0 2 1

 1 2 1 2 2

x(:,:,3) =

 2 1 1 2 2

 1 1 1 0 0

 2 0 1 0 2

 0 2 0 2 1

 0 0 2 1 0

>> padarray(x,[1 1])

ans(:,:,1) =

 0 0 0 0 0 0 0

 0 1 1 0 2 0 0

 0 2 2 2 2      1 0

 0 0 0 0 2 1 0

 0 2 2 2 2      1 0

 0 2 0 2 2 1 0

 0 0 0 0 0 0 0

ans(:,:,2) =

 0 0 0 0 0 0 0

 0 2 1 0 0 0 0    

 0 0 2 0 1 0 0

 0 1 0 1 2 0 0

 0 1 2 0 2 1 0

 0 1 2 1 2 2 0

 0 0 0 0 0 0 0

ans(:,:,3) =

 0 0 0 0 0 0 0

 0 2 1      1 2 2 0

 0 1 1      1 0 0 0

 0 2 0 1 0 2 0

 0 0 2 0 2 1 0

 0 0 0      2 1 0 0

 0 0 0 0 0 0 0

Transformando a convolução em gráfico de computação

Para verificar as subsidiárias incompletas de cada fonte de informação e parâmetros do hub, é mais simples mudar a atividade para um diagrama computacional. Aqui eu vou mudar a convolução 1D passada, mas isto também pode ser alcançado para a convolução 2D.

Aqui nosso gráfico será feito sobre as situações substanciais onde o kernel(pesos) invertido será completamente embutido em nossa janela de informações.

Aqui o nosso gráfico será criado nos casos válidos onde o kernel(pesos) invertido será totalmente inserido na nossa janela de entrada.

Vamos utilizar este gráfico mais adiante para deduzir os ângulos das fontes de informação (x) e cargas (w) da camada de convolução.