% BLOCK: Basis Funktionen definieren und diskretisieren
T=2*pi ; N=6; % Input: Periodenlänge; Anzahl Punkte
w=2*pi/T;   % Ab hier automatisch: Grundfrequenz
jlis=[0:N-1] % indices j
tk= jlis*T/N    % positions, where Signal was read out
%tk =        0    1.0472    2.0944    3.1416    4.1888    5.2360
n=floor(N/2)
% Continuous funktion corresponding to Basis n+1 Cos-Lists and n (or n-1)
% Sin-Lists
[ floor(N/2) N-floor(N/2)-1 ] % Anzahl cos /sin-Funktionen
ff=@(t,N)[ cos((0:(floor(N/2)))'*t.*w) ; sin((1:(N-floor(N/2)-1))'*t.*w)]
bas=ff(tk,N)'
% ENDE BLOCK: Basis Funktionen definieren und diskretisieren
% In diesem Block wird T und N an die jeweilige Aufgabe angepasst und vor
% der Interpolation durchgeführt. 

% AUFG 1: Überprüfe, ob die Basisvektoren orthogonal sind
dot(bas(:,1),bas(:,2)) 
% 0 , d.h. Basisvektor 1 steht senkrecht auf Basisv. 2
dot(bas(:,1),bas(:,3))
% 0 , d.h. Basisvektor 1 steht senkrecht auf Basisv. 3
rref(bas)
% gibt keine Nullzeile, d.h. die Basisvektoren sind
% linear unabhängig

% alle Skalarprodukte 
bas'*bas
%     6.0000   -0.0000    0.0000         0    0.0000
%    -0.0000    3.0000   -0.0000   -0.0000    0.0000
%     0.0000   -0.0000    3.0000 
% Überprüfe, ob die Basisvektoren normiert sind
% auf der Diagonalen von bas'*bas stehen keine 1
% d.h. Basis ist nicht normiert
% Ausserhalb der Diagonalen stehen nur 0 
% d.h. Basis ist orthogonal 

% AUFG 2: Interpoliere die Funktion cos^2(t) (2Pi periodisch) mit einer Überlagerung von 
% 1, cos(t),cos(2t), cos(3t),sin(t),   sin(2t) 
% T=2*pi ; N=6
gg=@(t) (cos(t)).^2
ggv=gg(tk)' % Diskretisierung

ggf=rref([bas, ggv]) % Gleichungssystem lösen
ggf=ggf(:,end)       % Nur Koeffizienten behalten: Fourrier Spektrum
% Sagt: Welche Funktonen kommen mit welcher Amplitude vor 
% ggf'= 0.5000   -0.0000    0.5000         0   -0.0000    0.0000
% Also: 0.5*1+0*cos(t)+0.5*cos(2*t)+0

% gg plotten : fplot
fplot(gg,[0 , 2*pi])
hold on 
plot(tk,ggv,'*')
% Interplation dazuzeichnen: hold on / hold off
ggff=@(t) ggf(1)*1+ggf(2)*cos(t)+ggf(3)*cos(2*t)+ggf(4)*cos(3*t)+ggf(5)*sin(t)+ggf(6)*sin(2*t) 
fplot(ggff,[0 , 2*pi])
hold off

% AUFG 3: Interpoliere die Funktion sin^2(t) mit einer Überlagerung von 
% 1,cos(t),cos(2t), cos(3t),sin(t),sin(2t) 
% T=2*pi ; N=6
gg=@(t) (sin(t)).^2
ggv=gg(tk)' % Diskretisieren 

ggf=rref([bas, ggv]) % Gleichungssystem lösen
ggf=ggf(:,end)       % Nur Koeffizienten behalten: Fourrier Spektrum
% 0.5000   -0.0000   -0.5000         0    0.0000    0.0000
%     
% gg plotten : fplot
fplot(gg,[0 , 2*pi])
hold on 
% Interplation dazuzeichnen: hold on / hold off
ggff=@(t) ggf'*ff(t,N) % nur zur Unterscheidung rot/blau: +0.01
fplot(ggff,[0 , 2*pi])
hold off

% AUFG 4: Interpoliere die Funktion 1/pi*t -1 (2Pi periodisch) mit einer Überlagerung von 
% 1, cos(t),cos(2t),cos(3t),sin(t),sin(2t),sin(3t) 
% T=2*pi ; N=7
gg=@(t) t/pi-1
ggv=gg(tk)' % Diskretisieren 

ggf=rref([bas, ggv]) % Gleichungssystem lösen
ggf=ggf(:,end)       % Nur Koeffizienten behalten: Fourrier Spektrum
% -0.1429   -0.2857   -0.2857   -0.2857   -0.5933   -0.2278   -0.0652

