Code covered by the BSD License  

Highlights from
The Waveform Suite for MATLAB

image thumbnail
from The Waveform Suite for MATLAB by Celso Reyes
Allows seismic data retrieval from varied sources and simplified creation of sophisticated programs

uispecgram(varargin)
function varargout = uispecgram(varargin)
% UISPECGRAM M-file for uispecgram.fig
%      USAGE: uispecgram(waveform, [spectralobject], [datasource])
%       spectralobject and datasource parameters are optional, and order
%       does not matter.
%
%
%      UISPECGRAM('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in UISPECGRAM.M with the given input arguments.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES, spectralobject, spectralobject/specgram2, spectralobject/specgram
%
% 

% Modified by hand 10/22/2005
%
% Edit the above text to modify the response to help uispecgram

% Last Modified by GUIDE v2.5 13-Mar-2010 15:24:21

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
  'gui_Singleton',  gui_Singleton, ...
  'gui_OpeningFcn', @uispecgram_OpeningFcn, ...
  'gui_OutputFcn',  @uispecgram_OutputFcn, ...
  'gui_LayoutFcn',  [] , ...
  'gui_Callback',   []);
if (nargin > 0) && 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 uispecgram is made visible.
function uispecgram_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to uispecgram (see VARARGIN)

% Choose default command line output for uispecgram
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);


%celso code
nArgs = numel(varargin);
userData = struct('wave',waveform,'spec',spectralobject,'source',datasource);
for i=1:nArgs
  if isa(varargin{i},'waveform')
    userData.wave = varargin{i};
  elseif isa(varargin{i},'spectralobject')
    userData.spec = varargin{i};
  elseif isa(varargin{i},'datasource')
    userData.source = varargin{i};
  end
end
if (numel(userData.wave)> 1) || isempty(userData.wave(1))
  error('uispecgram must be called with a single waveform object.');
end

set(hObject,'UserData',userData); %spectralobject & waveform
set(handles.menu_xunits,'userdata','Seconds');


% This sets up the initial plot - only do when we are invisible
% so window can get raised using uispecgram.
if strcmp(get(hObject,'Visible'),'off')
  %set pointer to watch
  %P = getptr(gcf);
  %setptr(gcf,'watch')
  
  %draw the waveform
  axes(handles.axes_waveform);
  plot(userData.wave);
  axis tight
  
  %draw the spectrogram
  %   axes(handles.axes_specgram);
  specgram(userData.spec,userData.wave,...
      'axis',handles.axes_specgram,...
      'colorbar','none',...
      'yscale',get(handles.checkbox_logy,'UserData'));
  handles.output = userData.spec;
  guidata(hObject,handles)
  title('');
  colorbar('horiz');
  
  %set the parameters to match ouir input parameter...
  
  % --------------------------------------------------------------------
  % Initialize the slider and edit box UI controls
  dBLimits = get(userData.spec,'dbLims');
  lowerLimit = dBLimits(1); upperLimit = dBLimits(2);
  
  max_dbLim_value = 200;
  min_dbLim_value = 0;
  min_dBLim_step = 1/max_dbLim_value;
  max_dBLim_step = 10/max_dbLim_value;
  
  % ... Set the Lower dBLims slider
  set(handles.minDBLIMS,...
    'value',lowerLimit,...
    'sliderstep',[min_dBLim_step max_dBLim_step],...
    'max',max_dbLim_value,...
    'min',min_dbLim_value);
  set(handles.edit_MIN,'value',lowerLimit,'string',num2str(lowerLimit));
  
  % ... Set the Upper dBLims slider
  set(handles.maxDBLIMS,...
    'value', upperLimit,...
    'sliderstep', [min_dBLim_step max_dBLim_step],...
    'max',max_dbLim_value,...
    'min',min_dbLim_value);
  
  set(handles.edit_MAX,'value',upperLimit,'string',num2str(upperLimit));
  
  % --------------------------------------------------------------------
  %... set the Frequency slider
  max_freq_value = 49;
  min_freq_value = 1;
  min_freq_step = 1 / max_freq_value;
  max_freq_step = 10 / max_freq_value;
  current_max_freq = get(userData.spec,'freqMax');
  set(handles.slider_FreqMax,...
    'value', current_max_freq,...
    'sliderstep',[min_freq_step max_freq_step],...
    'max',max_freq_value,'min',min_freq_value);
  set(handles.edit_FreqMax,...
    'value',current_max_freq,...
    'string', num2str(current_max_freq));
  
  current_nfft = find(get(userData.spec,'NFFT')==[16384 8192 4096 2048 1024 512 256]);
  if isempty(current_nfft), current_nfft = 8; end
  %     switch get(userData.spec,'NFFT')
  %         case 256, current_nfft = 7;
  %         case 512, current_nfft = 6;
  %         case 1024, current_nfft = 5;
  %         case 2048, current_nfft = 4;
  %         case 4096, current_nfft = 3;
  %         case 8192, current_nfft = 2;
  %         case 16384, current_nfft = 1;
  %         otherwise
  %             current_nfft = 8; %custom
  %     end
  set(handles.popupmenu_NFFT,'value',current_nfft);
  
  nfft = get(userData.spec, 'NFFT');
  overlap = get(userData.spec,'OVER');
  freq = get(userData.wave,'Fs');
  dif = round(nfft - overlap);
  percent_overlap = round((nfft - overlap) / nfft * 100);
  overlapMenuItem = 0;
  
  switch percent_overlap
    case 20, overlapMenuItem = 2;
    case 50, overlapMenuItem = 3;
    case 80, overlapMenuItem = 4;
    case 90, overlapMenuItem = 5;
  end
  if (overlapMenuItem == 0)
    % didn't match a percent overlap, see if there's a dif
    switch dif
      case 0, overlapMenuItem = 1;
      case freq, overlapMenuItem = 6;
      case (freq * 2), overlapMenuItem = 7;
      case (freq * 5), overlapMenuItem = 8;
      case (freq * 10), overlapMenuItem = 9;
      case (freq * 30), overlapMenuItem = 10;
      case (freq * 60), overlapMenuItem = 11;
      otherwise
        %unaccounted for overlap.  However, we need to be able to handle
        %it.
        possibleOverlaps = get(handles.popupmenu_OVER,'string');
        possibleOverlaps(12) = {num2str(overlap)};
        set(handles.popupmenu_OVER,'string',possibleOverlaps);
        overlapMenuItem = 12;
    end
  end
  set(handles.popupmenu_OVER,'value',overlapMenuItem);
  if (nargout==1)
    uiwait(handles.specgramfig);
  end
  
  
  %setptr(gcf,P{:}) %set pointer back to normal
