function [mag, fv, t] = Spektrogramm( signal, windowsize, numoverlap, fs, logScale)
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fs = Abtastfreq.
% windowsize: Segmentlänge
% numoverlap = Overlap zwischen benachbarten Segmenten
% Output:
% Magnitude des Spektrums linear und dB skaliert
% Frequenzvektor fv in [Hz] von 0...fa/2
% Zeitvektor t in [s]

    % Ist Signallänge gerade?
    N = length(signal);
    if mod(N,2)
        n = N-1;
    else
        n = N;
    end;

    % FFT Segmentlänge und Fensterlänge
    % kleine Sgementlänge nfft -> feinere Frequenz- aber schlechte
    % Zeitauflösung
    nfft = windowsize;
    % Hann Fenster erstellen
    win = Fenster(nfft,'hanning'); 

    k = fix((n-numoverlap)/(length(win)-numoverlap)) ;
    % preallocation
    H = zeros(nfft,1);
    mag = zeros((nfft/2)+1,k);

    % Spektrogramm berechnen
    % k. Segmente der Länge nfft transformieren
    m = 1;
    for i=1:k
        % Fensterung mit Hann window
        signal_win = signal(m:nfft+m-1) .* win;
        H(1:nfft) = fft(signal_win, nfft);
        % Betrag bilden
        mag(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
        % nächstes Segement
        m = m + nfft - numoverlap;
    end 

    % Auflösung des Spektrum
    df = fs/nfft;
    % Frequenzvektor
    fv = 0:df:fs/2;
    % Zeitvektor
    t = [0:k-1]*numoverlap/fs; 
    
    if logScale == 1
        % Umrechnung in dB - Feldgröße
        mag = 10*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
    elseif logScale == 2   
        % Umrechnung in dB - Energiegröße
        mag = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
    end
end