function varargout = Schwingungen(varargin)
% Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @Schwingungen_OpeningFcn, ...
                       'gui_OutputFcn',  @Schwingungen_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end

    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
% End initialization code - DO NOT EDIT


% --- Executes just before Schwingungen is made visible.
function Schwingungen_OpeningFcn(hObject, eventdata, handles, varargin)

    % Rechteck = 1 / Dreieck = 2
    handles.typ   = 1;
    handles.obert = 0;
    set( handles.edit1,      'String', handles.obert ); 
    set( handles.popupmenu1, 'Value',  handles.typ ); 

    
    % axes1 als aktuelle Axes zum Zeichnen machen
    set( gcf, 'CurrentAxes', handles.axes1 );
    plot( 0,0 )
    xlabel( 't/sec' )
    ylabel( 'y' )
    title( 'Signal' )
    
    set( gcf, 'CurrentAxes', handles.axes2 );
    plot( 0,0 )
    xlabel( 'f/Hz' )
    ylabel( 'Amplitude' )
    title( 'beteiligte Frquenzen' )    
    
    % Choose default command line output for Schwingungen
    handles.output = hObject;

    % Update handles structure
    guidata(hObject, handles);


% --- Outputs from this function are returned to the command line.
function varargout = Schwingungen_OutputFcn(hObject, eventdata, handles) 
    % Get default command line output from handles structure
    varargout{1} = handles.output;



function edit1_Callback(hObject, eventdata, handles)
   str = get( hObject, 'String' ); 
   val = str2double( str );
   % Zahl der Obertöne nicht kleiner als 0
   if( isnan(val)  ||  val < 0 ) 
      warndlg( 'Zahl der Obertöne nicht korrekt' ); 
   else
      handles.obert = val;
      guidata(hObject, handles);
      zeichne( handles );
   end


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end


% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
  val = get(hObject,'Value');
  handles.typ = val;
  guidata(hObject, handles);
  zeichne( handles );

  
% --- Executes during object creation, after setting all properties.
function popupmenu1_CreateFcn(hObject, eventdata, handles)
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end


function zeichne( handles )
    
    % Zeitintervall von 0 bis 1/20 s
    % Array mit Stützpunkten im Abstand 1/40000 s
    SR = 40000;
    t = 0 : 1/SR : 1/20; 
    f   = 440;      % Grund-Frequenz 440 Hz
    A   = 1;        % 1 als Maximalwert
    
    % Zahl der Frequenzen = Grundton + Obertöne
    max = handles.obert + 1;
    
    % Array y mit Funktionswerten an den Stützpunkten 
    y = 0;
    if( handles.typ == 1 )   % Rechteck
        for( n = 1:2:max )
           y = y + A * 1/n * sin(2*pi*n*f*t);    
        end
    else                     % Dreieck
        for( n = 1:max )
           y = y + A * 1/n * sin(2*pi*n*f*t);    
        end
    end

    % axes1 als aktuelle Axes zum Zeichnen machen
    set( gcf, 'CurrentAxes', handles.axes1 );
    % Schwingung in axis1 zeichnen
    plot( t, y );
    xlabel( 't/sec' )
    ylabel( 'y' )
    title( 'Signal' )
    
    % Frequenzen über FFT berechnen
    c = fft( y );
    
    % Betrag der Amplituden  
    A = abs( c ) * 2/(SR*1/20);
    % Array der Frequenzen, normiert auf 40000 Hz
    f = (0:length(c)-1).*SR/length(c);
            
    % axes2 als aktuelle Axes zum Zeichnen machen
    set( gcf, 'CurrentAxes', handles.axes2 );
        
    % Ausgabe der Amplituden zu den Frequenzen als 2D-plot
    plot(f,A) 
    xlabel( 'f/Hz' )
    ylabel( 'Amplitude' )
    title( 'beteiligte Frquenzen' )
    
    % Frequenzen bis max. 4000 Hz
    axis( [0 4000 -0.1 1.1 ] )
