Page MenuHomec4science

adaptiveRpeakDetection.c
No OneTemporary

File Metadata

Created
Wed, May 1, 13:06

adaptiveRpeakDetection.c

#include "adaptiveRpeakDetection.h"
#include "../defines.h"
#include "../profiling/profile.h"
#include "../data/signal.h"
#include "../Morph_filt/morpho_filtering.h"
#include "../Morph_filt/defines_globals.h"
#define N_WINDOWS (int) (2*((ECG_VECTOR_SIZE-LONG_WINDOW)/dim)+1)// Counting the worst case scenario when overlap is dim
RT_L2_DATA int16_t ecg_buff[(LONG_WINDOW+dim)*(NLEADS+1)];
RT_L2_DATA int32_t indicesRpeaks[H_B+1];
RT_L2_DATA rt_perf_t perf[NUM_CORES];
#ifdef MODULE_MF
RT_L2_DATA int32_t *argMF[4];
RT_L2_DATA int32_t buffSize_windowMF;
#endif
#ifdef MODULE_RELEN
RT_L2_DATA int32_t *argRelEn[4];
RT_L2_DATA int32_t start_RelEn = 1;
RT_L2_DATA int32_t buffSize_windowRelEn;
#endif
#ifdef MODULE_RPEAK_REWARD
RT_L2_DATA int32_t *argRW_Rpeak[2];
#endif
RT_L2_DATA int32_t overlap;
RT_L2_DATA int32_t rWindow;
void clearRelEn() {
clearAndResetRelEn();
resetPeakDetection();
}
void adaptiveRpeakDetection(){
int32_t count_sample = 0;
int32_t offset_window = 0;
int32_t offset_ind = LONG_WINDOW/2+1;
int32_t tot_overlap = 0;
overlap = 0;
#ifdef MODULE_MF
int32_t flagMF = 0;
int32_t i_lead = 0;
buffSize_windowMF = LONG_WINDOW+dim;
argMF[0] = (int32_t*) ecg_buff;
argMF[1] = &flagMF;
argMF[2] = &i_lead;
argMF[3] = &buffSize_windowMF;
init_filtering();
#endif
#ifdef MODULE_RELEN
buffSize_windowRelEn = LONG_WINDOW+dim;
argRelEn[0] = (int32_t*) ecg_buff;
argRelEn[1] = (int32_t*) &ecg_buff[(LONG_WINDOW+dim)*NLEADS];
argRelEn[2] = &start_RelEn;
argRelEn[3] = &buffSize_windowRelEn;
clearRelEn();
#endif
#ifdef MODULE_RPEAK_REWARD
int32_t rpeaks_counter = 0;
argRW_Rpeak[0] = (int32_t*) &ecg_buff[LONG_WINDOW+(LONG_WINDOW + dim)*NLEADS];
argRW_Rpeak[1] = indicesRpeaks;
#endif
for(rWindow=0; rWindow<N_WINDOWS; rWindow++)
{
if((rWindow+1)*dim + LONG_WINDOW -1 - tot_overlap >= ECG_VECTOR_SIZE){
return;
}
if(rWindow > 0){
offset_window = LONG_WINDOW;
}
else{
offset_window = 0;
}
if (rWindow > 0) {
for(int32_t i=0; i<overlap; i++) {
#ifdef OVERLAP_MF
ecg_buff[i+offset_window] = ecg_buff[(LONG_WINDOW + dim - overlap + i + offset_window)];
#endif
#ifdef OVERLAP_RELEN
ecg_buff[i + offset_window + (LONG_WINDOW + dim)*NLEADS] = ecg_buff[(2*(LONG_WINDOW + dim)*NLEADS - overlap + i + offset_window)];
#endif
}
}
for(int32_t lead=0; lead<NLEADS; lead++) {
for(int32_t i=overlap + offset_window; i< LONG_WINDOW + dim; i++) {
ecg_buff[i + (dim+LONG_WINDOW)*lead] = ecg_1l[rWindow*dim + i - tot_overlap];
}
}
#ifdef PRINT_DEBUG
printf("start_window: %d end_window: %d overlap: %d\n", offset_window + rWindow*dim - tot_overlap,LONG_WINDOW -1 + (rWindow+1)*dim - tot_overlap,overlap);
#endif
#ifdef MODULE_MF
if (rWindow == 0) {
// Needed to initialize the MF filter properly
for(int32_t lead=0; lead<NLEADS; lead++) {
for(int32_t i=0; i<=OFFSET_MF; i++) {
ecg_buff[i + (dim+LONG_WINDOW)*lead] = 0;
}
}
}
// MF on FC because not enough memory on Cluster
argMF[0] = (int32_t*) &ecg_buff[offset_window + overlap];
buffSize_windowMF = LONG_WINDOW - offset_window + dim-overlap;
for(i_lead = 0; i_lead < NLEADS; i_lead++){
filterWindows(argMF);
}
flagMF=1;
#ifdef PRINT_SIG_MF
for(int32_t sample = offset_window; sample<LONG_WINDOW + dim; sample++) {
printf("%d\n", ecg_buff[sample]);
}
#endif
#endif
#ifdef HWPERF_FULL
profile_start(perf);
#endif
#ifdef MODULE_RELEN
#ifdef HWPERF_MODULES
profile_start(perf);
#endif
#ifdef OVERLAP_MF
clearAndResetRelEn();
start_RelEn = 1;
#endif
#ifdef OVERLAP_RELEN
if(rWindow > 0)
start_RelEn = 0;
argRelEn[0] = (int32_t*) &ecg_buff[offset_window + overlap];
argRelEn[1] = (int32_t*) &ecg_buff[offset_window + (LONG_WINDOW + dim)*NLEADS+overlap];
buffSize_windowRelEn = LONG_WINDOW - offset_window + dim-overlap;
#endif
relEn_w(argRelEn);
#ifdef HWPERF_MODULES
profile_stop(perf);
#endif
#ifdef PRINT_RELEN
for(int32_t sample = offset_window + (LONG_WINDOW + dim)*NLEADS; sample< (LONG_WINDOW + dim)*(NLEADS+1); sample++) {
printf("%d\n", ecg_buff[sample]);
}
#endif
#endif
#ifdef MODULE_RPEAK_REWARD
#ifdef HWPERF_MODULE_RPEAK_REWARD || HWPERF_MODULES
profile_start(perf);
#endif
getPeaks_w(argRW_Rpeak);
rpeaks_counter = 0;
while(indicesRpeaks[rpeaks_counter]!=0) {
rpeaks_counter++;
}
#ifdef HWPERF_MODULE_RPEAK_REWARD || HWPERF_MODULES
profile_stop(perf);
#endif
#ifdef PRINT_RPEAKS
for(int32_t indR=0; indR<rpeaks_counter; indR++) {
printf("%d\n", (indicesRpeaks[indR]) + offset_ind);
}
#endif
#endif
#ifdef ONLY_FIRST_WINDOW //Only for debug
return;
#endif
#ifdef OVERLAP_MF
overlap = LONG_WINDOW + LONG_WINDOW/2 + 1;
#endif
#ifdef OVERLAP_RELEN
overlap = 0;
#endif
tot_overlap += overlap;
offset_ind = offset_ind + dim - tot_overlap;
#ifdef MODULE_RPEAK_REWARD
rpeaks_counter = 0;
for(int32_t ix_rp = 0; ix_rp < H_B+1 ; ix_rp++) {
indicesRpeaks[ix_rp] = 0;
}
#endif
}
}

Event Timeline