/DSPS.m
Objective C | 232 lines | 213 code | 19 blank | 0 comment | 12 complexity | 33eaf897d2d4d1587ad89f2735fb59c9 MD5 | raw file
- %-------------------------------------------------------------------------------
- % Name: Cardiac Signal Software
- % Purpose: Friendly Software for Heart Rate Variabilty Analysis
- %
- % Author: Rhenan Bartels Ferreira
- %
- % Created: 25/03/2013
- % Copyright: (c) Rhenan 2013
- % License: <your license>
- %-------------------------------------------------------------------------------
- %!/usr/bin/env Matlab
- clear all
- close all
- clc
- Fs = [];
- Control = 0;
- fid = figure('name','Digital HRV-Signal Processing Software',...
- 'number','off','position',[200,50,900,660],'resize','off',...
- 'color',[0.839,0.91,0.851]);
- set(fid,'Menubar','none');
- %Clear all Variables When Closed.
- set(fid,'DeleteFcn','clear all')
- %Logo Icon
- ax = axes;
- set(ax,'pos',[0.86,0.01,0.13,0.15])
- im = imread('logoPEB.png');
- image(im)
- set(ax,'visible','off')
- %Copyrigth
- st = uicontrol('Style','text','Position',[0.1,10,150,15],...
- 'String','Cardiac Signal Software','BackGroundColor',[0.839,0.91,0.851]);
- %Main Axes for Plots
- ax1 = axes;
- set(ax1,'pos',[0.1500, 0.600, 0.7, 0.35]);
- ax2 = axes;
- set(ax2,'pos',[0.1500, 0.150, 0.5, 0.35]);
- % Main Menu for File Handle.
- menuid = uimenu;
- set(menuid,'Label','File')
- %Table for results
- %rt = uicontrol('Style','Text','String','Results','Position',[600,120,280,230],...
- %'Background',[1,1,1]);
- % Menu for Open iRR.
- menuid_open_irr = uimenu(menuid);
- set(menuid_open_irr,'Label','Open &iRR');
- set(menuid_open_irr,'CallBack',...
- ['[Time,iRR,Fs,filename,pathname] = loadfile(ax1); set(menuid_plots,''Enable'',''on'')'...
- ';set(menuid_PP,''Enable'',''on'');set(menuid_SP,''Enable'',''on'')'...
- ';set(menuid_save,''Enable'',''on'');set(menuid_cut,''Enable'',''on'');'...
- 'clear VLF LF HF TotalPower LF_HF LFnu iRR_keeper Time_keeper Pxx'...
- ' HFnu RMSSD SDNN pNN50 SD1 SD2 RMSSDj SDNNj pNN50j averagej VLF_AR LF_AR'...
- ' HF_AR LF_HF_AR LFnu_AR HFnu_AR LF_HF_AR F_AR Pxx_AR TotalPower_AR Fft'...
- ' LF_STFT HF_STFT;Fs = [];if Control == 1,set(menuid_plot_timevarying,''Enable'',''off'');'...
- 'set(menuid_plot_periodogram,''Enable'',''off'');'...
- 'set(menuid_confidence_interval,''Enable'',''off'');',...
- 'set(menuid_goodfit,''Enable'',''off'');end;cla(ax2);Control = 1;'...
- 'iRR_keeper = iRR; Time_keeper = Time;clear Results']);
- % Menu for Open ECG.
- menuid_open_ecg = uimenu(menuid);
- set(menuid_open_ecg,'Label','Open ECG','CallBack',['[ecg_time,ECG,Fs_ecg] =',...
- 'loadecg();axes(ax1);plot(ecg_time,ECG,''k'');xlabel(''Time (s)'');ylabel(''Volts (v)'');',...
- 'set(menuid_rridetect,''Enable'',''on'')']);
- % Menu for Save iRR, ECG or Results.
- menuid_save= uimenu(menuid,'Label','Save','Enable','off');
- menuid_save_irr = uimenu(menuid_save,'Label','Save RRi','CallBack','savefile_irr(iRR)');
- menuid_save_results = uimenu(menuid_save);
- %Implement save results, offer an option for users (TXT,excel)'
- set(menuid_save_results,'Label','Save Results','Callback','saveresults');
- menuid_save_figures = uimenu(menuid_save);
- set(menuid_save_figures,'Label','Save Figures','CallBack','savefigures');
- %Menu for Signal Processing
- menuid_SP = uimenu('Label','Signal Processing','Enable','off');
- menuid_timedomain = uimenu(menuid_SP);
- set(menuid_timedomain,'Label','Time Domain Analysis','CallBack',...
- ['[RMSSD,pNN50,SDNN,SD1,SD2] = timedomain(iRR);set(table,''Data'',', ...
- '[RMSSD,pNN50,SDNN,SD1,SD2], ''RowName'',''Indexes'',''ColumnName'',{''RMSSD (ms)'',',...
- '''pNN50 (%)'',''SDNN (ms)'',''SD1 (ms)'',''SD2 (ms)''});'...
- 'Results.Time_Domain.RMSSD = RMSSD; Results.Time_Domain.pNN50 = pNN50;'...
- 'Results.Time_Domain.SDNN = SDNN;Results.Time_Domain.SD1 = SD1;'...
- 'Results.Time_Domain.SD2 = SD2;'])
- menuid_timevarying = uimenu(menuid_SP);
- set(menuid_timevarying,'Label','Time - Varying Analysis','CallBack',[...
- '[Index,RMSSDj,pNN50j,SDNNj,averagej,segment_TV,overlap_TV,P_TV] = timevarying(iRR,Time);',...
- 'set(menuid_plot_timevarying,''Enable'',''on'');set(table,''Data'',', ...
- '[RMSSDj;pNN50j;SDNNj;averagej],''RowName'',{''RMSSDj'',''pNN50j'',''SDNNj'',',...
- '''Averagej''});Results.Time_Varying.RMSSDj = RMSSDj;Results.Time_Varying.SDNNj = SDNNj;'...
- 'Results.Time_Varying.pNN50j = pNN50j;Results.Time_Varying.Averagej = averagej;'])
- menuid_PSD = uimenu(menuid_SP,'Label','Power Spectral Density Estimation');
- menuid_pwelch = uimenu(menuid_PSD);
- set(menuid_pwelch,'Label','Welch Periodogram', ...
- 'CallBack',['[F,Pxx,LF,HF,VLF,LFnu,HFnu,LF_HF,TotalPower,iRR,Time,'...
- 'Fs,window_w,bands_PSD,segment_PSD,overlap_PSD,N_estimative_PSD] =',...
- 'psdestimative(iRR,Time,Fs,ax2);set(menuid_plot_periodogram,''Enable'',''on'');' ...
- 'set(table,''Data'',[VLF,LF,HF,LFnu,HFnu,LF_HF],''ColumnName'',{''VLF (ms²) '','...
- '''LF (ms²)'',''HF (ms²)'',''LF (n.u)'',''HF (n.u)'',''LF/HF''},''RowName'',''Indexes'');'...
- 'Results.PSD.LF=LF;Results.PSD.HF = HF;Results.PSD.VLF=VLF;Results.PSD.LFnu'...
- '=LFnu;Results.PSD.HFnu=HFnu;Results.PSD.LF_HF=LF_HF;Results.PSD.TotalPower=TotalPower;'])
- menuid_AR = uimenu(menuid_PSD,'Label','Auto Regressive','CallBack',['[F_AR,Pxx_AR,LF_AR,',...
- 'HF_AR,VLF_AR,LFnu_AR,HFnu_AR,LF_HF_AR,TotalPower_AR,iRR,Time,Fs,window_AR,order_AR,'...
- 'bands_AR] = psdar(iRR,Time,Fs,ax2); set(table,''Data'',',...
- '[VLF_AR,LF_AR,HF_AR,LFnu_AR,HFnu_AR,LF_HF_AR],',...
- '''ColumnName'',{''VLF (ms²) '',''LF (ms²)'',''HF (ms²)'',',...
- '''LF (n.u)'',''HF (n.u)'',''LF/HF''},''RowName'',''Indexes'');'...
- 'set(menuid_plot_periodogram,''Enable'',''on'');Results.AR.LF=LF_AR;Results.AR.HF=HF_AR;'...
- 'Results.AR.VLF=VLF_AR;Results.AR.LFnu_AR=LFnu_AR;Results.AR.HFnu_AR=HFnu_AR;'...
- 'Results.AR.LF_HF_AR=LF_HF_AR;Results.AR.TotalPower_AR=TotalPower_AR;']);
- menuid_nlfit = uimenu(menuid_SP,'Label','Non-Linear Regression');
- menuid_LS = uimenu(menuid_PSD,'Label','Lomb-Scargle Periodogram');
- menuid_fit = uimenu(menuid_nlfit,'Label','Non-Linear Regression','CallBack',...
- ['[Par] = nonlinearreg(Time,iRR,ax2); set(table,''Data'',Par(1:3),',...
- '''ColumnName'',{''HR0 (bpm)'',''HRDelta (bpm)'',''Tau (s)''}',...
- ',''RowName'',''Indexes'');set(menuid_confidence_interval,''Enable'',''on'');',...
- 'set(menuid_goodfit,''Enable'',''on'');Results.nlinfit.Par = Par(1:3);']);
- menuid_confidence_interval = uimenu(menuid_nlfit,'Label','Confidence Inteval',...
- 'Enable','off','CallBack',['[confidence_interval] = ',...
- 'montecarlosim(Par(1:3),Time,Par(end)); set(table,''DATA'',confidence_interval,',...
- '''ColumnName'',{''F0-inf'',''F0-sup'',''FCdelta-inf'',''FCdelta-sup'',',...
- '''Tau-inf'',''Tau-sup''},''RowName'',''Confidence Interval'')']);
- menuid_goodfit = uimenu(menuid_nlfit,'Label','Goodness of Fit','Enable','off',...
- 'CallBack',['set(table,''DATA'',[Par(4),Par(end)],''ColumnName'',',...
- '{''R²'',''SSE''},''RowName'',''Indexes'');Results.nlinfit.gof=[Par(4),Par(end)];']);
- menuid_filter = uimenu(menuid_SP,'Label','Filters');
- menuid_ratiofilter = uimenu(menuid_filter,'Label','Quotient Filter',...
- 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''Ratio'',Fs,Time,ax1);');
- menuid_movingaverage = uimenu(menuid_filter,'Label','Moving Avarage Filter',...
- 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''MovingAverage'',Fs,Time,ax1);');
- menuid_runningmedian = uimenu(menuid_filter,'Label','Running Median Filter',...
- 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''RunningMedian'',Fs,Time,ax1);');
- menuid_butter = uimenu(menuid_filter,'Label','Butterwoth Filter',...
- 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''butter'',Fs,Time,ax1);');
- % Time-Frequency Analysis
- menuid_TF = uimenu(menuid_SP,'Label','Time - Frequency Analysis');
- menuid_STFT = uimenu(menuid_TF,'Label','STFT','CallBack',...
- ['[Pft,Fft,HF_STFT,LF_STFT,iRR,Time,time_stft,Fs,window_stft,segment_stft,overlap_stft] = time',...
- 'frequency(iRR,Time,Fs,ax2);Results.STFT.LF = LF_STFT;Results.STFT.HF = HF_STFT;']);
- menuid_STAR = uimenu(menuid_TF,'Label','Short Time Auto Regressive','CallBack',[...
- '[Pft_AR,Fft_AR,HF_STAR,LF_STAR,iRR,Time,time_star,Fs,window_star,segment_star,overlap_star'...
- '] = timefrequencyar(iRR,Time,Fs,ax2);Results.STAR.LF = LF_STAR;Results.STAR.HF=HF_STAR;']);
- %Menu for Signal Pre Processing
- menuid_PP = uimenu(menuid_SP,'Label','Pre Processing','CallBack',...
- '[Time,iRR,Fs] = preprocessing(iRR,Time,Fs);','Enable','off');
- %RRi detect
- menuid_rridetect = uimenu('Label','RRi Detect','Enable','off');
- menuid_rr_peak = uimenu(menuid_rridetect,'Label','Detect QRS Peak','CallBack',...
- ['[Time,iRR,ref_val,ecgf,irr_pos] = irrdetect(ECG,Fs_ecg);set(menuid_plots,',...
- '''Enable'',''on'');set(menuid_PP,''Enable'',''on'');set(menuid_SP,''Enable'',''on'')',...
- ';set(menuid_save,''Enable'',''on'');iRR_keeper = iRR; Time_keeper = Time;',...
- 'set(menuid_cut,''Enable'',''on'')']);
- %Menu for Plots
- menuid_plots = uimenu('Label','Plot','Enable','off');
- menuid_plot_irr = uimenu(menuid_plots,'Label','Plot Tachogram',...
- 'CallBack',['axes(ax1);plot(Time,iRR,''k'');title(''Tachogram'');',...
- 'xlabel(''Time (s)'');ylabel(''iRR (ms)'');axis tight']);
- menuid_plot_timevarying = uimenu(menuid_plots,'Label',...
- 'Plot Time-Varying Results','Enable','off');
- menuid_plot_RMSSDj = uimenu(menuid_plot_timevarying,'Label', 'Plot RMSSDj',...
- 'CallBack',['axes(ax2);plot(Index,RMSSDj,''k.-'');',...
- 'axis tight;title(''Time-Varying: RMSSDj'');xlabel(''Time Index (s)'');',...
- 'ylabel(''RMSSD (ms)'');']);
- menuid_plot_pNN50j = uimenu(menuid_plot_timevarying,'Label', 'Plot pNN50j',...
- 'CallBack',['axes(ax2);plot(Index,pNN50j,''k.-'');', ...
- 'axis tight;title(''Time-Varying: pNN50j'');',...
- 'xlabel(''Time Index (s)'');ylabel(''pNN50 (%)'')']);
- menuid_plot_SDNNj = uimenu(menuid_plot_timevarying,'Label', 'Plot SDNNj',...
- 'CallBack',['axes(ax2);plot(Index,SDNNj,''k.-'');',...
- 'axis tight;title(''Time-Varying: SDNNj'');',...
- 'xlabel(''Time Index (s)'');ylabel(''SDNN (ms)'')']);
- menuid_plot_averagej = uimenu(menuid_plot_timevarying,'Label', 'Plot Average',...
- 'CallBack',['axes(ax2);plot(Index,averagej,''k.-'');', ...
- 'axis tight;title(''Time-Varying: Averagej'');', ...
- 'xlabel(''Time Index (s)'');ylabel(''Average (ms)'')']);
- menuid_plot_periodogram = uimenu(menuid_plots,'Label',...
- 'Plot Power Spectral Density Function','Enable','off','CallBack',...
- ['if exist(''Pxx'',''var''),plot(F,Pxx);else, plot(F_AR,Pxx_AR);end;'...
- 'xlabel(''Frequency (Hz)'');ylabel(''PSD (ms²/Hz)'');', ...
- 'title(''Power Spectral Density Function'')']);
- % %Uitable Creation
- % table = uitable('Position',[150,10,600,60],'ColumnFormat',...
- % {'Numeric'});
- % Cut Signal
- menuid_cut = uimenu('Label','Select Range','Enable','off');
- menuid_cut_time = uimenu(menuid_cut,'Label','Select by Time',...
- 'CallBack','[Time,iRR] = selectsignal(Time,iRR,''Time'',ax1);');
- menuid_cut_plot = uimenu(menuid_cut,'Label','Select by View',...
- 'CallBack','[Time,iRR] = selectsignal(Time,iRR,''Plot'',ax1);');
- menuid_cut_original = uimenu(menuid_cut,'Label','Original Tachogram',...
- 'CallBack',['iRR = iRR_keeper; Time = Time_keeper;axes(ax1);plot(Time,iRR,''k'');',...
- 'axis tight;title(''Tachogram'');xlabel(''Time (s)'');ylabel(''RRi (ms)'')']);
- menuuid_viewtime = uimenu(menuid_cut,'Label','Select by View and Time',...
- 'CallBack','[Time,iRR] = selectsignal(Time,iRR,''ViewTime'',ax1);');
- % Statiotanary Tests.
- menuid_stationary = uimenu(menuid_SP,'Label','Stationarity Tests');
- menuid_runstest = uimenu(menuid_stationary,'Label','Runs Test','CallBack',...
- ['[r,rsup,rinf,result] = run_test(iRR,0.05);']);
- menuid_revarr = uimenu(menuid_stationary,'Label','Reverse Arrangements Test',...
- 'CallBack','[A,Asup,Ainf,result] = revarr_test(iRR,0.05);');
- menuid_figprop = uimenu('Label','Figure Properties');
- menuid_figprop_ax1 = uimenu(menuid_figprop,'Label','Axes 1');
- menuid_figprop_ax1_xlim = uimenu(menuid_figprop_ax1,'Label','Axis Limits','CallBack',...
- ['figproperties(''lim'',ax1)']);
- menuid_figprop_ax1_pan = uimenu(menuid_figprop_ax1,'Label','Pan','CallBack',...
- ['figproperties(''pan'',ax1)']);
- menuid_figprop_ax2 = uimenu(menuid_figprop,'Label','Axes 2');
- menuid_figprop_ax2_xlim = uimenu(menuid_figprop_ax2,'Label','Axis Limits','CallBack',...
- ['figproperties(''lim'',ax2)']);
- menuid_figprop_pan = uimenu(menuid_figprop,'Label','Pan','CallBack',...
- ['figproperties(''pan'',ax2)']);
- menuid_figprop_zoom = uimenu(menuid_figprop,'Label','Zoom On','CallBack',...
- ['figproperties(''zoomon'',ax1)']);
- menuid_figprop_zoom = uimenu(menuid_figprop,'Label','Zoom Off','CallBack',...
- ['figproperties(''zoomoff'',ax1)']);
- %Help
- menuid_help = uimenu('Label','Help');