Convolução 1D
Algorítimo para convolução de sinais 1D (vetores) em C++ (mas pode ser adaptado para C sem problemas).
Eu tentei deixá-lo bem genérico, por isso talvez algumas passagens não fiquem claras, mas se tiverem qualquer dúvida não deixem de perguntar.
Se encontrarem algum furo, por favor avisem!
Eu tentei deixá-lo bem genérico, por isso talvez algumas passagens não fiquem claras, mas se tiverem qualquer dúvida não deixem de perguntar.
Se encontrarem algum furo, por favor avisem!
Descrição
Algorítimo para convolução de sinais 1D (vetores) em C++ (mas pode ser adaptado para C sem problemas).
Eu tentei deixá-lo bem genérico, por isso talvez algumas passagens não fiquem claras, mas se tiverem qualquer dúvida não deixem de perguntar.
Se encontrarem algum furo, por favor avisem!
Eu tentei deixá-lo bem genérico, por isso talvez algumas passagens não fiquem claras, mas se tiverem qualquer dúvida não deixem de perguntar.
Se encontrarem algum furo, por favor avisem!
#include <iostream>
int *conv(int n,int m,int vet_maior,int vet_menor) // vetor a,vetor b,num de elementos dos dois m>n
{
int vet_a[n],vet_b[m],*vet_conv[n+m-1],aux[m+2*(n-1)];
for (int i=0;i<n+m-1;i++)
{
if (i<n) vet_a[i]=vet_menor[i];
if (i<m) vet_b[i]=vet_maior[i];
vet_conv[i]=0;
}
unsigned int x=0; //aux contadora
for (int i=0;i<m+2*(n-1);i++)
{
if (i<n-1) aux[i]=0; //parte nula
else
{
if (i<n+m-1)
{
aux[i]=vet_b[x]; //parte = vet_maior
x++;
}
else aux[i]=0; //parte nula
}
}
// convolucao
for (int j=0;j<n+m-1;j++)
{
for (int k=0;k<n;k++)
{
vet_conv[j]+=vet_a[n-1-k]*aux[j+k];
}
}
// Imprime resultados (caso precise testar)
std::cout << "Vetor A:" << std::endl;
for (int i=0;i<n;i++){ std::cout << vet_a[i] << " "; }
std::cout << std::endl;
std::cout << "Vetor B:" << std::endl;
for (int i=0;i<m;i++){ std::cout << vet_b[i] << " "; }
std::cout << std::endl;
std::cout << "Convolucao:" << std::endl;
for (int i=0;i<n+m-1;i++){ std::cout << vet_conv[i] << " "; }
return (vet_conv);
}
http://www.vivaolinux.com.br/artigo/Coloque-ordem-em-seus-programas/