function Interfaccia_dataset % Initialization close all % Add the UI components hUI = addcomponents; % Make figure visible after adding hUI.fig.Visible = 'on'; % Global variables (shared between functions) global tempo_doppler global tempo_sig global data global fs global sample global index global flag global ylim_zoom global fs_doppler % Default Settings index = 1; flag = 1; fs=2048; fs_doppler=284; unica = imread('Logo_UniCa.jpg'); red = unica(:,:, 1); green = unica(:,:, 2); blue = unica(:,:, 3); rth = 240; gth = 240; bth = 240; redMask = (red > rth); greenMask = (green > gth); blueMask = (blue > bth); mask = logical(redMask & greenMask & blueMask); red(mask) = 240; green(mask) = 240; blue(mask) = 240; unica(:,:,1) = red; unica(:,:,2) = green; unica(:,:,3) = blue; imshow(unica, 'Parent', hUI.logo_unica); function hUI = addcomponents() % Add components, save handles in a struct % Main figure hUI.fig = figure('Visible','off', 'numbertitle','off',... 'Units','normalized', 'menubar','figure', 'name','Fetal ECG interface',... 'Resize','on', 'Position',[.015 .055 .97 .848]);%, 'Color',[1 215/255 227/255]); % Image hUI.ax1 = axes('Units','pixels','Units','normalized',... 'XTick',[], 'YTick',[], 'Position',[.05 .55 .7 .44]); % Logo Unica hUI.logo_unica = axes('Units','pixels','Units','normalized',... 'XTick',[], 'YTick',[], 'Position',[.756 .74 .25 .25]); % Signal hUI.ax2 = axes('Units','pixels','Units','normalized',... 'Position',[.05 .1 .7 .44]); % Slider hUI.slider = uicontrol(hUI.fig,'Style','slider','Min',1,'Max',2,'Value',1,... 'Units','normalized','Position',[.19 .02 .56 .03],'Enable','off','Visible','on',... 'BackgroundColor',[0.941 0.941 0.941],'callback',@slider_callback); % Frame text uicontrol(hUI.fig,'Style','text',... 'String','Frame',... 'Units','normalized','Position',[.05 .04 .05 .02]); % Current frame hUI.frame_disp = uicontrol(hUI.fig,'Style','edit','Units','normalized',... 'String','1','Value',1,'Position',[.05 .012 .05 .02],... 'callback',@frame_disp_callback,... 'Interruptible','on','Visible', 'on','Enable','off'); % Time text uicontrol(hUI.fig,'Style','text',... 'String','Time [s]',... 'Units','normalized','Position',[.11 .04 .05 .02]); % Current time hUI.time_disp = uicontrol(hUI.fig,'Style','text','Units','normalized',... 'String','0','Value',0,'Position',[.11 .012 .05 .02],... 'Interruptible','on','Visible', 'on','Enable','on'); % LOAD button hUI.load_but = uicontrol(hUI.fig,'Style','pushbutton',... 'String','LOAD','Units','normalized','Position',[.84 .63 .08 .05],... 'BackgroundColor',[0.941 0.941 0.941], 'callback',@load_callback,'Interruptible','on','Enable', 'on'); % Channel group hUI.channelgrp = uibuttongroup('parent',hUI.fig,'Title','Channels','visible','on',... 'Position',[.79 .3 .19 .30],'BackgroundColor',[0.941 0.941 0.941]); % Channel checkboxes: hUI.ch1 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 1','Value',1,'Enable','off',... 'Position',[0.01 0.9 0.2 0.08]); hUI.ch2 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 2','Value',0,'Enable','off',... 'Position',[0.01 0.8 0.2 0.09]); hUI.ch3 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 3','Value',0,'Enable','off',... 'Position',[0.01 0.7 0.2 0.09]); hUI.ch4 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 4','Value',0,'Enable','off',... 'Position',[0.01 0.6 0.2 0.09]); hUI.ch5 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 5','Enable','off',... 'Position',[0.01 0.5 0.2 0.09]); hUI.ch6 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 6','Value',0,'Enable','off',... 'Position',[0.01 0.4 0.2 0.09]); hUI.ch7 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 7','Enable','off',... 'Position',[0.01 0.3 0.2 0.09]); hUI.ch8 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 8','Value',0,'Enable','off',... 'Position',[0.01 0.2 0.2 0.09]); hUI.ch9 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 9','Value',0,'Enable','off',... 'Position',[0.01 0.1 0.2 0.09]); hUI.ch10 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 10','Value',0,'Enable','off',... 'Position',[0.01 0.001 0.2 0.09]); hUI.ch11 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 11','Value',0,'Enable','off',... 'Position',[0.27 0.9 0.2 0.09]); hUI.ch12 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 12','Value',0,'Enable','off',... 'Position',[0.27 0.8 0.2 0.09]); hUI.ch13 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 13','Value',0,'Enable','off',... 'Position',[0.27 0.7 0.2 0.09]); hUI.ch14 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 14','Value',0,'Enable','off',... 'Position',[0.27 0.6 0.2 0.09]); hUI.ch15 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 15','Value',0,'Enable','off',... 'Position',[0.27 0.5 0.2 0.09]); hUI.ch16 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 16','Value',0,'Enable','off',... 'Position',[0.27 0.4 0.2 0.09]); hUI.ch17 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 17','Value',0,'Enable','off',... 'Position',[0.27 0.3 0.2 0.09]); hUI.ch18 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 18','Value',0,'Enable','off',... 'Position',[0.27 0.2 0.2 0.09]); hUI.ch19 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 19','Value',0,'Enable','off',... 'Position',[0.27 0.1 0.2 0.09]); hUI.ch20 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 20','Value',0,'Enable','off',... 'Position',[0.27 0.001 0.2 0.09]); hUI.ch21 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 21','Value',0,'Enable','off',... 'Position',[0.53 0.9 0.2 0.09]); hUI.ch22 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 22','Value',0,'Enable','off',... 'Position',[0.53 0.8 0.2 0.09]); hUI.ch23 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 23','Value',0,'Enable','off',... 'Position',[0.53 0.7 0.2 0.09]); hUI.ch24 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 24','Value',0,'Enable','off',... 'Position',[0.53 0.6 0.2 0.09]); hUI.ch25 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 25','Value',0,'Enable','off',... 'Position',[0.53 0.5 0.2 0.09]); hUI.ch26 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 26','Value',0,'Enable','off',... 'Position',[0.53 0.4 0.2 0.09]); hUI.ch27 = uicontrol(hUI.channelgrp,'Style', 'check','Units','normalized',... 'String','Ch 27','Value',0,'Enable','off',... 'Position',[0.53 0.3 0.2 0.09]); hUI.offset = uicontrol(hUI.fig,'Style', 'check','Units','normalized',... 'String','Remove the offset','Value',0,'Enable','off',... 'Position',[.84 .15 .12 .10]); hUI.zoom_plus = uicontrol(hUI.fig,'Style', 'check','Units','normalized',... 'String','Zoom +','Value',0,'Enable','off',... 'Position',[.84 .08 .12 .10]); % Plot button hUI.plot_but = uicontrol(hUI.fig, 'Style','pushbutton',... 'String','PLOT', 'Units','normalized','Position',[.84 .22 .08 .05],... 'BackgroundColor',[0.941 0.941 0.941], 'callback',@plot_callback,... 'Interruptible','on','Enable', 'off','Visible','on'); end function load_callback(~,~) [Name_doppler, Path_doppler] = uigetfile({'*.bmp','Doppler (*.bmp)'},... 'Select Filtered Doppler'); [Name_sig, Path_sig] = uigetfile({'*.mat','Signal (*.mat)'},... 'Select Signal'); hUI.load_but.BackgroundColor = [.9 .4 .4]; hUI.load_but.Enable = 'off'; signal = load([Path_sig, Name_sig]); data = signal.PORTI; doppler = imread([Path_doppler, Name_doppler]); imshow(doppler, 'Parent', hUI.ax1); xlim(hUI.ax1, [-2*fs_doppler - 1,2*fs_doppler - 1]); ch = 1; L = length(data(ch,:)); tempo_sig = (0:L-1)/fs; len = length(doppler); tempo_doppler = (0:len-1)/fs_doppler; sample = 1; plot(hUI.ax2,tempo_sig,data(ch,:)); data_plotted=data(ch,:); ylabel('Amplitude [µV]') hold(hUI.ax2, 'on' ) line([tempo_sig(sample), tempo_sig(sample)], ylim(hUI.ax2),'Color','r') xlim(hUI.ax2, [tempo_sig(sample)-2,tempo_sig(sample)+2]); hold(hUI.ax2, 'off' ) set(hUI.frame_disp, 'Enable','on') set(hUI.slider, 'Enable','on') set(hUI.slider,'Min',1) set(hUI.slider,'Max', len) set(hUI.slider,'Value',1) set(hUI.slider,'SliderStep',[1/(len-1), 10/(len-1)]) set(hUI.load_but,'BackgroundColor',[0.941 0.941 0.941]); set(hUI.load_but,'Enable', 'on') set(hUI.ch1, 'Enable','on') set(hUI.ch2, 'Enable','on') set(hUI.ch3, 'Enable','on') set(hUI.ch4, 'Enable','on') set(hUI.ch5, 'Enable','on') set(hUI.ch6, 'Enable','on') set(hUI.ch7, 'Enable','on') set(hUI.ch8, 'Enable','on') set(hUI.ch9, 'Enable','on') set(hUI.ch10, 'Enable','on') set(hUI.ch11, 'Enable','on') set(hUI.ch12, 'Enable','on') set(hUI.ch13, 'Enable','on') set(hUI.ch14, 'Enable','on') set(hUI.ch15, 'Enable','on') set(hUI.ch16, 'Enable','on') set(hUI.ch17, 'Enable','on') set(hUI.ch18, 'Enable','on') set(hUI.ch19, 'Enable','on') set(hUI.ch20, 'Enable','on') set(hUI.ch21, 'Enable','on') set(hUI.ch22, 'Enable','on') set(hUI.ch23, 'Enable','on') set(hUI.ch24, 'Enable','on') set(hUI.ch25, 'Enable','on') set(hUI.ch26, 'Enable','on') set(hUI.ch27, 'Enable','on') set(hUI.offset, 'Enable','on') set(hUI.zoom_plus, 'Enable','on') set(hUI.plot_but,'Enable', 'on') ylim_zoom=ylim; ylim([ylim_zoom(1) ylim_zoom(2)]) end function slider_callback(~,~) ncol = round(get(hUI.slider,'Value')); set(hUI.frame_disp,'Value',ncol); set(hUI.frame_disp,'String',ncol); set(hUI.time_disp,'Value',tempo_doppler(ncol)); set(hUI.time_disp,'String',tempo_doppler(ncol)); xlim(hUI.ax1, [-2*fs_doppler + ncol-1, 2*fs_doppler + ncol-1]); if isempty(index)==0 [~, sample] = min(abs(tempo_sig - tempo_doppler(ncol))); if get(hUI.offset,'value') remove_offset else plot(hUI.ax2,tempo_sig,data(index,:)); end hold ylabel('Amplitude [µV]') hold(hUI.ax2, 'on' ) line([tempo_sig(sample), tempo_sig(sample)], ylim(hUI.ax2),'Color','r') xlim(hUI.ax2, [tempo_sig(sample)-2,tempo_sig(sample)+2]); hold(hUI.ax2, 'off' ) if get(hUI.zoom_plus,'value') zoom_plus end ylim([ylim_zoom(1) ylim_zoom(2)]) end end function frame_disp_callback(~,~) ncol = round(str2double(get(hUI.frame_disp,'String'))); set(hUI.frame_disp,'Value',ncol); set(hUI.frame_disp,'String',ncol); set(hUI.slider,'Value',ncol); set(hUI.time_disp,'Value',tempo_doppler(ncol)); set(hUI.time_disp,'String',tempo_doppler(ncol)); xlim(hUI.ax1, [-2*fs_doppler + ncol-1, 2*fs_doppler + ncol-1]); if isempty(index)==0 [~, sample] = min(abs(tempo_sig - tempo_doppler(ncol))); if get(hUI.offset,'value') remove_offset else plot(hUI.ax2,tempo_sig,data(index,:)); end hold ylabel('Amplitude [µV]') hold(hUI.ax2, 'on' ) line([tempo_sig(sample), tempo_sig(sample)], ylim(hUI.ax2),'Color','r') xlim(hUI.ax2, [tempo_sig(sample)-2,tempo_sig(sample)+2]); hold(hUI.ax2, 'off' ) ylim([ylim_zoom(1) ylim_zoom(2)]) if get(hUI.zoom_plus,'value') zoom_plus end end end function plot_callback(~,~) flag=1; value = zeros(1,27); for i = 1:27 value(i) = get(hUI.(sprintf('ch%d',i)),'value'); end index = find(value); if isempty(index)==1 cla(hUI.ax2) elseif isempty(index)==0 if get(hUI.offset,'value') remove_offset else plot(hUI.ax2,tempo_sig,data(index,:)); end hold(hUI.ax2, 'on' ) line([tempo_sig(sample), tempo_sig(sample)], ylim(hUI.ax2),'Color','r') xlim(hUI.ax2, [tempo_sig(sample)-2,tempo_sig(sample)+2]); ylabel('Amplitude [µV]') hold(hUI.ax2, 'off' ) ylim_zoom=ylim; ylim([ylim_zoom(1) ylim_zoom(2)]) if get(hUI.zoom_plus,'value') zoom_plus end end end function remove_offset(~,~) if (tempo_sig(sample)-2)*fs<1 plot(hUI.ax2,tempo_sig,data(index,:)-mean(data(index,[1:(tempo_sig(sample)+2)*fs])')'); elseif (tempo_sig(sample)+2)*fs>length(data) plot(hUI.ax2,tempo_sig,data(index,:)-mean(data(index,[(tempo_sig(sample)-2)*fs:end])')'); else plot(hUI.ax2,tempo_sig,data(index,:)-mean(data(index,round([tempo_sig(sample)-2:tempo_sig(sample)+2]*fs))')'); end end function zoom_plus(~,~) y=get(findobj(gca,'Type','line'),'Ydata'); d=[cell2mat(y(2));cell2mat(y(3));cell2mat(y(4))]; xx=xlim; time=(xx(1)*fs:xx(2)*fs); d=d(:,time(time>0)); ylim([min(min( d))-0.1 max(max(d))]) ylim_zoom = ylim; end end