end

% UIWAIT makes uispecgram wait for user response (see UIRESUME)
% uiwait(handles.specgramfig);


% --- Outputs from this function are returned to the command line.
function varargout = uispecgram_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;
uiresume(handles.specgramfig);

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes_specgram);
userData = get(handles.specgramfig,'userdata');


% nfft = get(userData.spec,'NFFT');

% modify the stored spectralobject based on NFFT value from the pop-up menu
NFFT_sel_index = get(handles.popupmenu_NFFT, 'Value');
possibleNFFTvalues = get(handles.popupmenu_NFFT,'string');
nfft = str2double(possibleNFFTvalues(NFFT_sel_index));
userData.spec = set(userData.spec,'NFFT',nfft);

% modify the overlap based upon the overlap value from pop-up menu
userData.spec = set(userData.spec,'FreqMax',get(handles.slider_FreqMax,'value'));
freq = get(userData.wave,'Fs');

switch get(handles.popupmenu_OVER,'value')
  case 1, overlap = 0;
  case 2, overlap = .20 * nfft;
  case 3, overlap = .50 * nfft;
  case 4, overlap = .80 * nfft;
  case 5, overlap = .90 * nfft;
  case 6, overlap = nfft - (freq);
  case 7, overlap = nfft - (freq * 2);
  case 8, overlap = nfft - (freq * 5);
  case 9, overlap = nfft - (freq * 10);
  case 10, overlap = nfft - (freq * 30);
  case 11, overlap = nfft - (freq * 60);
  case 12, allOverlapStrings = get(handles.popupmenu_OVER,'string');
    overlap = str2double(allOverlapStrings(12));
end

pointerShape = getptr(gcf);
setptr(gcf,'watch')

userData.spec = set(userData.spec,'over',overlap);
dbls = [get(handles.minDBLIMS,'value'), get(handles.maxDBLIMS,'value')];
if dbls(1) > dbls(2)
  set(handles.minDBLIMS,'value',dbls(2));
  set(handles.edit_MIN,'value',dbls(2),'string',num2str(dbls(2)));
  set(handles.maxDBLIMS,'value',dbls(1));
  set(handles.edit_MAX,'value',dbls(1),'string',num2str(dbls(1)));
end;
userData.spec = set(userData.spec,'dblims', sort(dbls));

axes(handles.axes_specgram);

specgram(userData.spec,userData.wave,...
    'xunit',get(handles.menu_xunits,'userdata'),...
    'axis', handles.axes_specgram,...
    'colorbar','none',...
    'yscale',get(handles.checkbox_logy,'UserData'));
