cm_arbitrary_segmentation_fieldtrip_20151002.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. function [new data] = cm_arbitrary_segmentation_fieldtrip_20151002(data,cfg)
  2. %
  3. % data = cm_arbitrary_segmentation_fieldtrip(data,cfg)
  4. %
  5. % arbitrary segmentation of existing fieldtrip data into segments a
  6. % cfg.length seconds
  7. %
  8. % data = fieldtrip data structure
  9. % cfg.length = segment length in seconds
  10. % cfg.n = maximum number of segments
  11. % cfg.type = sampling of segments:
  12. % 'beg' = n segments from the beginning (default)
  13. % 'end' = n segments from the end
  14. % 'bne' = n/2 segments from the beginning and n/2 segments
  15. % from the end
  16. % 'rnd' = n segments randomly selected
  17. % 26.01.2014 THG
  18. % NOTE: reference to original data points is lost
  19. %
  20. % 02.10.2015 THG
  21. % fix: if now .hdr is defined in data, it is ignored
  22. %% set default values
  23. if ~isfield(cfg,'type')
  24. cfg.type = 'beg';
  25. end
  26. %% get possible segments
  27. % segment length in number of data points
  28. n = cfg.length * data.fsample;
  29. % get trials and lengths
  30. for j = 1:length(data.trial)
  31. trl(j,1) = j;
  32. trl(j,2) = length(data.trial{j});
  33. end; clear j
  34. % create all possible segments
  35. cnt = 1;
  36. for j = 1:size(trl,1)
  37. left = trl(j,2); % remaining data poitns in trial
  38. cnt2 = 1;
  39. while left >= n
  40. % get indices
  41. seg(cnt,1) = trl(j,1); % number of trial
  42. seg(cnt,2) = (cnt2-1)*n + 1; % starting data point
  43. seg(cnt,3) = cnt2*n; % ending data point
  44. % update number of remaining data points
  45. left = left - n;
  46. % update counters
  47. cnt = cnt + 1;
  48. cnt2 = cnt2 + 1;
  49. end
  50. % clear variables
  51. clear cnt2 left
  52. end; clear j cnt
  53. %% choose segments
  54. if size(seg,1) <= cfg.n
  55. seg = seg;
  56. elseif strcmp(cfg.type,'beg')
  57. seg = seg(1:cfg.n,:);
  58. elseif strcmp(cfg.type,'end')
  59. seg = seg(end-cfg.n+1:end,:);
  60. elseif strcmp(cfg.type,'bne')
  61. % size of halves
  62. n1 = floor(cfg.n/2);
  63. n2 = length(floor(cfg.n/2) + 1 : cfg.n);
  64. % segments at the beginning
  65. seg1 = seg(1:n1,:);
  66. % segments at the end
  67. seg2 = seg(end-n2+1:end,:);
  68. % chosen segments
  69. seg = [seg1; seg2]; clear seg1 seg2
  70. elseif strcmp(cfg.type,'rnd')
  71. % set random generator seeds
  72. rand('seed',cfg.seed);
  73. randn('seed',cfg.seed);
  74. % select random segments
  75. ind = randperm(size(seg,1)); ind = sortrows(ind(1:cfg.n)');
  76. seg = seg(ind,:);
  77. end
  78. %% get data & update fields
  79. % time vector
  80. tim = [1/data.fsample:1/data.fsample:n/data.fsample];
  81. % get header information
  82. if isfield(data,'hdr')
  83. new.hdr = data.hdr;
  84. end
  85. % get data
  86. for j = 1:size(seg,1)
  87. new.trial{j} = data.trial{seg(j,1)}(:,seg(j,2):seg(j,3));
  88. new.time{j} = tim;
  89. end; clear j
  90. % update fields
  91. new.label = data.label;
  92. new.fsample = data.fsample;