No BSD License  

Highlights from
NESim

image thumbnail
from NESim by Chris Eliasmith
General package for large-scale biologically plausible simulations (with GUI).

gui_signal_generator(varargin)
function varargout = gui_signal_generator(varargin)
% GUI_SIGNAL_GENERATOR Application M-file for gui_signal_generator.fig
%    FIG = GUI_SIGNAL_GENERATOR launch gui_signal_generator GUI.
%    GUI_SIGNAL_GENERATOR('callback_name', ...) invoke the named callback.
%    This user interface is provided to edit and plot signal generators.
%    Typically it is launched by another program that has set the global
%    struct array "SignalGenerators" and the global variable 
%    "NumSignalGenerators".  The calling program must pass one argument
%    which is the length of the run time.  If this user interface is started 
%    without any arguments (launched by itself), it will allow the user to 
%    adjust and plot signals.
% Last Modified by GUIDE v2.5 02-Apr-2003 08:42:44

%% Modified on Jan. 21, 2004 by cha.
%% Changed external file inputs to read in all the components of a vector
%% Added square wave signals.

% Modified on Oct. 17, 2001 by cha to add titles and legends to the plot figure.
%
% Modified on 10/29/01 by John Harwell
%   
%    Removed unused, commented out code.
%
% Modified on 10/31/01 by John Harwell
%
%    renamed "new_genSignal" to "sim_genSignal"

global NumSignalGenerators SignalGenerators

if nargin <= 1
    if nargin == 0
        if exist('SignalGenerators') ~= 0
            NumSignalGenerators = 0;
        end
    end
	fig = openfig(mfilename,'reuse');


	% Generate a structure of handles to pass to callbacks, and store it. 
	handles = guihandles(fig);
    handles.fig = fig;
    handles.lengthOfRun = 1.0;
    handles.enableLengthOfRun = 1;
    if nargin == 0
        createSignalGenerators;
    else 
        handles.lengthOfRun = varargin{1};
        handles.enableLengthOfRun = 0;
    end
	guidata(fig, handles);
    set(fig, 'Name', 'NESIM: External Input');
    loadSignalNumMenu(handles);
    loadSignalGeneratorData(handles);
    setEnables(handles);
    
	if nargout > 0
		varargout{1} = fig;
	end
