%   Input:  - Matrix mit Stützstellen der Grenzen ([-90 -40; -60 -17;0 -17; 20 0; 23 0;90 -40])
%           - Vektor mit x-Werten ([-90:1:90])
%           - Vektor mit Start-Werte (Spannungen)
%   Output: - Vektor mit Amplituden
%           - Vektor mit Phasen


function [amplitude, phase] = signal_modelling(sample, x)%, start)

    % Angegebene Stützstellen auf die x-Werte interpolieren
    tmp=interp1(sample(:,1),sample(:,2),x);

    % Interpoliertes Signal mit einem Polynom definieren
    poly=polyfit(x,tmp, 15);
    func=polyval(poly,x);
    func=10.^(func./20);

    plot(x,20*log10(abs(func)))
    hold on
    plot(x, tmp, 'r')


    % Daten mit Signalen laden
    Path = uigetdir('Daten laden');


    if Path == 0
        return;
    else

        signals=0;
%        fc='';

        files=dir(Path);
        count=0;
        s_index=0;

        c_index=0;

        % Alle Daten csv-Daten suchen
        for i=3:size(files,1)
            if strcmp(files(i).name(end-2:end),'csv')
                if c_index == 0
                    c_index=i;
                end
                count=count+1;
    %            elseif files(i).name(end-2:end) == 'tab'
    %                s_index=i;
            end
        end


        % Alle csv-Dateien laden und in Werte in Polynome fitten
        poly_grad=15;
        for i=1:count
            temp = load([Path '\' files(i+2).name]);

            if i == 1
                signals = zeros(size(temp,1),count);
                signals(:,1)=temp(:,1);
                signals(:,i+1)=10.^(temp(:,2)./20).*exp(j.*temp(:,3)./180.*pi);
                poly2=polyfit(temp(:,1),signals(:,i+1), poly_grad);

                order=size(poly2,2);

                % Funktion der Polynome erstellen mit Koeffizienten 'a'
                fc=['a(' num2str(i) ')*('];
                for y=1:size(poly2,2)
                    fc=[fc '+(' num2str(real(poly2(y))) '+j*' num2str(imag(poly2(y))) ')*x.^' num2str(order-y) ];
                end
                fc=[fc ')'];
            else
                signals(:,i+1)=temp(:,1);
                signals(:,i+1)=10.^(temp(:,2)./20).*exp(j.*temp(:,3)./180.*pi);
                poly2=polyfit(temp(:,1),signals(:,i+1), poly_grad);

                % Funktion der Polynome erstellen mit Koeffizienten 'a'
                order=size(poly2,2);
                fc = [fc '+a(' num2str(i) ')*('];
                for y=1:size(poly2,2)
                    fc=[fc '+(' num2str(real(poly2(y))) '+j*' num2str(imag(poly2(y))) ')*x.^' num2str(order-y) ];
                end
                fc=[fc ')'];
            end
        end


        % "Such-Funktion" erstellen
        f=inline(fc, 'a', 'x');
        as=[1 1 1 1 1];

        % Für oben erstellte Funktion die passenden Koeffizienten suchen, die das Signal an Stützstellen fittet
        af=nlinfit(x, func,f,as);
        af=af./max(af);

        new_signal = zeros(size(signals ,1),2);
        new_signal(:,1) = signals(:,1);

        % Gesuchten Koeffizienten einsetzten und Polynom berechnen -> Plotten
        for i=2:size(signals,2)
            new_signal(:,2) = new_signal(:,2) + af(i-1)*signals(:,i);
        end

        plot(new_signal(:,1), 20*log10(abs(new_signal(:,2)./max(new_signal(:,2)))),'g')
        hold off;

        % Ausgabe von Amplituden und Phasen für die eingelesenen Daten/Funktionen
        amplitude=abs(af./max(af));
        phase=angle(af).*180./pi;
    end