\((f * g)(t) \triangleq\ \int_{-\infty}^\infty f(\tau) g(t - \tau) \, d\tau\)
Discreet:
\((f * g)[n] = \sum_{m=-\infty}^\infty f[m] g[n - m]\)
(ik weet niet wat misgaat maar formules worden in voorbeeld goed weergegeven in draadje niet? Het zijn gewoon de bekende convolutie formules)
In verschillende programmeer talen heeft men ingebouwde snelle convolutie algoritmes. Voor een van mijn process simulaties integreerde ik een PID regelaar met varieerende input. Hierdoor kon ik niet de ingebouwde convolutie algoritmes gebruiken en moest het manueel uitrekenen met twee for loops, zoals:
Code: Selecteer alles
//Input range dd and ee and count items in arrays
int dd=count(wcol(2),1);
int ee=count(wcol(3),1);
//Loop all convolutions items
for (int hh = 1 ;hh <= (dd+ee-1); hh++)
{
//Set output element to zero
YY(hh)=0:
for (int ii = 1 ;ii <= dd; ii++)
{
if (hh-ii+1>0)
{
//Convolution element hh
YY[hh]=YY[hh]+dd[hh]*ee[hh-ii+1];
}
}
Tot mijn verbazing is deze methode snel en vergelijkbaar als de ingebouwde convolutie algoritmes.
Code: Selecteer alles
//Input range and set to blanco
range YY=Wcol(4);
yy="";
//Input range dd and ee and count items in arrays
int dd=count(wcol(2),1);
int ee=count(wcol(3),1);
//Loop all convolutions items
for (int hh = 1 ;hh <= (dd+ee-1); hh++)
{
if (dd>=ee)
{
if (hh<=dd)
{
//input range pp and reverse element order
dataset pp=Wcol(2)[1:hh];
pp.reverse();
//input range uu
dataset uu=Wcol(3)[1:hh];
//Multiply elements and determine sum.
yy[hh]=total(uu*pp);
}
else
{
dataset pp=WCol(2)[hh-dd+1:dd];
pp.reverse();
dataset uu=WCol(3)[hh-dd+1:dd];
yy[hh]=total(uu*pp);
}
}
if (dd>ee)
{
.....
}
}