elseif ischar(varargin{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK

	try
		[varargout{1:nargout}] = feval(varargin{:}); % FEVAL switchyard
	catch
		disp(lasterr);
	end

end



%| ABOUT CALLBACKS:
%| GUIDE automatically appends subfunction prototypes to this file, and 
%| sets objects' callback properties to call them through the FEVAL 
%| switchyard above. This comment describes that mechanism.
%|
%| Each callback subfunction declaration has the following form:
%| <SUBFUNCTION_NAME>(H, EVENTDATA, HANDLES, VARARGIN)
%|
%| The subfunction name is composed using the object's Tag and the 
%| callback type separated by '_', e.g. 'slider2_Callback',
%| 'figure1_CloseRequestFcn', 'axis1_ButtondownFcn'.
%|
%| H is the callback object's handle (obtained using GCBO).
%|
%| EVENTDATA is empty, but reserved for future use.
%|
%| HANDLES is a structure containing handles of components in GUI using
%| tags as fieldnames, e.g. handles.figure1, handles.slider2. This
%| structure is created at GUI startup using GUIHANDLES and stored in
%| the figure's application data using GUIDATA. A copy of the structure
%| is passed to each callback.  You can store additional information in
%| this structure at GUI startup, and you can change the structure
%| during callbacks.  Call guidata(h, handles) after changing your
%| copy to replace the stored original so that subsequent callbacks see
%| the updates. Type "help guihandles" and "help guidata" for more
%| information.
%|
%| VARARGIN contains any extra arguments you have passed to the
%| callback. Specify the extra arguments by editing the callback
%| property in the inspector. By default, GUIDE sets the property to:
%| <MFILENAME>('<SUBFUNCTION_NAME>', gcbo, [], guidata(gcbo))
%| Add any extra arguments after the last argument, before the final
%| closing parenthesis.



% --------------------------------------------------------------------
function setEnables(handles);

% disable all text boxes
set(handles.frequencyText,     'Enable','off');
set(handles.frequencyLabel,    'Enable', 'off');
set(handles.frequencyHighText, 'Enable', 'off');
set(handles.phaseLabel,        'Enable', 'off');
set(handles.phaseText,         'Enable', 'off');
set(handles.amplitudeLabel,    'Enable', 'off');
set(handles.amplitudeText,     'Enable', 'off');
set(handles.dcOffsetLabel,     'Enable', 'off');
set(handles.dcOffsetText,      'Enable', 'off');
set(handles.timeLabel,         'Enable', 'off');
set(handles.timeOnText,        'Enable', 'off');
set(handles.timeOffText,       'Enable', 'off');
set(handles.filenameLabel,     'Enable', 'off');
set(handles.filenameText,      'Enable', 'off');
set(handles.componentPopupMenu, 'Enable','on');
switch get(handles.signalTypePopupMenu, 'Value');
case 1   % band limited noise
    set(handles.amplitudeLabel,    'Enable', 'on');
    set(handles.amplitudeText,     'Enable', 'on');
    set(handles.dcOffsetLabel,     'Enable', 'on');
    set(handles.dcOffsetText,      'Enable', 'on');
    set(handles.frequencyLabel,    'Enable', 'on');
    set(handles.frequencyText,     'Enable', 'on');
    set(handles.frequencyHighText, 'Enable', 'on'); %% CHA 1/21/04
case 2   % constant
    set(handles.amplitudeLabel,'Enable', 'on');
    set(handles.amplitudeText, 'Enable', 'on');
case 3   % file
    set(handles.filenameLabel, 'Enable', 'on');
    set(handles.filenameText,  'Enable', 'on');
    set(handles.componentPopupMenu, 'Enable','off'); %% CHA 1/21/04
case 4   % ramp
    set(handles.timeLabel,     'Enable', 'on');
    set(handles.timeOnText,    'Enable', 'on');
    set(handles.timeOffText,   'Enable', 'on');
    set(handles.amplitudeLabel,'Enable', 'on');
    set(handles.amplitudeText, 'Enable', 'on');
    set(handles.dcOffsetLabel, 'Enable', 'on');
    set(handles.dcOffsetText,  'Enable', 'on');
case 5   % sine
    set(handles.amplitudeLabel,'Enable', 'on');
    set(handles.amplitudeText, 'Enable', 'on');
    set(handles.dcOffsetLabel, 'Enable', 'on');
    set(handles.dcOffsetText,  'Enable', 'on');
    set(handles.frequencyLabel,'Enable', 'on');
    set(handles.frequencyText, 'Enable', 'on');
    set(handles.phaseLabel,    'Enable', 'on');
    set(handles.phaseText,     'Enable', 'on');
case 6   % square wave
    set(handles.amplitudeLabel,'Enable', 'on');
    set(handles.amplitudeText, 'Enable', 'on');
    set(handles.dcOffsetLabel, 'Enable', 'on');
    set(handles.dcOffsetText,  'Enable', 'on');
    set(handles.frequencyLabel,'Enable', 'on');
    set(handles.frequencyText, 'Enable', 'on');
    set(handles.phaseLabel,    'Enable', 'on');
    set(handles.phaseText,     'Enable', 'on');
case 7   % step
    set(handles.amplitudeLabel,'Enable', 'on');
    set(handles.amplitudeText, 'Enable', 'on');
    set(handles.dcOffsetLabel, 'Enable', 'on');
    set(handles.dcOffsetText,  'Enable', 'on');
    set(handles.timeLabel,     'Enable', 'on');
    set(handles.timeOnText,    'Enable', 'on');
    set(handles.timeOffText,   'Enable', 'on');
end

if (handles.enableLengthOfRun ~= 0)
    set(handles.lengthOfRunText, 'Enable', 'on');
else
    set(handles.lengthOfRunText, 'Enable', 'off');
end
% --------------------------------------------------------------------
function varargout = createSignalGenerators()
% If no signal generators exist in global memory this function will
% create the signal generator structure
global NumSignalGenerators SignalGenerators

if exist('SignalGenerators') ~= 0
    if (NumSignalGenerators > 0)
       return;
    end
end

NumSignalGenerators = 1;
SignalGenerators = repmat(struct('SigType', 'Ramp',          ...
                                 'Frequency', 5.0,       ...
                                 'FrequencyHigh', 30.0,   ...
                                 'Phase', 0.0,           ...
                                 'Amplitude', 0.5,       ...
                                 'dcOffset', 0.0,        ...
                                 'TimeOn', 0.0,          ...
                                 'TimeOff', 1.0,         ...
                                 'Filename', '' ),       ...
                                 NumSignalGenerators, 3);
                     
% --------------------------------------------------------------------
function varargout = loadSignalNumMenu(handles)
% Load the Signal Generator Number menu
global NumSignalGenerators SignalGenerators

if NumSignalGenerators == 0
    return;
end

for i = 1:NumSignalGenerators
    signalNums{i}= num2str(i);
end
set(handles.signalGenNumberPopupMenu, 'String', signalNums);
set(handles.signalGenNumberPopupMenu, 'Value', 1);

% --------------------------------------------------------------------
function varargout = loadSignalGeneratorData(handles);
% Load the data windows for the currently selected signal generator
global NumSignalGenerators SignalGenerators SignalGeneratorDimension

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
    
for i = 1:SignalGeneratorDimension(signalNum)
    componentNums{i} = num2str(i);
end
set(handles.componentPopupMenu, 'String', componentNums);

componentNum = get(handles.componentPopupMenu, 'Value');
if (componentNum > SignalGeneratorDimension(signalNum))
    componentNum = 1;
    set(handles.componentPopupMenu, 'Value', componentNum);
end

indx = 1;
switch lower(SignalGenerators(signalNum,componentNum).SigType(1:4))
case 'cons'
    indx = 2;
case 'ramp'
    indx = 4;
case 'step'
    indx = 7;
case 'sine'
    indx = 5;
case 'squa'
    indx = 6;
case 'nois'
    indx = 1;
case 'file'
    indx = 3;
end
set(handles.signalTypePopupMenu, 'Value', indx);
set(handles.frequencyText, 'String', num2str(SignalGenerators(signalNum,componentNum).Frequency));
set(handles.frequencyHighText, 'String', num2str(SignalGenerators(signalNum,componentNum).FrequencyHigh));
set(handles.phaseText, 'String', num2str(SignalGenerators(signalNum,componentNum).Phase));
set(handles.amplitudeText, 'String', num2str(SignalGenerators(signalNum,componentNum).Amplitude));
set(handles.dcOffsetText, 'String', num2str(SignalGenerators(signalNum,componentNum).dcOffset));
set(handles.timeOnText, 'String', num2str(SignalGenerators(signalNum,componentNum).TimeOn));
set(handles.timeOffText, 'String', num2str(SignalGenerators(signalNum,componentNum).TimeOff));
set(handles.filenameText, 'String', SignalGenerators(signalNum,componentNum).Filename);
set(handles.lengthOfRunText, 'String', num2str(handles.lengthOfRun));

% --------------------------------------------------------------------
function varargout = signalTypePopupMenu_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.signalTypePopupMenu.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
s = '';
indx = get(handles.signalTypePopupMenu, 'Value');
switch indx;
case 1
    s = 'noise';
case 2
    s = 'const';
case 3
    s = 'file';
    componentNum = 1; %% CHA 1/21/04
case 4
    s = 'ramp';
case 5
    s = 'sine';
case 6
    s = 'squa';
case 7
    s = 'step';
end

SignalGenerators(signalNum,componentNum).SigType = s;
setEnables(handles);


% --------------------------------------------------------------------
function varargout = frequencyText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.frequencyText.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Frequency = str2double(get(handles.frequencyText, 'String'));


% --------------------------------------------------------------------
function varargout = phaseText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.phaseText.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Phase = str2double(get(handles.phaseText, 'String'));


% --------------------------------------------------------------------
function varargout = amplitudeText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.amplitudeText.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Amplitude = str2double(get(handles.amplitudeText, 'String'));


% --------------------------------------------------------------------
function varargout = timeOnText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.timeOnText.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).TimeOn = str2double(get(handles.timeOnText, 'String'));


% --------------------------------------------------------------------
function varargout = lengthOfRunText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.slopeText.

% --------------------------------------------------------------------
function varargout = filenameText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.filenameText.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).Filename = get(handles.filenameText, 'String');


