O que é convolução? Aos que um dia estudaram análise funcional em matemática ou processamento de sinais e/ou processamento de imagens, estes um dia se perguntaram: "O que é convolução?" e hoje vamos, no retorno do Carnaval, tentar mostrar uma luz.
Vamos primeiro tomar uma função f(t) qualquer, f(t) pode ser um sinal de voz por exemplo.
Agora nós queremos analisar a semelhança entre f(t) e uma outra função h(t), em que h(t) é uma função conhecida. A medida de semelhança entre f(t) e h(t) deve ser definida para todo t, pois nós não sabemos em que ponto de f(t) passa a ser mais semelhante a h(t).
Agora que nós sabemos o que é preciso fazer, vamos ver como fazer.
Se nós temos uma função f(t), a função que mais se aproxima de f(t) é a própria f(t) (óbvio), então se nós passarmos a função f(t) sobre ela mesma e para cada defasagem (t - s) nós calcularmos a semelhança, teremos um máximo quando a defasagem for nula (s = 0).
Porém, se tomarmos a função f(t - a) (f(t) defasado, em atraso, de a), então ao passar f(t - a) sobre f(t), teremos a máxima semelhança quando a defasagem for tal que anule o atraso a (s = -a).
Agora, se a função for outra (h(t), previamente conhecida) nós não temos informação de como nem em que ponto a semelhança entre f(t) e h(t) ocorre.
Então precisamos fazer essa medição, e eu digo que essa medição de semelhança entre duas funções para cada instante t é a convolução entre f(t) e h(t).
Por fim, por que fazer a análise de semelhança entre duas funções?
Porque nós podemos precisar encontrar padrões, já conhecidos, em funções que possuímos. Voltando ao sinal de voz, nós podemos tentar localizar fonemas (padrões conhecidos) ao longo do sinal capturado.
--------------------
A função do Scilab que implementa a convolução é convol().
Este blog tem por finalidade apresentar meus trabalhos e alguns aspectos de minha vida pessoal. Eu (editor do blog) sou engenheiro e mestre em engenharia de teleinformática, sou usuário e entusiasta de software livre, sou católico praticante e espero que o meu blog possa te ajudar.
Mostrando postagens com marcador progressões. Mostrar todas as postagens
Mostrando postagens com marcador progressões. Mostrar todas as postagens
quinta-feira, 26 de fevereiro de 2009
segunda-feira, 2 de fevereiro de 2009
Tutorial Scilab - 2 [Vetores e Matrizes - 1]
[English version here.]
Como faz tempo que fiz o primeiro post do tutorial do Scilab, acho que está na hora de continuar o serviço.
Como já foi dito, o Scilab é muito semelhante ao Matlab (que eu não gosto, nem uso e muito menos recomendo). E Matlab é uma sigla para "Laboratório de Matrizes", ou seja, é um software voltado para a manipulação matricial de dados.
Se nós temos a equação y = A x, em que:
x = [1 2 3 4]' (x é um vetor coluna)
e
A = [1 2 3 4;
1 2 3 4;
1 2 3 4;
1 2 3 4].
Em que A é uma matriz quadrada.
Obtem-se que:
y = [x[1]A[1,1]+x[2]A[2,1]+x[3]A[3,1]+x[4]A[4,1] x[1]A[1,2]+x[2]A[2,2]+x[3]A[3,2]+x[4]A[4,2] x[1]A[1,3]+x[2]A[2,3]+x[3]A[3,3]+x[4]A[4,3] x[1]A[1,4]+x[2]A[2,4]+x[3]A[3,4]+x[4]A[4,4]]' = [1²+2²+3²+4² 1²+2²+3²+4² 1²+2²+3²+4² 1²+2²+3²+4²]' = [30 30 30 30]'.
Para fazer operações assim em linguagens de programação convencionais (C/C++, Java, Python, Pascal, Perl, etc...) seria necessário declarar as variáveis como vetores ou matrizes (com ponteiros, a depender da situação) e fazer laços de repetição.
Mas, como o Scilab é um software criado para manipular matrizes, deve ser fácil resolver este tipo de problema.
Realmente é fácil, basta fazer o seguinte:
-->x = [1 2 3 4]'; // a apostrofe { ' } indica a transposição, então x é um vetor coluna, pois [1 2 3 4] é um vetor linha e x é [1 2 3 4] transposto.
-->A = [1 2 3 4;
-->1 2 3 4;
-->1 2 3 4;
-->1 2 3 4];
-->y = A*x
y =
30.
30.
30.
30.
Observem a coerência com o que foi explicado, pois obtemos o vetor coluna y = [30 30 30 30]'.
Para os que estudam álgebra linear, esperem que o Scilab vai resolver muitos problemas para vocês.
Como faz tempo que fiz o primeiro post do tutorial do Scilab, acho que está na hora de continuar o serviço.
Como já foi dito, o Scilab é muito semelhante ao Matlab (que eu não gosto, nem uso e muito menos recomendo). E Matlab é uma sigla para "Laboratório de Matrizes", ou seja, é um software voltado para a manipulação matricial de dados.
Se nós temos a equação y = A x, em que:
x = [1 2 3 4]' (x é um vetor coluna)
e
A = [1 2 3 4;
1 2 3 4;
1 2 3 4;
1 2 3 4].
Em que A é uma matriz quadrada.
Obtem-se que:
y = [x[1]A[1,1]+x[2]A[2,1]+x[3]A[3,1]+x[4]A[4,1] x[1]A[1,2]+x[2]A[2,2]+x[3]A[3,2]+x[4]A[4,2] x[1]A[1,3]+x[2]A[2,3]+x[3]A[3,3]+x[4]A[4,3] x[1]A[1,4]+x[2]A[2,4]+x[3]A[3,4]+x[4]A[4,4]]' = [1²+2²+3²+4² 1²+2²+3²+4² 1²+2²+3²+4² 1²+2²+3²+4²]' = [30 30 30 30]'.
Para fazer operações assim em linguagens de programação convencionais (C/C++, Java, Python, Pascal, Perl, etc...) seria necessário declarar as variáveis como vetores ou matrizes (com ponteiros, a depender da situação) e fazer laços de repetição.
Mas, como o Scilab é um software criado para manipular matrizes, deve ser fácil resolver este tipo de problema.
Realmente é fácil, basta fazer o seguinte:
-->x = [1 2 3 4]'; // a apostrofe { ' } indica a transposição, então x é um vetor coluna, pois [1 2 3 4] é um vetor linha e x é [1 2 3 4] transposto.
-->A = [1 2 3 4;
-->1 2 3 4;
-->1 2 3 4;
-->1 2 3 4];
-->y = A*x
y =
30.
30.
30.
30.
Observem a coerência com o que foi explicado, pois obtemos o vetor coluna y = [30 30 30 30]'.
Para os que estudam álgebra linear, esperem que o Scilab vai resolver muitos problemas para vocês.
terça-feira, 27 de janeiro de 2009
Aprendizagem neural
Vou fazer uma conversa (monólogo*) sobre computação neural.
Os algoritmos de computação neural são baseados em observações da natureza, em especial do sistema nervoso dos animais.
A base da computação neural é a aprendizagem a partir de exemplos, como eu já comentei aqui.
Os algoritmos têm a capacidade de assimilar a informação pela própria informação, como nós mesmo fazemos.
Os computadores tradicionais armazenam a informação em endereços de memória, e quando precisamos daquela informação nós fornecemos o endereço em que ela se encontra. Em sistemas neurais, quando nós precisamos de uma informação nós temos que fornecer ao sistema a informação associada.
Vamos fazer um paralelo com nosso cérebro. Você não pode numerar todos os seus neurônios e sair analisando a informação presente em cada um, porém você pode acessar a informação armazenada a partir de uma outra informação associada, por exemplo: cachorro. Você visualizou um cachorro em sua cabeça, conforme os padrões que você conhece de um cachorro.
Vamos dar outro exemplo:

