Integrální transformace

MAPLE má zabudovaný výpočet pro Fourierovu (exponenciální, sinovu, cosinovu) transformaci, Laplaceovu, Hilbertovu, Hankelovu a Mellinovu. My se budeme zabývat pouze prvními dvěma, navíc pak numerickou FFT a jejich transformace inverzní.

> restart; # raději uklidíme

> with(inttrans); # nejdříve je nutné načíst příslušnou knihovnu

[addtable, fourier, fouriercos, fouriersin, hankel,...

> f:=Heaviside(t); # f je jednotkový skok

f := Heaviside(t)

> plot(f, t=-1..1);

[Maple Plot]

> convert(fourier(g(t),t,s),int); #takto lze zobrazit definice transformací
convert(invfourier(g(t),t,s),int);

int(g(t)*exp(-I*t*s),t = -infinity .. infinity)

1/2*int(g(t)*exp(I*t*s),t = -infinity .. infinity)/...

> fourier(f,t,omega);
simplify(invfourier(%,omega,t));

Pi*Dirac(omega)-I/omega

Heaviside(t)

> laplace(f,t,p); # to by nemělo činit potíže

1/p

> laplace(sin(x)*cos(x),x,p); # o něco složitější příklad
expand(simplify(invlaplace(%,p,x)));

1/(p^2+4)

sin(x)*cos(x)

> laplace(exp(-lambda*t)*sin(omega*t+phi),t,p); # a ještě jeden
combine(invlaplace(%,p,t));
Jak je zřejmé, slovníky Laplaceovy transformace se stávají přežitkem.

cos(phi)*omega/((p+lambda)^2+omega^2)+sin(phi)*(p+l...

1/2*(omega*exp(-lambda*t)*sin(phi+sqrt(omega^2)*t)-...

FFT je v mnoha odvětvích velmi používaný nástroj, proto ji budeme věnovat trochu více pozornosti.

> ### WARNING: persistent store makes one-argument readlib obsolete
readlib(FFT); # musíme načíst potřebnou knihovnu

proc (m, x, y) local n, l, le, le1, ur, ui, wr, wi,...

> x:=array([-1,-1,-1,-1,1,1,1,1]): # definice prnvího vstupního vektoru
y:=array([0,0,0,0,0,0,0,0]): # definice druhého (nulového) vstupního vektoru
FFT(3,x,y): # volání FFT - první parametr udává její délku, v našem případě 2^3=8
print(x); # výstup z FFT se zapíše do vstupních vektorů, v našem případě reálná složka výstupu do vektoru x, imaginární část do vektotu y

vector([0, -2.000000001, 0., -1.999999999, 0, -1.99...

> iFFT(3,x,y):
print(x); # kontrola zpětnou transformací

vector([-1.000000000, -.9999999990, -.9999999995, -...

Použitelnější bude další, již více reálný, příklad.

> N:=8:f:=2:
vzorky_re:=array([evalf(seq(sin(x*2*Pi*f/2^N),x=1..2^N))]):
vzorky_im:=array([seq(0,x=1..2^N)]):

> pl:=[seq([i*2*Pi*f/2^N,vzorky_re[i]],i=1..2^N)]:
plot(pl,style=POINT);

[Maple Plot]

> FFT(N,vzorky_re,vzorky_im):

> vystup:=[seq(vzorky_re[i]+I*vzorky_im[i],i=1..2^N)]:
vystup_abs:=map(2/2^N*abs, vystup): # je nutno násobit činitelem 2/2^N, abychom dostali správný výsledek (násobící koeficient závisí na dané implementaci FFT).

> pl:=[seq([i-1,vystup_abs[i]],i=1..2^N)]:
plot(pl);

[Maple Plot]

Tento příklad lze dále modifikovat (lze přidávat další harmonické, ...), což ponecháme na čtenáři.

Použití FFT (iFFT) při rekonstrukci zašuměného signálu - lze vynechat

Použití FFT souvisí také se zpracováním signálů, což vyžaduje mnoho dalších utilit. K tomu je více přizpůsoben systém Matlab, kde jsou mnohé utility již naprogramované. Pro ty, kteří si již zvykli na příkazy Matlabu a chtěli by je používat i v prostřědí MAPLE, existuje možnost použití některých z nich, viz matlab , fft a další. MAPLE si pro tyto příkazy "zavolá" Matlab a ten je provede a "vrátí výsledek MAPLE. Ja samozřejmé, že musíte mít Matlab nainstalovaný.