% --------------------------------------------------------------------
function varargout = frequencyHighText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.frequencyHighText.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).FrequencyHigh = str2double(get(handles.frequencyHighText, 'String'));

% --------------------------------------------------------------------
function varargout = timeOffText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.timeOffText.
global NumSignalGenerators SignalGenerators

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).TimeOff = str2double(get(handles.timeOffText, 'String'));

% --------------------------------------------------------------------
function varargout = closeButton_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.closeButton.
% close all;
delete(gcbf);


% --------------------------------------------------------------------
function varargout = signalGenNumberPopupMenu_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.signalGenNumberPopupMenu.
loadSignalGeneratorData(handles);
setEnables(handles);

% --------------------------------------------------------------------
function varargout = plotButton_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.plotButton.
global SignalGenerators SignalGeneratorDimension

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
componentNum = get(handles.componentPopupMenu, 'Value');
figure(1); clf;

sigTemp = SignalGenerators(signalNum,:);
tot = str2double(get(handles.lengthOfRunText, 'String'));
dTime = 0.0005; %% Needs to be changed to Nyquist limit of signal -cha
t = [0:dTime:tot];
componentDim = SignalGeneratorDimension(signalNum);
sig = sim_genSignal(t, sigTemp, componentDim);
plot(t,sig');

titlestr=['External Input',num2str(signalNum)];
title(titlestr);

comstr = 'component';
legstr = zeros(componentDim,length(comstr)+3);
for(i=1:componentDim);
    if(i<10)
        legstr(i,:) = [comstr,' ',num2str(i),' '];
    else
        legstr(i,:) = [comstr,' ',num2str(i)];
    end
end
legend(char(legstr));

% --------------------------------------------------------------------
function varargout = dcOffsetText_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.dcOffsetText.
global NumSignalGenerators SignalGenerators
componentNum = get(handles.componentPopupMenu, 'Value');

signalNum = get(handles.signalGenNumberPopupMenu, 'Value');
SignalGenerators(signalNum,componentNum).dcOffset = str2double(get(handles.dcOffsetText, 'String'));



% --------------------------------------------------------------------
function varargout = componentPopupMenu_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.componentPopupMenu.
loadSignalGeneratorData(handles);
setEnables(handles);

Contact us at files@mathworks.com