Ao ver a imagem acima, você lembra das palavras jardim, plantas e flores e das emoções, normalmente, associadas: paz, tranquilidade, calma, etc....
Lembremo-nos que se Deus criou a natureza perfeita, nós podemos buscar inspiração nela para criar nossas coisas, consientes que nunca chegaremos a tamanha perfeição.
______________________
* Se vocês interagirem vira um diálogo.
Os algoritmos de computação neural são baseados em observações da natureza, em especial do sistema nervoso dos animais.
A base da computação neural é a aprendizagem a partir de exemplos, como eu já comentei aqui.
Os algoritmos têm a capacidade de assimilar a informação pela própria informação, como nós mesmo fazemos.
Os computadores tradicionais armazenam a informação em endereços de memória, e quando precisamos daquela informação nós fornecemos o endereço em que ela se encontra. Em sistemas neurais, quando nós precisamos de uma informação nós temos que fornecer ao sistema a informação associada.
Vamos fazer um paralelo com nosso cérebro. Você não pode numerar todos os seus neurônios e sair analisando a informação presente em cada um, porém você pode acessar a informação armazenada a partir de uma outra informação associada, por exemplo: cachorro. Você visualizou um cachorro em sua cabeça, conforme os padrões que você conhece de um cachorro.
Vamos dar outro exemplo:

