clear all;
close all;
clc;

% init
% Ordnung FIR-Filter
N=32; %L/2
h=fir1(N, 0.25);

H = fft(h, 96); % Blocklaenge + N

% Zeitvektor
t=0:1/(128-1):1;

% Eingangssignal
x=sin(2*pi*2*t);


% ---------- START WOLA ----------
% Blocklaenge
L = 64;

x0=x(1:L);
x1=x((L/2)+1:L+(L/2));
x2=x(L+1:2*L);

% Hann-Fenster
wHann=hann(L)';

% Fenster und mit Nullen auffuellen
x0Hann=x0.*wHann;
x0Hann=[x0Hann zeros(1,N)];

x1Hann=x1.*wHann;
x1Hann=[x1Hann zeros(1,N)];

x2Hann=x2.*wHann;
x2Hann=[x2Hann zeros(1,N)];


X0=fft(x0Hann);
X1=fft(x1Hann);
X2=fft(x2Hann);

% Filtern
Y0=X0.*H;
Y1=X1.*H;
Y2=X2.*H;

y0 = ifft(Y0);
y1 = ifft(Y1);
y2 = ifft(Y2);

% Overlap-Add
y(1:(L/2))=y0(1:(L/2));
y((L/2)+1:L)=y0((L/2)+1:L)+y1(1:(L/2));
y(L+1:L+N)=y0(L+1:length(y0))+y1((L/2)+1:(L/2)+N)+y2(1:N);
y(L+N+1:L+(2*N)) = y1((L/2)+N+1:length(y1))+y2(N+1:2*N);
y((2*N)+L+1:(2*L)+N)= y2((2*N)+1:length(y2));


% ---------- END WOLA ----------

% ---------- Vergleich mit Filterung als Gesamtsignal ----------

wHann2 = hann(length(x))';
xHann1 = x.*wHann2;

xHann=[xHann1 zeros(1,N)];

X = fft(xHann);

H2=fft(h,160);

Y2 = X.*H2;

y2=ifft(Y2);

% Alternative zu y2
y3=conv(xHann1,h);


% ---------- PLOT ----------
figure;
plot([0:length(y)-1],y,'b',[0:length(y2)-1],y2,'m', [0:length(y3)-1],y3,'ko');
grid on;

