Převod do Fourierovy řady

ClearAll["Global`*"];
$HistoryLength=2;
Off[NMaximize::"cvmit"]

Popis funkce f(t)

ClearAll[f];
perioda=2.;
zlom=0.5*perioda;
f[t_]:=Tanh[t]/;0≤t<zlom;
f[t_]:=-Sin[2.t]/;zlom≤t<perioda;
f[t_]:=f[t-perioda]/;t≥perioda;
f[t_]:=f[t+perioda]/;t<0;
rngMax=NMaximize[f[t],{t,0,perioda}][[1]];
rngMin=NMinimize[f[t],{t,0,perioda}][[1]];
rng=1.4*{rngMin,rngMax};

Takto vypadá funkce f(t):

pl1=Plot[f[t],{t,-perioda,perioda},PlotStyle->{Thick,Hue[0.63]},AxesLabel->{"t","f[t]"},PlotRange->{Automatic,rng}];
nb=500;
pl2=ListPlot[{#,f[#]}&/@((perioda/nb)*(Range[2nb]-nb)),PlotStyle->{Hue[0.63],PointSize[0.007]},AxesLabel->{"t","f[t]"},PlotRange->{Automatic,rng}]

Převod do Fourierovy řady

Budeme počítat koeficienty pro prvních 50 harmonických funkcí.

nHarm=50;
rn=Range[nHarm];

Zajímá-li vás, co obsahují seznamy (angl. Lists) siny a cosiny, stačí odstranit středník na konci řádku.

siny=Sin[((2Pi)/perioda)*t*#]&/@rn;
cosiny=Cos[((2Pi)/perioda)*t*#]&/@rn;

Spočítáme koeficienty an a bn a uložíme je do seznamů aenka a beenka.

a0=(1/perioda)*NIntegrate[f[t],{t,0,perioda}];
an:=(2/perioda)*NIntegrate[f[t]*cosiny[[#]],{t,0,perioda}]&;
aenka=an/@rn;
bn:=(2/perioda)*NIntegrate[f[t]*siny[[#]],{t,0,perioda}]&;
beenka=bn/@rn;

Složíme harmonické funkce, abychom vytvořili aproximaci f(t):

nahrada:=a0+Plus@@Take[aenka*cosiny+beenka*siny,#]&;

Zobrazení výsledku převodu f(t) do Fourierovy řady

pln:=Plot[{nahrada[#]},{t,-perioda,perioda},PlotStyle->{Thick,GrayLevel[0]},AxesLabel->{"t","f[t]"},PlotRange->{Automatic,rng}]&;

Modře je f(t), černě je její aproximace pomocí součtu n harmonických funkcí.

vys:=Show[pln[#],pl2]&;
Manipulate[vys[n],{n,1,nHarm,1}]

Na závěr zobrazme spektrum signálu (tj. amplitudy prvních n harmonických):

fazory=aenka+I*beenka;
amplitudy=Abs[fazory];
ListPlot[amplitudy,PlotRange->All,PlotStyle->Blue,Filling->Axis,FillingStyle->Blue]