Ao ver a imagem acima, você lembra das palavras jardim, plantas e flores e das emoções, normalmente, associadas: paz, tranquilidade, calma, etc....
Lembremo-nos que se Deus criou a natureza perfeita, nós podemos buscar inspiração nela para criar nossas coisas, consientes que nunca chegaremos a tamanha perfeição.
______________________
* Se vocês interagirem vira um diálogo.
quinta-feira, 26 de junho de 2008
Scilab + WiiMote
Hoje vi este vídeo e achei bem interessante.
Neste caso, o wiimote lê e envia o sinal do carro para o Scilab (no notebook), acredito que o uso do wiimote foi um exagero por parte do idealizador, mas ficou bem interessante.
Neste caso, o wiimote lê e envia o sinal do carro para o Scilab (no notebook), acredito que o uso do wiimote foi um exagero por parte do idealizador, mas ficou bem interessante.
Marcadores:
computação,
engenharia,
processamento de sinais,
programação gráfica,
progressões,
rastreamento,
Scilab,
software livre,
usb,
youtube
sexta-feira, 20 de junho de 2008
Rotação de quadrado no scilab
Um(a) leitor(a) do blog está com uma dúvida: como plotar quadrados em ângulos diferentes ao mesmo tempo no scilab, sendo cada quadrado de uma cor.
Primeiro passo: montar o quadrado original.
O quadrado será montado pelos seus vértices e o primeiro vértice deve estar na 1a e última posição para "fechar o quadrado".
x = [0 1 1 0 0];
y = [0 0 1 1 0];
Segundo passo: determinar quantos quadrados irão aparecer.
Lembrando que cada quadrado deve ser de uma cor, então deve-se conhecer tantas cores quanto seja a quantidade de quadrados.
N = 7;
cores = ["r" "g" "b" "c" "m" "y" "k"]; // cores r-vermelho, g-verde, b-azul, c-ciano, m-magenta, y-amarelo, k-preto
w = 2*%pi/N; // intervalo angular entre os quadrados 360º/7
Terceiro passo: definir a rotação do quadrado.
Quem estudou tranformações lineares, deve lembrar que a rotação de um ponto em torno da origem é obtida pela seguinte equação:

Quarto passo: gerar os gráficos.
Fazendo o código final (completo)
x = [0 1 1 0 0];
y = [0 0 1 1 0];
N = 7;
cores = ["r" "g" "b" "c" "m" "y" "k"];
w = 2*%pi/N;
for t = 1:N,
px = cos(w*t)*x + sin(w*t)*y;
py = sin(w*t)*x - cos(w*t)*y;
plot(px,py,cores(t));
end;
Resultado da simulação:

Espero ter ajudado.
Primeiro passo: montar o quadrado original.
O quadrado será montado pelos seus vértices e o primeiro vértice deve estar na 1a e última posição para "fechar o quadrado".
x = [0 1 1 0 0];
y = [0 0 1 1 0];
Segundo passo: determinar quantos quadrados irão aparecer.
Lembrando que cada quadrado deve ser de uma cor, então deve-se conhecer tantas cores quanto seja a quantidade de quadrados.
N = 7;
cores = ["r" "g" "b" "c" "m" "y" "k"]; // cores r-vermelho, g-verde, b-azul, c-ciano, m-magenta, y-amarelo, k-preto
w = 2*%pi/N; // intervalo angular entre os quadrados 360º/7
Terceiro passo: definir a rotação do quadrado.
Quem estudou tranformações lineares, deve lembrar que a rotação de um ponto em torno da origem é obtida pela seguinte equação:

Quarto passo: gerar os gráficos.
Fazendo o código final (completo)
x = [0 1 1 0 0];
y = [0 0 1 1 0];
N = 7;
cores = ["r" "g" "b" "c" "m" "y" "k"];
w = 2*%pi/N;
for t = 1:N,
px = cos(w*t)*x + sin(w*t)*y;
py = sin(w*t)*x - cos(w*t)*y;
plot(px,py,cores(t));
end;
Resultado da simulação:

Espero ter ajudado.
quarta-feira, 2 de abril de 2008
Somatório de séries infinitas
Em 2003 (quando eu estava estudando para o vestibular), eu aprendi um monte de coisas interessantes. Na semana passada teve prova de processos estocásticos (probabilidade e estatística temporais) e durante os estudos, resolvendo listas de exercícios, lembrei-me de algo que pode ajudar muita gente.
A técnica serve para resolver somas de séries infinitas.
A idéia é a seguinte:

depois manipula-se a série.
Normalmente, isolando-se o 1o termo e pondo algum fator em evidência nos termos restantes. De modo que obtém-se novamente a série inicial.
Então, obtém-se a seguinte equação:
Como exemplo (o mais óbvio que existe), usaremos uma série geométrica:

Reforço que esta técnica pode ser usada em diversas situações, basta ter um pouco de "malícia matemática".
A técnica serve para resolver somas de séries infinitas.
A idéia é a seguinte:

depois manipula-se a série.
Normalmente, isolando-se o 1o termo e pondo algum fator em evidência nos termos restantes. De modo que obtém-se novamente a série inicial.
Então, obtém-se a seguinte equação:
Como exemplo (o mais óbvio que existe), usaremos uma série geométrica:

Reforço que esta técnica pode ser usada em diversas situações, basta ter um pouco de "malícia matemática".
Assinar:
Postagens (Atom)