function signalwavetrans0
%Hauptprogramm zur Anwendung der schnellen Wavelet-Transformation und der inversen Wavelet-Transformation
clf reset
clc
clear all;
close all;
echo off

%input signal
input=2;

if input==1
  f=[1,1,2,3,2,0,-1,2,1,2,4,2,1,0,8,7]; 
elseif input==2
  x=0:0.2:63/5;
  f=(sin(x));
elseif input==3  
  x=0:0.05:127/5;
  f=(sin(x) +0.2*cos(8*x-0.2)+0.3*sin(4*x-0.3));
elseif input==4
  f=zeros(1,512);
  for j=1:512 f(1,j)=quadraspline((j-64)/128); end;
end; 



[N1,N2] = size(f) % N2 ist die LŠnge des Vektors
a=0:N2-1;
figure
set(gca,'FontSize',15);
plot(a,f);
title(sprintf('Originalsignal'), 'FontSize',12);


% Filterkoeffizienten

% Daubechies Wavelets
h=[(1+sqrt(3))/4/sqrt(2), (3+sqrt(3))/4/sqrt(2), (3-sqrt(3))/4/sqrt(2), (1-sqrt(3))/4/sqrt(2)]
k0=0; k00=0; %Index des Anfangskoeffizienten
g=[(1-sqrt(3))/4/sqrt(2), -(3-sqrt(3))/4/sqrt(2), (3+sqrt(3))/4/sqrt(2), -(1+sqrt(3))/4/sqrt(2)]
k1=-2; k11=-2; %Index des Anfangskoeffizienten
[M1,M2]= size(g);  % L2 LŠnge des Filters g
h1=h;
g1=g;


%Anzahl der Level fŸr die Wavelet-Transformation
J=3;


%===Algorithmen===% 


f1=zerlegung(f,h,k0,g,k1,J); 

%Darstellung der gefilterten Signale

a=2^J*f1(1,N2+1):2^J:2^J*f1(1,N2+2);
l=f1(1,N2+2)-f1(1,N2+1)+1;
b=f1(1,1:l);
figure
set(gca,'FontSize',15);
plot(a,b);
title(sprintf('Skalierungsanteil in V%d',-J), 'FontSize',12);

for j=1:J
  a=2^j*f1(j+1,N2+1):2^j:2^j*f1(j+1,N2+2); l=f1(j+1,N2+2)-f1(j+1,N2+1)+1;
  b=f1(j+1,1:l);
  figure
  set(gca,'FontSize',15);
  plot(a,b);
  title(sprintf('Waveletanteil in W%d',-j), 'FontSize',12);
end;  

f2=rekonstruktion(f1,h1,k00,g1,k11,J);      %inverse Wavelet-Transformation
[K1,K2]=size(f2);
a=f2(1,K2):K2+f2(1,K2)-2;
b=f2(1,1:K2-1);
figure
set(gca,'FontSize',15);
plot(a,b);
title('Rekonstruiertes Signal in V0','FontSize',12);
a=0:N2-1;
b=f2(1,-f2(1,K2)+1:-f2(1,K2)+N2);
figure
plot(a,b);
title('Rekonstruiertes Signal in V0','FontSize',12);

% quadratischer Spline
function myfun = quadraspline(x)
if (0<=x) & (x<1) myfun=x^2/2;
elseif (1<=x) & (x<2) myfun=(-2*x^2+6*x-3)/2;
elseif (2<=x) & (x<3) myfun=(3-x)^2/2;
else myfun=0;
end;
