You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.8 KiB

  1. #include "So_Chen_detect.h"
  2. SignalPoint So_Chen_detect(SignalPoint signal,int initial_point,float threshold_parameter,float filter_parameter)
  3. {
  4. /* init slop window pool, size = 5 */
  5. if(signal_window_count < signal_window_size){
  6. signal_window[signal_window_count%signal_window_size] = signal;
  7. ++signal_window_count;
  8. SignalPoint value;
  9. value.index = -1;
  10. return value;
  11. }
  12. else{
  13. signal_window[signal_window_count%signal_window_size] = signal;
  14. ++signal_window_count;
  15. SignalPoint value;
  16. }
  17. /* calculate slop */
  18. uint32_t idx_for_slop = signal_window_count-2;
  19. slop.value = ( (-2.0f * signal_window[(idx_for_slop-2)%signal_window_size].value) - signal_window[(idx_for_slop-1)%signal_window_size].value + signal_window[(idx_for_slop+1)%signal_window_size].value + (2.0f * signal_window[(idx_for_slop+2)%signal_window_size].value) );
  20. slop.index = signal_window[idx_for_slop%signal_window_size].index;
  21. /* init maxi */
  22. if(!so_chen_init_flag){
  23. if(!maxi_init){
  24. max.value = 0;
  25. max.index = -1;
  26. maxi = slop.value;
  27. maxi_init = true;
  28. }
  29. ++init_count;
  30. if(init_count > initial_point){
  31. so_chen_init_flag = true;
  32. /* calculate slop threshold */
  33. slop_threshold = threshold_parameter / 16.0f * maxi;
  34. }
  35. if(slop.value > maxi){
  36. maxi = slop.value;
  37. }
  38. SignalPoint value;
  39. value.index = -1;
  40. return value;
  41. }
  42. /* detect QRS complex on set */
  43. if(qrs_on_set_flag && (signal_window_count - last_point > enhanced_point)){
  44. if(!max_init){
  45. max = signal_window[(idx_for_slop)%signal_window_size];
  46. max_init = true;
  47. }
  48. if(signal_window[(idx_for_slop)%signal_window_size].value > max.value){
  49. max = signal_window[(idx_for_slop)%signal_window_size];
  50. max_slop = slop;
  51. }
  52. else if(signal_window[(idx_for_slop)%signal_window_size].value < max.value){
  53. last_point = signal_window_count;
  54. qrs_on_set_flag = false;
  55. max_init = false;
  56. maxi = ((abs(max.value - qrs_onset_point.value) - maxi) / filter_parameter) + maxi;
  57. slop_threshold = threshold_parameter / 16.0f * maxi;
  58. last_maxi = maxi;
  59. return max;
  60. }
  61. }
  62. else{
  63. if(slop.value > slop_threshold){
  64. ++qrs_on_set_count;
  65. }
  66. else if(qrs_on_set_count){
  67. qrs_on_set_count = 0;
  68. }
  69. if(qrs_on_set_count >= 2){ // is QRS complex on set
  70. qrs_on_set_flag = true;
  71. qrs_on_set_count = 0;
  72. qrs_onset_idx = idx_for_slop;
  73. qrs_onset_point = signal;
  74. }
  75. else if((signal_window_count - last_point > enhanced_point * 2) && (slop_threshold > 0)){ //decay threshold
  76. slop_threshold -= slop.value;
  77. if((signal_window_count - last_point > SAMPLING_RATE * 3)){ //threshold oscillating
  78. slop_threshold -= ((signal_window_count - last_point) >> (int)threshold_parameter);
  79. }
  80. }
  81. }
  82. SignalPoint value;
  83. value.index = -1;
  84. return value;
  85. }