Discrete Convolutie Algoritme Snelheid
Geplaatst: zo 21 jun 2020, 19:52
Geregeld maak ik gebruik van convolutie hiermee heb ik geregeld process simulaties gemaakt. Hat mooie is dat een variabele gesampelde input geconvuleerd kan worden met de impulse responce van een process. De verkregen output is dan als functie van de input, men is dan niet gelimiteerd tot alleen stap responces van de input bijvoorbeeld.
\((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:
Deze methode met twee for loops is erg traag. Ik ben nogal een intuitief met wiskunde en programmeren. Ik had een versnelde berekening convolutie gevonden met een for loop en gebruik makende van array berekeningen. Het resultaat naar enig trial en error is de code onderstaand. Ik neem steeds een range van de input arrays en reverse de volgorde van een van de arrays. Hierna vermenigvuldig ik de elementen van de arrays en bepaal de som. Dit is dan de output YY van element n YY(n).
Tot mijn verbazing is deze methode snel en vergelijkbaar als de ingebouwde convolutie algoritmes.
Zijn er nog snellere methodes om manueel de convolutie te berekenen? Is dit hoe een convolutie berekening werkt met ingebouwde algoritmes of maken deze gebruik van FFT? Graag een simpel antwoord, ik kan zelf genoeg informatie vinden op internet. Gewoon een vraag gericht aan wiskunde en programmeer ervaren mensen.
\((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)
{
.....
}
}