function [ env_log ] = envelope_ceps( signal_fft, threshold )
%ENVELOPE Summary of this function goes here
% cepstral smoothed
% inout: FFT of signal, threshold for windowing
% Algorithmus aus Magisterarbeit Robin Schmidt
% www.rs-met.com/documents/dsp/Magisterarbeit.pdf
N = 1024;
signal_abs = abs(signal_fft);
signal_norm = [signal_abs(1)/N; signal_abs(2:N/2)/(N/2); signal_abs(N/2+1)/N];
signal_db = 20*log10(signal_norm);
delta = 2;
A = signal_db;
l = length(A);
V = -inf*ones(1,l);
C = zeros(l,1);
W(1:threshold) = 1;
W(threshold+1:l-threshold-1) = 0;
W(l-threshold:l) = 1;
c = 0.8;
conv = 0;

while conv < 1
    for i=1:l
        A(i) = max(A(i),V(i));
    end
    C2 = ifft(A,N/2+1);
    %size(C)
    %size(C2)

    D = C2 - C;
    E_ges = sum(abs(D).^2);
    E_in = sum(W.^2*abs(D).^2);
    lambda = (E_ges/E_in)^c;
    
    for i=1:l
        C(i) = C(i) + lambda*(W(i)*D(i));
    end
       
    V = real(fft(C,N/2+1));
    if max(signal_db-V) <= delta
        conv = 1;
    end
end
% Algorithmus Ende

result = 10.^(V/20);
env_amp = abs(result);
env_log = 20*log10(env_amp(1:N/2+1))';

end
