scp-decode.cpp
来自「c++编写的用于生物信号处理的软件库」· C++ 代码 · 共 2,178 行 · 第 1/5 页
CPP
2,178 行
{ if((data.flag_Huffman=(U_int_M*)mymalloc(sizeof(U_int_M)*(nt+1)))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } data.flag_Huffman[0]=nt; filepos = iftell(in); //FGETPOS(in,&filepos); for(i=1;i<=data.flag_Huffman[0];i++) { ReadByte(data.flag_Huffman[i]); ns+=data.flag_Huffman[i]; Skip(9*data.flag_Huffman[i]); } ifseek(in,filepos COMPAT,0); if((ns*9)>dim || !ns) { fprintf(stderr,"Cannot read data!!!"); exit(2); } if(ns!=0 && (data.t_Huffman=(table_H*)mymalloc(sizeof(table_H)*ns))==NULL) //array of 5 columns and ns rows { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } pos=0; for(j=0;j<data.flag_Huffman[0];j++) { Skip(2); for(i=0;i<data.flag_Huffman[j+1];i++) { ReadByte(data.t_Huffman[pos+i].bit_prefix); ReadByte(data.t_Huffman[pos+i].bit_code); ReadByte(data.t_Huffman[pos+i].TMS); ReadByte(data.t_Huffman[pos+i].base_value); ReadByte(data.t_Huffman[pos+i].base_code); } pos+=data.flag_Huffman[j+1]*9; // by E.C. may 2004 } } else { if((data.flag_Huffman=(U_int_M*)mymalloc(sizeof(U_int_M)*2))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } data.flag_Huffman[0]=1; data.flag_Huffman[1]=19; //number of rows of the default Huffman table if((data.t_Huffman=(table_H*)mymalloc(sizeof(table_H)*data.flag_Huffman[1]))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } InitHuffman(data.t_Huffman); }}//end section_2//______________________________________________________________________________// section 3//______________________________________________________________________________void section_3(pointer_section info_sections,DATA_DECODE &data, int_S version){ U_int_S val, mask=0x1, i; int_S version_loc; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version_loc); ReadByte(data.flag_lead.number); ReadByte(val); if(val&mask) data.flag_lead.subtraction=1; else data.flag_lead.subtraction=0; mask<<=2; if(val&mask) data.flag_lead.all_simultaneously=1; else data.flag_lead.all_simultaneously=0; data.flag_lead.number_simultaneously=(val&0xF8)>>3; if (version==11) // by E.C. may 2004 ESAOTE data.flag_lead.number_simultaneously=8; if(data.flag_lead.number!=0 && (data.data_lead=(lead*)mymalloc(sizeof(lead)*data.flag_lead.number))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i<data.flag_lead.number;i++) { ReadByte(data.data_lead[i].start); ReadByte(data.data_lead[i].end); ReadByte(data.data_lead[i].ID); if(data.data_lead[i].ID>85) data.data_lead[i].ID=0; }}//end section_3//______________________________________________________________________________// section 4//______________________________________________________________________________void section_4(pointer_section info_sections,DATA_DECODE &data,int_S version){ U_int_M i; int_S version_loc; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version_loc); ReadByte(data.flag_BdR0.length); ReadByte(data.flag_BdR0.fcM); ReadByte(data.flag_Res.number); if(data.flag_Res.bimodal || data.flag_lead.subtraction) // by E.C. may 2004 { if(data.flag_Res.number!=0 && (data.data_subtraction=(Subtraction_Zone*)mymalloc(sizeof(Subtraction_Zone)*data.flag_Res.number))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i<data.flag_Res.number;i++) { ReadByte(data.data_subtraction[i].beat_type); ReadByte(data.data_subtraction[i].SB); ReadByte(data.data_subtraction[i].fc); ReadByte(data.data_subtraction[i].SE); }//end for }//end if if(data.flag_Res.bimodal || data.flag_lead.subtraction) // by E.C. may 2004 { if(data.flag_Res.number!=0 && (data.data_protected=(Protected_Area*)mymalloc(sizeof(Protected_Area)*data.flag_Res.number))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i<data.flag_Res.number;i++) if ((version==10) || (version==11)) { // by E.C. may 2004 SCP 1.0 no data data.data_protected[i].QB=data.data_subtraction[i].SB; data.data_protected[i].QE=data.data_subtraction[i].SE; } else { ReadByte(data.data_protected[i].QB); ReadByte(data.data_protected[i].QE); }//end if/for }//end if}//end section_4//______________________________________________________________________________// section 5//______________________________________________________________________________bool section_5(pointer_section info_sections,DATA_DECODE &data, bool sez2){ U_int_M i; U_int_L t, dim; U_int_M value; int_S version; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version); ReadByte(data.flag_BdR0.AVM); ReadByte(data.flag_BdR0.STM); ReadByte(data.flag_BdR0.encoding); if(data.flag_BdR0.encoding>2) data.flag_BdR0.encoding=0; Skip(1); if(data.flag_lead.number!=0 && (data.length_BdR0=(U_int_M*)mymalloc(sizeof(U_int_M)*data.flag_lead.number))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } dim=0; for(i=0;i<data.flag_lead.number;i++) { ReadByte(data.length_BdR0[i]); //number of samples (2 bytes each) for each lead dim+=data.length_BdR0[i]; } if (data.flag_BdR0.length==0) return false; // by E.C. 12/09/2007 if(sez2) { data.flag_BdR0.number_samples=(U_int_L)data.flag_BdR0.length*1000L/(U_int_L)data.flag_BdR0.STM; //number di campioni per elettrodo dim*=sizeof(U_int_S); if(dim!=0 && (data.samples_BdR0=(U_int_S*)mymalloc(dim))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } ifread(data.samples_BdR0,sizeof(U_int_S),dim,in); } else { data.flag_BdR0.number_samples=dim/(sizeof(int_M)*data.flag_lead.number); //number of samples per lead dim>>=1; dim*=sizeof(int_L); if(dim!=0 && (data.Median=(int_L*)mymalloc(dim))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } dim/=sizeof(int_L); for(t=0;t<dim;t++) { ReadByte(value); data.Median[t]=value; if(value>0x7FFF) data.Median[t]|=0xFFFF0000; } } return true;}//end section_5//______________________________________________________________________________// section 6//______________________________________________________________________________void section_6(pointer_section info_sections,DATA_DECODE &data, bool sez2){ U_int_M i; U_int_L t, dim; U_int_M value; int_S version; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version); ReadByte(data.flag_Res.AVM); ReadByte(data.flag_Res.STM); ReadByte(data.flag_Res.encoding); if(data.flag_Res.encoding>2) data.flag_Res.encoding=0; Skip(1); if(data.flag_lead.number!=0 && (data.length_Res=(U_int_M*)mymalloc(sizeof(U_int_M)*data.flag_lead.number))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } dim=0; for(i=0;i<data.flag_lead.number;i++) { ReadByte(data.length_Res[i]); //number of bytes for each lead dim+=data.length_Res[i]; } if(sez2) { data.flag_Res.number_samples=data.data_lead[1].end-data.data_lead[1].start+1; //number of samples after interpolation dim*=sizeof(U_int_S); if(dim!=0 && (data.samples_Res=(U_int_S*)mymalloc(dim))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } ifread(data.samples_Res,sizeof(U_int_S),dim,in); } else { data.flag_Res.number_samples=dim/(sizeof(int_M)*data.flag_lead.number); //number of samples per lead dim>>=1; dim*=sizeof(int_L); if(dim!=0 && (data.Residual=(int_L*)mymalloc(dim))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } dim/=sizeof(int_L); for(t=0;t<dim;t++) { ReadByte(value); data.Residual[t]=value; if(value>0x7FFF) data.Residual[t]|=0xFFFF0000; } }}//end section_6#ifdef WITH_OBSOLETE_PARTS//______________________________________________________________________________// section 7//______________________________________________________________________________void section_7(pointer_section info_sections ,DATA_RECORD &data, int_S version){ U_int_M i, j, dim; U_int_S lung; //fpos_t filepos; long filepos; int_S version_loc; int_L length_eval; _COUNT_BYTE=info_sections.index; ifseek(in,info_sections.index-1,0); ID_section(info_sections.index, version_loc); ReadByte(data.data_global.number); //each value should be checked in _special! ReadByte(data.data_global.number_spike); if (version==11) ReadByte(data.data_global.number_spike); // by E.C. may 2004 x ESAOTE!! This is an implementation error, for sure! ReadByte(data.data_global.average_RR); ReadByte(data.data_global.average_PP); if(Look(_special,0,3,data.data_global.number)<0) { if(data.data_global.number!=0 && (data.data_BdR=(BdR_measurement*)mymalloc(sizeof(BdR_measurement)*data.data_global.number))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i<data.data_global.number;i++) { ReadByte(data.data_BdR[i].P_onset); ReadByte(data.data_BdR[i].P_offset); ReadByte(data.data_BdR[i].QRS_onset); ReadByte(data.data_BdR[i].QRS_offset); ReadByte(data.data_BdR[i].T_offset); ReadByte(data.data_BdR[i].P_axis); ReadByte(data.data_BdR[i].QRS_axis); ReadByte(data.data_BdR[i].T_axis); }//end for } if(Look(_special,0,3,data.data_global.number_spike)<0) { if(data.data_global.number_spike!=0 && (data.data_spike=(spike*)mymalloc(sizeof(spike)*data.data_global.number_spike))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } //spike time is in ms from the start of recording //amplitude is in signed uV for(i=0;i<data.data_global.number_spike;i++) { ReadByte(data.data_spike[i].time); ReadByte(data.data_spike[i].amplitude); }//end for for(i=0;i<data.data_global.number_spike;i++) { ReadByte(data.data_spike[i].type); if(data.data_spike[i].type>3) data.data_spike[i].type=0; ReadByte(data.data_spike[i].source); if(data.data_spike[i].source>2) data.data_spike[i].source=0; ReadByte(data.data_spike[i].index); ReadByte(data.data_spike[i].pulse_width); }//end for }//end if if (version<13) { // by E.C. may 2004 CARDIOLINE & ESAOTE missing!! if ((data.data_global.average_RR>0) && (data.data_global.average_RR<10000)) data.data_global.ventricular_rate=60000.0/data.data_global.average_RR+0.5; return; }// Insert by F.C. if (version>=13) { length_eval = 16 + 6 + data.data_global.number * 16 + data.data_global.number_spike * 4 + data.data_global.number_spike * 6; if (length_eval >= info_sections.length) return; }// End of F.C. insertion ReadByte(data.data_global.number_QRS); if (data.data_global.number_QRS==29999) return; // by E.C. 12/09/2007 if(Look(_special,0,3,data.data_global.number_QRS)<0) { filepos = iftell(in); //FGETPOS(in,&filepos); //necessary for ESAOTE and CARDIOLINE test files dim=info_sections.index+info_sections.length-filepos COMPAT+1; if(data.data_global.number_QRS>dim) { fprintf(stderr,"Error: Cannot extract these data!!!"); exit(2); //necessary for ESAOTE and CARDIOLINE test files } if(data.data_global.number_QRS!=0 && (data.type_BdR=(U_int_S*)mymalloc(sizeof(U_int_S)*data.data_global.number_QRS))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i<data.data_global.number_QRS;i++) ReadByte(data.type_BdR[i]); }// Insert by F.C. if (version>=13) { length_eval += (2 + data.data_global.number_QRS); if (length_eval >= info_sections.length) return; }// End of F.C. insertion ReadByte(data.data_global.ventricular_rate); ReadByte(data.data_global.atrial_rate); ReadByte(data.data_global.QT_corrected); ReadByte(data.data_global.formula_type); if(data.data_global.formula_type>2) data.data_global.formula_type=0; ReadByte(data.data_global.number_tag); if(data.data_global.number_tag) { data.data_global.number_tag-=2; data.data_global.number_tag/=7; // tag number //warnig: this calculation is relative to the structure of STANDARD v2.0! if(data.data_global.number_tag!=0 && (data.data_additional=(additional_measurement*)mymalloc(sizeof(additional_measurement)*data.data_global.number_tag))==NULL) { fprintf(stderr,"Not enough memory"); // no, exit // exit(2); } for(i=0;i<data.data_global.number_tag;i++) { ReadByte(data.data_additional[i].ID); if(data.data_additional[i].ID==255) break; if(data.data_additional[i].ID>3) data.data_additional[i].ID=4; ReadByte(lung); if(lung) { //warning:(255 is undefined) for(j=0;j<5;j++) ReadByte(data.data_additional[i].byte[j]); }//end if }//end for }//end if}//end section_7//______________________________________________________________________________// section 8//______________________________________________________________________________void section_8(pointer_section info_sections,DATA_INFO &data){ U_int_S m, g, h, s, i; U_int_M a, num, dim; char dates[18], temp[18], hour[9
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?