PageRenderTime 34ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/DSPS.m

https://bitbucket.org/leoneumamm/dsps
Objective C | 232 lines | 213 code | 19 blank | 0 comment | 12 complexity | 33eaf897d2d4d1587ad89f2735fb59c9 MD5 | raw file
  1. %-------------------------------------------------------------------------------
  2. % Name: Cardiac Signal Software
  3. % Purpose: Friendly Software for Heart Rate Variabilty Analysis
  4. %
  5. % Author: Rhenan Bartels Ferreira
  6. %
  7. % Created: 25/03/2013
  8. % Copyright: (c) Rhenan 2013
  9. % License: <your license>
  10. %-------------------------------------------------------------------------------
  11. %!/usr/bin/env Matlab
  12. clear all
  13. close all
  14. clc
  15. Fs = [];
  16. Control = 0;
  17. fid = figure('name','Digital HRV-Signal Processing Software',...
  18. 'number','off','position',[200,50,900,660],'resize','off',...
  19. 'color',[0.839,0.91,0.851]);
  20. set(fid,'Menubar','none');
  21. %Clear all Variables When Closed.
  22. set(fid,'DeleteFcn','clear all')
  23. %Logo Icon
  24. ax = axes;
  25. set(ax,'pos',[0.86,0.01,0.13,0.15])
  26. im = imread('logoPEB.png');
  27. image(im)
  28. set(ax,'visible','off')
  29. %Copyrigth
  30. st = uicontrol('Style','text','Position',[0.1,10,150,15],...
  31. 'String','Cardiac Signal Software','BackGroundColor',[0.839,0.91,0.851]);
  32. %Main Axes for Plots
  33. ax1 = axes;
  34. set(ax1,'pos',[0.1500, 0.600, 0.7, 0.35]);
  35. ax2 = axes;
  36. set(ax2,'pos',[0.1500, 0.150, 0.5, 0.35]);
  37. % Main Menu for File Handle.
  38. menuid = uimenu;
  39. set(menuid,'Label','File')
  40. %Table for results
  41. %rt = uicontrol('Style','Text','String','Results','Position',[600,120,280,230],...
  42. %'Background',[1,1,1]);
  43. % Menu for Open iRR.
  44. menuid_open_irr = uimenu(menuid);
  45. set(menuid_open_irr,'Label','Open &iRR');
  46. set(menuid_open_irr,'CallBack',...
  47. ['[Time,iRR,Fs,filename,pathname] = loadfile(ax1); set(menuid_plots,''Enable'',''on'')'...
  48. ';set(menuid_PP,''Enable'',''on'');set(menuid_SP,''Enable'',''on'')'...
  49. ';set(menuid_save,''Enable'',''on'');set(menuid_cut,''Enable'',''on'');'...
  50. 'clear VLF LF HF TotalPower LF_HF LFnu iRR_keeper Time_keeper Pxx'...
  51. ' HFnu RMSSD SDNN pNN50 SD1 SD2 RMSSDj SDNNj pNN50j averagej VLF_AR LF_AR'...
  52. ' HF_AR LF_HF_AR LFnu_AR HFnu_AR LF_HF_AR F_AR Pxx_AR TotalPower_AR Fft'...
  53. ' LF_STFT HF_STFT;Fs = [];if Control == 1,set(menuid_plot_timevarying,''Enable'',''off'');'...
  54. 'set(menuid_plot_periodogram,''Enable'',''off'');'...
  55. 'set(menuid_confidence_interval,''Enable'',''off'');',...
  56. 'set(menuid_goodfit,''Enable'',''off'');end;cla(ax2);Control = 1;'...
  57. 'iRR_keeper = iRR; Time_keeper = Time;clear Results']);
  58. % Menu for Open ECG.
  59. menuid_open_ecg = uimenu(menuid);
  60. set(menuid_open_ecg,'Label','Open ECG','CallBack',['[ecg_time,ECG,Fs_ecg] =',...
  61. 'loadecg();axes(ax1);plot(ecg_time,ECG,''k'');xlabel(''Time (s)'');ylabel(''Volts (v)'');',...
  62. 'set(menuid_rridetect,''Enable'',''on'')']);
  63. % Menu for Save iRR, ECG or Results.
  64. menuid_save= uimenu(menuid,'Label','Save','Enable','off');
  65. menuid_save_irr = uimenu(menuid_save,'Label','Save RRi','CallBack','savefile_irr(iRR)');
  66. menuid_save_results = uimenu(menuid_save);
  67. %Implement save results, offer an option for users (TXT,excel)'
  68. set(menuid_save_results,'Label','Save Results','Callback','saveresults');
  69. menuid_save_figures = uimenu(menuid_save);
  70. set(menuid_save_figures,'Label','Save Figures','CallBack','savefigures');
  71. %Menu for Signal Processing
  72. menuid_SP = uimenu('Label','Signal Processing','Enable','off');
  73. menuid_timedomain = uimenu(menuid_SP);
  74. set(menuid_timedomain,'Label','Time Domain Analysis','CallBack',...
  75. ['[RMSSD,pNN50,SDNN,SD1,SD2] = timedomain(iRR);set(table,''Data'',', ...
  76. '[RMSSD,pNN50,SDNN,SD1,SD2], ''RowName'',''Indexes'',''ColumnName'',{''RMSSD (ms)'',',...
  77. '''pNN50 (%)'',''SDNN (ms)'',''SD1 (ms)'',''SD2 (ms)''});'...
  78. 'Results.Time_Domain.RMSSD = RMSSD; Results.Time_Domain.pNN50 = pNN50;'...
  79. 'Results.Time_Domain.SDNN = SDNN;Results.Time_Domain.SD1 = SD1;'...
  80. 'Results.Time_Domain.SD2 = SD2;'])
  81. menuid_timevarying = uimenu(menuid_SP);
  82. set(menuid_timevarying,'Label','Time - Varying Analysis','CallBack',[...
  83. '[Index,RMSSDj,pNN50j,SDNNj,averagej,segment_TV,overlap_TV,P_TV] = timevarying(iRR,Time);',...
  84. 'set(menuid_plot_timevarying,''Enable'',''on'');set(table,''Data'',', ...
  85. '[RMSSDj;pNN50j;SDNNj;averagej],''RowName'',{''RMSSDj'',''pNN50j'',''SDNNj'',',...
  86. '''Averagej''});Results.Time_Varying.RMSSDj = RMSSDj;Results.Time_Varying.SDNNj = SDNNj;'...
  87. 'Results.Time_Varying.pNN50j = pNN50j;Results.Time_Varying.Averagej = averagej;'])
  88. menuid_PSD = uimenu(menuid_SP,'Label','Power Spectral Density Estimation');
  89. menuid_pwelch = uimenu(menuid_PSD);
  90. set(menuid_pwelch,'Label','Welch Periodogram', ...
  91. 'CallBack',['[F,Pxx,LF,HF,VLF,LFnu,HFnu,LF_HF,TotalPower,iRR,Time,'...
  92. 'Fs,window_w,bands_PSD,segment_PSD,overlap_PSD,N_estimative_PSD] =',...
  93. 'psdestimative(iRR,Time,Fs,ax2);set(menuid_plot_periodogram,''Enable'',''on'');' ...
  94. 'set(table,''Data'',[VLF,LF,HF,LFnu,HFnu,LF_HF],''ColumnName'',{''VLF (ms²) '','...
  95. '''LF (ms²)'',''HF (ms²)'',''LF (n.u)'',''HF (n.u)'',''LF/HF''},''RowName'',''Indexes'');'...
  96. 'Results.PSD.LF=LF;Results.PSD.HF = HF;Results.PSD.VLF=VLF;Results.PSD.LFnu'...
  97. '=LFnu;Results.PSD.HFnu=HFnu;Results.PSD.LF_HF=LF_HF;Results.PSD.TotalPower=TotalPower;'])
  98. menuid_AR = uimenu(menuid_PSD,'Label','Auto Regressive','CallBack',['[F_AR,Pxx_AR,LF_AR,',...
  99. 'HF_AR,VLF_AR,LFnu_AR,HFnu_AR,LF_HF_AR,TotalPower_AR,iRR,Time,Fs,window_AR,order_AR,'...
  100. 'bands_AR] = psdar(iRR,Time,Fs,ax2); set(table,''Data'',',...
  101. '[VLF_AR,LF_AR,HF_AR,LFnu_AR,HFnu_AR,LF_HF_AR],',...
  102. '''ColumnName'',{''VLF (ms²) '',''LF (ms²)'',''HF (ms²)'',',...
  103. '''LF (n.u)'',''HF (n.u)'',''LF/HF''},''RowName'',''Indexes'');'...
  104. 'set(menuid_plot_periodogram,''Enable'',''on'');Results.AR.LF=LF_AR;Results.AR.HF=HF_AR;'...
  105. 'Results.AR.VLF=VLF_AR;Results.AR.LFnu_AR=LFnu_AR;Results.AR.HFnu_AR=HFnu_AR;'...
  106. 'Results.AR.LF_HF_AR=LF_HF_AR;Results.AR.TotalPower_AR=TotalPower_AR;']);
  107. menuid_nlfit = uimenu(menuid_SP,'Label','Non-Linear Regression');
  108. menuid_LS = uimenu(menuid_PSD,'Label','Lomb-Scargle Periodogram');
  109. menuid_fit = uimenu(menuid_nlfit,'Label','Non-Linear Regression','CallBack',...
  110. ['[Par] = nonlinearreg(Time,iRR,ax2); set(table,''Data'',Par(1:3),',...
  111. '''ColumnName'',{''HR0 (bpm)'',''HRDelta (bpm)'',''Tau (s)''}',...
  112. ',''RowName'',''Indexes'');set(menuid_confidence_interval,''Enable'',''on'');',...
  113. 'set(menuid_goodfit,''Enable'',''on'');Results.nlinfit.Par = Par(1:3);']);
  114. menuid_confidence_interval = uimenu(menuid_nlfit,'Label','Confidence Inteval',...
  115. 'Enable','off','CallBack',['[confidence_interval] = ',...
  116. 'montecarlosim(Par(1:3),Time,Par(end)); set(table,''DATA'',confidence_interval,',...
  117. '''ColumnName'',{''F0-inf'',''F0-sup'',''FCdelta-inf'',''FCdelta-sup'',',...
  118. '''Tau-inf'',''Tau-sup''},''RowName'',''Confidence Interval'')']);
  119. menuid_goodfit = uimenu(menuid_nlfit,'Label','Goodness of Fit','Enable','off',...
  120. 'CallBack',['set(table,''DATA'',[Par(4),Par(end)],''ColumnName'',',...
  121. '{''R²'',''SSE''},''RowName'',''Indexes'');Results.nlinfit.gof=[Par(4),Par(end)];']);
  122. menuid_filter = uimenu(menuid_SP,'Label','Filters');
  123. menuid_ratiofilter = uimenu(menuid_filter,'Label','Quotient Filter',...
  124. 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''Ratio'',Fs,Time,ax1);');
  125. menuid_movingaverage = uimenu(menuid_filter,'Label','Moving Avarage Filter',...
  126. 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''MovingAverage'',Fs,Time,ax1);');
  127. menuid_runningmedian = uimenu(menuid_filter,'Label','Running Median Filter',...
  128. 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''RunningMedian'',Fs,Time,ax1);');
  129. menuid_butter = uimenu(menuid_filter,'Label','Butterwoth Filter',...
  130. 'CallBack','[iRR,Fs,Time] = hrvfilter(iRR,''butter'',Fs,Time,ax1);');
  131. % Time-Frequency Analysis
  132. menuid_TF = uimenu(menuid_SP,'Label','Time - Frequency Analysis');
  133. menuid_STFT = uimenu(menuid_TF,'Label','STFT','CallBack',...
  134. ['[Pft,Fft,HF_STFT,LF_STFT,iRR,Time,time_stft,Fs,window_stft,segment_stft,overlap_stft] = time',...
  135. 'frequency(iRR,Time,Fs,ax2);Results.STFT.LF = LF_STFT;Results.STFT.HF = HF_STFT;']);
  136. menuid_STAR = uimenu(menuid_TF,'Label','Short Time Auto Regressive','CallBack',[...
  137. '[Pft_AR,Fft_AR,HF_STAR,LF_STAR,iRR,Time,time_star,Fs,window_star,segment_star,overlap_star'...
  138. '] = timefrequencyar(iRR,Time,Fs,ax2);Results.STAR.LF = LF_STAR;Results.STAR.HF=HF_STAR;']);
  139. %Menu for Signal Pre Processing
  140. menuid_PP = uimenu(menuid_SP,'Label','Pre Processing','CallBack',...
  141. '[Time,iRR,Fs] = preprocessing(iRR,Time,Fs);','Enable','off');
  142. %RRi detect
  143. menuid_rridetect = uimenu('Label','RRi Detect','Enable','off');
  144. menuid_rr_peak = uimenu(menuid_rridetect,'Label','Detect QRS Peak','CallBack',...
  145. ['[Time,iRR,ref_val,ecgf,irr_pos] = irrdetect(ECG,Fs_ecg);set(menuid_plots,',...
  146. '''Enable'',''on'');set(menuid_PP,''Enable'',''on'');set(menuid_SP,''Enable'',''on'')',...
  147. ';set(menuid_save,''Enable'',''on'');iRR_keeper = iRR; Time_keeper = Time;',...
  148. 'set(menuid_cut,''Enable'',''on'')']);
  149. %Menu for Plots
  150. menuid_plots = uimenu('Label','Plot','Enable','off');
  151. menuid_plot_irr = uimenu(menuid_plots,'Label','Plot Tachogram',...
  152. 'CallBack',['axes(ax1);plot(Time,iRR,''k'');title(''Tachogram'');',...
  153. 'xlabel(''Time (s)'');ylabel(''iRR (ms)'');axis tight']);
  154. menuid_plot_timevarying = uimenu(menuid_plots,'Label',...
  155. 'Plot Time-Varying Results','Enable','off');
  156. menuid_plot_RMSSDj = uimenu(menuid_plot_timevarying,'Label', 'Plot RMSSDj',...
  157. 'CallBack',['axes(ax2);plot(Index,RMSSDj,''k.-'');',...
  158. 'axis tight;title(''Time-Varying: RMSSDj'');xlabel(''Time Index (s)'');',...
  159. 'ylabel(''RMSSD (ms)'');']);
  160. menuid_plot_pNN50j = uimenu(menuid_plot_timevarying,'Label', 'Plot pNN50j',...
  161. 'CallBack',['axes(ax2);plot(Index,pNN50j,''k.-'');', ...
  162. 'axis tight;title(''Time-Varying: pNN50j'');',...
  163. 'xlabel(''Time Index (s)'');ylabel(''pNN50 (%)'')']);
  164. menuid_plot_SDNNj = uimenu(menuid_plot_timevarying,'Label', 'Plot SDNNj',...
  165. 'CallBack',['axes(ax2);plot(Index,SDNNj,''k.-'');',...
  166. 'axis tight;title(''Time-Varying: SDNNj'');',...
  167. 'xlabel(''Time Index (s)'');ylabel(''SDNN (ms)'')']);
  168. menuid_plot_averagej = uimenu(menuid_plot_timevarying,'Label', 'Plot Average',...
  169. 'CallBack',['axes(ax2);plot(Index,averagej,''k.-'');', ...
  170. 'axis tight;title(''Time-Varying: Averagej'');', ...
  171. 'xlabel(''Time Index (s)'');ylabel(''Average (ms)'')']);
  172. menuid_plot_periodogram = uimenu(menuid_plots,'Label',...
  173. 'Plot Power Spectral Density Function','Enable','off','CallBack',...
  174. ['if exist(''Pxx'',''var''),plot(F,Pxx);else, plot(F_AR,Pxx_AR);end;'...
  175. 'xlabel(''Frequency (Hz)'');ylabel(''PSD (ms²/Hz)'');', ...
  176. 'title(''Power Spectral Density Function'')']);
  177. % %Uitable Creation
  178. % table = uitable('Position',[150,10,600,60],'ColumnFormat',...
  179. % {'Numeric'});
  180. % Cut Signal
  181. menuid_cut = uimenu('Label','Select Range','Enable','off');
  182. menuid_cut_time = uimenu(menuid_cut,'Label','Select by Time',...
  183. 'CallBack','[Time,iRR] = selectsignal(Time,iRR,''Time'',ax1);');
  184. menuid_cut_plot = uimenu(menuid_cut,'Label','Select by View',...
  185. 'CallBack','[Time,iRR] = selectsignal(Time,iRR,''Plot'',ax1);');
  186. menuid_cut_original = uimenu(menuid_cut,'Label','Original Tachogram',...
  187. 'CallBack',['iRR = iRR_keeper; Time = Time_keeper;axes(ax1);plot(Time,iRR,''k'');',...
  188. 'axis tight;title(''Tachogram'');xlabel(''Time (s)'');ylabel(''RRi (ms)'')']);
  189. menuuid_viewtime = uimenu(menuid_cut,'Label','Select by View and Time',...
  190. 'CallBack','[Time,iRR] = selectsignal(Time,iRR,''ViewTime'',ax1);');
  191. % Statiotanary Tests.
  192. menuid_stationary = uimenu(menuid_SP,'Label','Stationarity Tests');
  193. menuid_runstest = uimenu(menuid_stationary,'Label','Runs Test','CallBack',...
  194. ['[r,rsup,rinf,result] = run_test(iRR,0.05);']);
  195. menuid_revarr = uimenu(menuid_stationary,'Label','Reverse Arrangements Test',...
  196. 'CallBack','[A,Asup,Ainf,result] = revarr_test(iRR,0.05);');
  197. menuid_figprop = uimenu('Label','Figure Properties');
  198. menuid_figprop_ax1 = uimenu(menuid_figprop,'Label','Axes 1');
  199. menuid_figprop_ax1_xlim = uimenu(menuid_figprop_ax1,'Label','Axis Limits','CallBack',...
  200. ['figproperties(''lim'',ax1)']);
  201. menuid_figprop_ax1_pan = uimenu(menuid_figprop_ax1,'Label','Pan','CallBack',...
  202. ['figproperties(''pan'',ax1)']);
  203. menuid_figprop_ax2 = uimenu(menuid_figprop,'Label','Axes 2');
  204. menuid_figprop_ax2_xlim = uimenu(menuid_figprop_ax2,'Label','Axis Limits','CallBack',...
  205. ['figproperties(''lim'',ax2)']);
  206. menuid_figprop_pan = uimenu(menuid_figprop,'Label','Pan','CallBack',...
  207. ['figproperties(''pan'',ax2)']);
  208. menuid_figprop_zoom = uimenu(menuid_figprop,'Label','Zoom On','CallBack',...
  209. ['figproperties(''zoomon'',ax1)']);
  210. menuid_figprop_zoom = uimenu(menuid_figprop,'Label','Zoom Off','CallBack',...
  211. ['figproperties(''zoomoff'',ax1)']);
  212. %Help
  213. menuid_help = uimenu('Label','Help');