% gg plotten : fplot
fplot(gg,[0 , 2*pi])
hold on 
plot(tk,ggv,'*') % Zeichne diskretisierte Funktion dazu
% Interplation dazuzeichnen: hold on / hold off
ggff=@(t) ggf'*ff(t,N) % nur zur Unterscheidung rot/blau: +0.01
fplot(ggff,[0 , 2*pi])
hold off
% Wir sehen, dass die Interpolation in den Punkten exakt ist.
% Um eine bessere Interpolation auf der ganzen Linie zu bekommen, müsste
% man mit mehr Punkten diskretisieren. 

% AUFG 5: Interpoliere die Funktion 1 (falls, x<pi/2 oder x>3pi/2), 0 sonst (2Pi periodisch) 
% mit einer Überlagerung von 1, cos(t),cos(2t),cos(3t),sin(t),sin(2t),sin(3t)
% T=2*pi ; N=7
gg=@(t) (t<pi/2)+(t>3*pi/2)
ggv=gg(tk)' % Diskretisieren 

ggf=rref([bas, ggv]) % Gleichungssystem lösen
ggf=ggf(:,end)       % Nur Koeffizienten behalten: Fourrier Spektrum
% 0.4286    0.6420    0.1586   -0.2291   -0.0000    0.0000    0.0000

% gg plotten : fplot
fplot(gg,[0 , 2*pi])
hold on 
plot(tk,ggv,'*') % Zeichne diskretisierte Funktion dazu
% Interplation dazuzeichnen: hold on / hold off
ggff=@(t) ggf'*ff(t,N) % nur zur Unterscheidung rot/blau: +0.01
fplot(ggff,[0 , 2*pi])
hold off
% Wir sehen, dass die Interpolation in den Punkten exakt ist.
% Um eine bessere Interpolation auf der ganzen Linie zu bekommen, müsste
% man mit mehr Punkten diskretisieren. 

% AUFG 6: Interpoliere die Funktion x-5 (10 periodisch) mit einer Überlagerung von 
% mit einer Überlagerung von 17 harmonischen Funktionen
% T=10 ; N=17
gg=@(x) x-5
ggv=gg(tk)' % Diskretisieren 

ggf=rref([bas, ggv]) % Gleichungssystem lösen
ggf=ggf(:,end)       % Nur Koeffizienten behalten: Fourrier Spektrum
%1:  -0.2941   
%cos:  -0.5882   -0.5882   -0.5882   -0.5882   -0.5882   -0.5882   -0.5882   -0.5882  
%sin:  -3.1468   -1.5184   -0.9500   -0.6453   -0.4442   -0.2929   -0.1674  -0.0545

% gg plotten : fplot
fplot(gg,[0 , 10])
hold on 
plot(tk,ggv,'*') % Zeichne diskretisierte Funktion dazu
% Interplation dazuzeichnen: hold on / hold off
ggff=@(t) ggf'*ff(t,N) % nur zur Unterscheidung rot/blau: +0.01
fplot(ggff,[0 , 10])
hold off
% Interpolation exakt in den diskreten Punkten 

% AUFG 7: Interpoliere die Funktion 1 (falls, x<3 oder x>9) 0 sonst (12 periodisch)
% mit einer Überlagerung von 51 harmonischen Funktionen
% T=12 ; N=51
gg=@(x) (x<3)+(x>9)
ggv=gg(tk)' % Diskretisieren 

ggf=rref([bas, ggv]) % Gleichungssystem lösen
ggf=ggf(:,end)       % Nur Koeffizienten behalten: Fourrier Spektrum
%1:    0.4902   
%cos:   0.6367    0.0196   -0.2125   -0.0198    0.1278    0.0199   -0.0917   -0.0202 
%cos: 0.0716    0.0206   -0.0590   -0.0210    0.0503    0.0216   -0.0440    -0.0223
%cos: 0.0392    0.0231   -0.0355   -0.0240    0.0325    0.0252   -0.0301   -0.0265 0.0282
% sin: 0 ... 0
% gg(x) ist eine gerade Funktion; wir sehen hier, dass eine gerade
% Funktioin nur cos-Funktionen enhält - d.h. eine Gerade Funktion lässt sich nur aus
% geraden Funktionen aufbauen

% gg plotten : fplot
fplot(gg,[0 , 10])
hold on 
plot(tk,ggv,'*') % Zeichne diskretisierte Funktion dazu
% Interplation dazuzeichnen: hold on / hold off
ggff=@(t) ggf'*ff(t,N) % nur zur Unterscheidung rot/blau: +0.01
fplot(ggff,[0 , 10])
hold off
% Gibbs’sches Phänomen: Bei Fourier-Transformation von Funktionen mit
% Sprungstellen treten Überschwingungen auf.