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

#include "So_Chen_detect.h"
SignalPoint So_Chen_detect(SignalPoint signal,int initial_point,float threshold_parameter,float filter_parameter)
{
/* init slop window pool, size = 5 */
if(signal_window_count < signal_window_size){
signal_window[signal_window_count%signal_window_size] = signal;
++signal_window_count;
SignalPoint value;
value.index = -1;
return value;
}
else{
signal_window[signal_window_count%signal_window_size] = signal;
++signal_window_count;
SignalPoint value;
}
/* calculate slop */
uint32_t idx_for_slop = signal_window_count-2;
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) );
slop.index = signal_window[idx_for_slop%signal_window_size].index;
/* init maxi */
if(!so_chen_init_flag){
if(!maxi_init){
max.value = 0;
max.index = -1;
maxi = slop.value;
maxi_init = true;
}
++init_count;
if(init_count > initial_point){
so_chen_init_flag = true;
/* calculate slop threshold */
slop_threshold = threshold_parameter / 16.0f * maxi;
}
if(slop.value > maxi){
maxi = slop.value;
}
SignalPoint value;
value.index = -1;
return value;
}
/* detect QRS complex on set */
if(qrs_on_set_flag && (signal_window_count - last_point > enhanced_point)){
if(!max_init){
max = signal_window[(idx_for_slop)%signal_window_size];
max_init = true;
}
if(signal_window[(idx_for_slop)%signal_window_size].value > max.value){
max = signal_window[(idx_for_slop)%signal_window_size];
max_slop = slop;
}
else if(signal_window[(idx_for_slop)%signal_window_size].value < max.value){
last_point = signal_window_count;
qrs_on_set_flag = false;
max_init = false;
maxi = ((abs(max.value - qrs_onset_point.value) - maxi) / filter_parameter) + maxi;
slop_threshold = threshold_parameter / 16.0f * maxi;
last_maxi = maxi;
return max;
}
}
else{
if(slop.value > slop_threshold){
++qrs_on_set_count;
}
else if(qrs_on_set_count){
qrs_on_set_count = 0;
}
if(qrs_on_set_count >= 2){ // is QRS complex on set
qrs_on_set_flag = true;
qrs_on_set_count = 0;
qrs_onset_idx = idx_for_slop;
qrs_onset_point = signal;
}
else if((signal_window_count - last_point > enhanced_point * 2) && (slop_threshold > 0)){ //decay threshold
slop_threshold -= slop.value;
if((signal_window_count - last_point > SAMPLING_RATE * 3)){ //threshold oscillating
slop_threshold -= ((signal_window_count - last_point) >> (int)threshold_parameter);
}
}
}
SignalPoint value;
value.index = -1;
return value;
}