%specgram(userData.spec,userData.wave);
%colorbar('horiz');
title('');
set(handles.specgramfig,'userdata',userData);
handles.output = userData.spec;
guidata(hObject,handles);

set(gcf,pointerShape{:}); %set pointer back to what it was before...

% --------------------------------------------------------------------
function FileMenu_Callback(hObject, eventdata, handles)
% hObject    handle to FileMenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --------------------------------------------------------------------
function OpenMenuItem_Callback(hObject, eventdata, handles)
% hObject    handle to OpenMenuItem (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
file = uigetfile('*.fig');
if ~isequal(file, 0)
  open(file);
end

% --------------------------------------------------------------------
function PrintMenuItem_Callback(hObject, eventdata, handles)
% hObject    handle to PrintMenuItem (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
printdlg(handles.specgramfig)

% --------------------------------------------------------------------
function CloseMenuItem_Callback(hObject, eventdata, handles)
% hObject    handle to CloseMenuItem (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
selection = questdlg(['Close ' get(handles.specgramfig,'Name') '?'],...
  ['Close ' get(handles.specgramfig,'Name') '...'],...
  'Yes','No','Yes');
if strcmp(selection,'No')
  return;
end

delete(handles.specgramfig)


% --- Executes during object creation, after setting all properties.
function popupmenu_NFFT_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc
  set(hObject,'BackgroundColor','white');
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

set(hObject, 'String', {'16384', '8192', '4096', '2048', '1024', '512', '256'});

% --- Executes on selection change in popupmenu3.
function popupmenu_NFFT_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = get(hObject,'String') returns popupmenu3 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu3

autoUpdatePlot(eventdata,handles);

% --- Executes during object creation, after setting all properties.
function minDBLIMS_CreateFcn(hObject, eventdata, handles)
% hObject    handle to minDBLIMS (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background, change
%       'usewhitebg' to 0 to use default.  See ISPC and COMPUTER.
usewhitebg = 1;
if usewhitebg
  set(hObject,'BackgroundColor',[.9 .9 .9]);
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end


% --- Executes on slider movement.
function minDBLIMS_Callback(hObject, eventdata, handles)
% hObject    handle to minDBLIMS (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
set(hObject,'Value',round(get(hObject,'Value')));
set(handles.edit_MIN,'string',num2str(get(hObject,'Value')),'value',get(hObject,'Value'));

autoUpdatePlot(eventdata,handles);

% --- Executes during object creation, after setting all properties.
function maxDBLIMS_CreateFcn(hObject, eventdata, handles)
% hObject    handle to maxDBLIMS (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background, change
%       'usewhitebg' to 0 to use default.  See ISPC and COMPUTER.
%usewhitebg = 1;
if ispc
  set(hObject,'BackgroundColor',[.9 .9 .9]);
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end


% --- Executes on slider movement.
function maxDBLIMS_Callback(hObject, eventdata, handles)
% hObject    handle to maxDBLIMS (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

set(hObject,'Value',round(get(hObject,'Value')));
set(handles.edit_MAX,'string',num2str(get(hObject,'Value')),'value',get(hObject,'Value'));

autoUpdatePlot(eventdata,handles);

% --- Executes during object creation, after setting all properties.
function popupmenu_OVER_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu_OVER (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc
  set(hObject,'BackgroundColor','white');
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end


% --- Executes on selection change in popupmenu_OVER.
function popupmenu_OVER_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu_OVER (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = get(hObject,'String') returns popupmenu_OVER contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu_OVER

autoUpdatePlot(eventdata,handles);

% --- Executes during object creation, after setting all properties.
function edit_MAX_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_MAX (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc
  set(hObject,'BackgroundColor','white');
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end



function edit_MAX_Callback(hObject, eventdata, handles)
% hObject    handle to edit_MAX (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_MAX as text
%        str2double(get(hObject,'String')) returns contents of edit_MAX as a double


% --- Executes during object creation, after setting all properties.
function edit_MIN_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_MIN (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc
  set(hObject,'BackgroundColor','white');
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end



function edit_MIN_Callback(hObject, eventdata, handles)
% hObject    handle to edit_MIN (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_MIN as text
%        str2double(get(hObject,'String')) returns contents of edit_MIN as a double


% --- Executes during object creation, after setting all properties.
function slider_FreqMax_CreateFcn(hObject, eventdata, handles)
% hObject    handle to slider_FreqMax (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background, change
%       'usewhitebg' to 0 to use default.  See ISPC and COMPUTER.
usewhitebg = 1;
if usewhitebg
  set(hObject,'BackgroundColor',[.9 .9 .9]);
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end


% --- Executes on slider movement.
function slider_FreqMax_Callback(hObject, eventdata, handles)
% hObject    handle to slider_FreqMax (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

set(hObject,'Value',round(get(hObject,'Value')));
set(handles.edit_FreqMax,'string',num2str(get(hObject,'Value')),'value',get(hObject,'Value'));

autoUpdatePlot(eventdata,handles);

% --- Executes during object creation, after setting all properties.
function edit_FreqMax_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit_FreqMax (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc
  set(hObject,'BackgroundColor','white');
else
  set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end



function edit_FreqMax_Callback(hObject, eventdata, handles)
% hObject    handle to edit_FreqMax (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit_FreqMax as text
%        str2double(get(hObject,'String')) returns contents of edit_FreqMax as a double


% --- Executes on button press in checkbox_AutoUpdate.
function checkbox_AutoUpdate_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox_AutoUpdate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of checkbox_AutoUpdate
autoUpdatePlot(eventdata,handles);

% --------------------------------------------------------------------
function Specgram2_Callback(hObject, eventdata, handles)
% hObject    handle to Specgram2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%Generates a specgram2 figure, suitable for printing and more...

h = figure
userData = get(handles.specgramfig,'userdata');
userData.wave
userData.spec
figure(h);
specgram2(userData.spec,userData.wave);
drawnow;


% --------------------------------------------------------------------
function menu_waveform_Callback(hObject, eventdata, handles)
% hObject    handle to menu_waveform (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --------------------------------------------------------------------
function menuitem_changetimes_Callback(hObject, eventdata, handles)
% hObject    handle to menuitem_changetimes (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% get old waveform for defaults...
userData = get(handles.specgramfig,'userdata');

if strcmpi(get(userData.source,'type'),'none')
  warning('No data source exists');
  set(hObject,'enable','off');
  set(handles.menuitem_changestation,'enable','off');
end

stt = get(userData.wave,'start');
ent = get(userData.wave,'end');

anS = inputdlg('Start time?','Waveform Starting time',1,{[datestr(stt,23) ' ' datestr(stt,13)]});
%Answer = INPUTDLG(Prompt,Title,LineNo,DefAns
if datenum(anS) > ent, ent = datenum(anS), end;  %default to new start time.
anE = inputdlg('End time?','Waveform Ending time',1,{[datestr(ent,23) ' ' datestr(ent,13)]});

try
neww = waveform(userData.source,get(userData.wave,'scnlobject'),anS{1},anE{1});
catch
    disp('unable to access a waveform.  have a blank one instead');
end
if ~exist('neww','var') || isempty(neww)
    neww = set(userData.wave,'start',anS{1},'data',[0 0 0]);
    % return
end
if exist('neww','var')
  userData.wave = neww;
  set(handles.specgramfig,'userdata',userData);
  pointerShape = getptr(gcf);
  setptr(gcf,'watch') % change cursor to watch (courtesy)
  axes(handles.axes_waveform);
  plot(userData.wave,'xunit',get(handles.menu_xunits,'userdata'));
  axis tight
  set(gcf,pointerShape{:})
  uispecgram('pushbutton1_Callback',handles.pushbutton1,eventdata,handles) %plot the spectra for the new waveform
end

% --------------------------------------------------------------------
function menuitem_changestation_Callback(hObject, eventdata, handles)
% hObject    handle to menuitem_changestation (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
userData = get(handles.specgramfig,'userdata');
if isunassigned(userData.source)
    % no data source has been chosen
    vnames = evalin('base','whos'); %get list of variables from main workspace
    vnames = vnames(strcmp({vnames.class},'datasource')); %keep datasource
    [selection, ok] = listdlg(...
        'PromptString',...
        'Choose a datasource variable, or the *new datasource*',...
        'listsize',[220 300],...
        'liststring', [{vnames.name},{'*new datasource*'}] );
    if ~ok,
        return
    end
    if selection > numel(vnames)
        %create a datasource from scratch
        answer = inputdlg('Type the datasource creation command.   ',...
            'Create datasource',1,{'datasource(''file'',''filename'')'},'on');
        if isempty(answer)
            return;
        end
        try
            userData.source = eval(answer);        
            set(handles.specgramfig,'userdata',userData);
        catch
            errordlg(['Unable to create the datasource object'],'Problem creating datasource');
        end
    else
        userData.source = evalin('base',vnames(selection).name);
        set(handles.specgramfig,'userdata',userData);
    end
    
    
end
scnl = uiscnlobject(get(userData.wave,'scnlobject'))
pointerShape = getptr(gcf);
neww = waveform(userData.source, scnl, ...
    get(userData.wave,'start'),...
    get(userData.wave,'end'));
if numel(neww) == 0
  errordlg('No waveform was found','invalid station', 'modal');
else
  set(gcf,pointerShape{:})
  if isa(neww,'waveform')
    userData.wave = neww;
    set(handles.specgramfig,'userdata',userData); %make the new waveform available
    setptr(gcf,'watch') % change cursor to watch (courtesy)
    axes(handles.axes_waveform);
    plot(userData.wave,'xunit',get(handles.menu_xunits,'userdata'));
    axis tight
    set(gcf,pointerShape{:})
    uispecgram('pushbutton1_Callback',handles.pushbutton1,eventdata,handles) %plot the spectra for the new waveform
  end
end


%%%HELPER FUNCTION %%%

function create_spectralobject_in_workspace(handles)
prompt = 'Name of variable to create?';
name = 'create a spectralobject variable in the workspace';
defaultanswer = {'s'};
numlines= 1;
options.Resize='on';
options.WindowStyle='modal';
options.Interpreter='none';
answer = inputdlg(prompt,name,numlines,defaultanswer,options);
userData = get(handles.specgramfig,'userdata');
assignin('base',answer{1},userData.spec);


% --------------------------------------------------------------------
function specgram_Callback(hObject, eventdata, handles)
% hObject    handle to specgram (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
h = figure;
userData = get(handles.specgramfig,'userdata');
figure(h);
specgram(userData.spec,userData.wave,...
    'xunit',get(handles.menu_xunits,'UserData'),...
    'axis',gca,...
    'yscale',get(handles.checkbox_logy,'UserData')...
    );
drawnow;

% --------------------------------------------------------------------
function createSpectralobjectMenuItem_Callback(hObject, eventdata, handles)
% hObject    handle to createSpectralobjectMenuItem (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
try
  create_spectralobject_in_workspace(handles);
catch
  error('Unable to save spectralobject to workspace');
end


% --------------------------------------------------------------------
function spectralobjectMenu_Callback(hObject, eventdata, handles)
% hObject    handle to spectralobjectMenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --------------------------------------------------------------------
function plotMenu_Callback(hObject, eventdata, handles)
% hObject    handle to plotMenu (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --------------------------------------------------------------------
function menu_xunits_Callback(hObject, eventdata, handles)
% hObject    handle to menu_xunits (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


function menu_setxunit_Callback(hObject, eventdata, handles)
% hObject    handle to menu_date (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)



set(handles.menu_xunits,'userdata',get(hObject,'Label'));
set(handles.menu_seconds,'checked','off');
set(handles.menu_minutes,'checked','off');
set(handles.menu_hours,'checked','off');
set(handles.menu_date,'checked','off');
set(handles.menu_doy,'checked','off');

set(hObject,'checked','on');
replot_waveform(handles);
uispecgram('pushbutton1_Callback',handles.pushbutton1,eventdata,handles) %plot the spectra for the new waveform

function replot_waveform(handles)
axes(handles.axes_waveform)
userData = get(handles.specgramfig,'userdata');
xunits = get(handles.menu_xunits,'userdata');
plot(userData.wave,'xunit',xunits);
axis tight


% --- Executes on button press in checkbox_logy.
function checkbox_logy_Callback(hObject, eventdata, handles)
% hObject    handle to checkbox_logy (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of checkbox_logy
if get(hObject,'value')
    set(hObject,'UserData','log');
else
    set(hObject,'UserData','normal');
end

autoUpdatePlot(eventdata,handles);

function autoUpdatePlot(eventdata,handles)
% Automatically update the plot IF AutoUpdate is checked
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if get(handles.checkbox_AutoUpdate,'value')
  uispecgram('pushbutton1_Callback',handles.pushbutton1,eventdata,handles)
end


% --- Executes during object creation, after setting all properties.
function checkbox_logy_CreateFcn(hObject, eventdata, handles)
% hObject    handle to checkbox_logy (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Check to see if we have to ability to create log spectrograms, if not,
% then disable the log checkbox.

if exist('uimagesc.m','file') ~= 0
    set(hObject,'Enable','on');
else
    set(hObject,'Enable','off');
end


% --------------------------------------------------------------------
function menu_about_Callback(hObject, eventdata, handles)
% hObject    handle to menu_about (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
h = helpdlg('Version r228, by Celso G. Reyes, University of Alaska Fairbanks http://www.mathworks.com/matlabcentral/fileexchange/authors/53809','About uispecgram');

Contact us at files@mathworks.com