This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Notch fitler algorithm

Hi,

We have downloaded Notch filter algorithm from Google Code.

Basically I do observe in the following function ECG_ProcessCurrSample loops for 8-times.

We have a 9-Channel data, so in that case I have to loop for 9-times or do I need to change any thing else?

Please advise.

Regards,

GSR

  • GSR,

    I am assuming that when you mean change in the loop, you mean you have ensured that all other parameters in the loop align with this change. For example size of arrays Filtered out, WorkingBuf,etc and definition of MAXCHAN in ECGGlobals.h. You need to zero out the initial data in the 9th channel like you may have done for the first 8 channels.

    Once this is done you may need to sanity check to confirm the filtered data on the 9th channel is indeed accurate. I believe that is all you need to change.

    Regards,

    Rahul

  • Hi Rahul,

    We have certain modifications to Filtering code that you have shared.

    Can you please confirm if these changes need to be done or not?

    I have attached the TICode.c contains the Filtering code that you have shared and modifiedCode.c contains the modified changes.

    void ECG_ProcessCurrSample(Int16 *CurrAqsSample, Int16 *FilteredOut)
    {
    
     	static Uint16 bufStart=0, bufCur = FILTERORDER-1, FirstFlag = 1;
    
    	/* Count variable*/
    	Uint16 Cur_Chan;
    	Int16 FiltOut;
    	Int32 FilterOut[2];
    
    	if  ( FirstFlag )
    	{
    		for ( Cur_Chan =0 ; Cur_Chan < FILTERORDER; Cur_Chan++)
    		{
    			WorkingBuff[0][Cur_Chan] = 0;
    			WorkingBuff[1][Cur_Chan] = 0;
    			WorkingBuff[2][Cur_Chan] = 0;
    			WorkingBuff[3][Cur_Chan] = 0;
    			WorkingBuff[4][Cur_Chan] = 0;
    			WorkingBuff[5][Cur_Chan] = 0;
    			WorkingBuff[6][Cur_Chan] = 0;
    			WorkingBuff[7][Cur_Chan] = 0;
    		} 
    		FirstFlag = 0;
    	}
    	for (Cur_Chan = 0; Cur_Chan < 8; Cur_Chan++)
    	{
    
    		/* Store the DC removed value in Working buffer in millivolts range*/
    		WorkingBuff[Cur_Chan][bufCur] = CurrAqsSample[Cur_Chan];
    		ECG_FilterProcess(&WorkingBuff[Cur_Chan][bufCur],CoeffBuf,(Int16*)&FilterOut);
    		/* Store the DC removed value in Working buffer in millivolts range*/
    		WorkingBuff[Cur_Chan][bufStart] = CurrAqsSample[Cur_Chan];
    
    
    		FiltOut = (Int16)(((FilterOut[0] >> 15) & (0x0000FFFF)));
    
    		/* Store the filtered out sample to the LeadInfo buffer*/
    		FilteredOut[Cur_Chan] = FiltOut ;//(CurrOut);
    
    	}
    
    	bufCur++;
    	bufStart++;
    	if ( bufStart  == (FILTERORDER-1))
    	{
    		bufStart=0; 
    		bufCur = FILTERORDER-1;
    	}
    
    	return ;
    }
    
    ECG_FilterProcess_C (Int16 *x1, Int16 *x2, Int16 *y)
    {
    	Int32 acc;
    	Int32 i;
    
    	for (i=0; i < FILTERORDER; i++)
    	{
    		acc = acc + (x1[FILTERORDER-i-1] * x2[i]);
    	}
    
    
    	y[1] = (Int16) (( acc & 0xFFFF0000)>>16); //Extract top 16 bits
    
    	y[0] = (Int16) (acc & 0x0000FFFF);  //Extract bottom 16 bits
    
    }
    

    void ECG_ProcessCurrSample(Int16 *CurrAqsSample, Int16 *FilteredOut)
    {
    
     	static Uint16 bufStart=0, bufCur = FILTERORDER-1, FirstFlag = 1;
    
    	/* Count variable*/
    	Uint16 Cur_Chan;
    	Int16 FiltOut;
    	Int32 FilterOut[2];
    
    	if  ( FirstFlag )
    	{
    		memset (&WorkingBuff[0][0], FALSE, sizeof(WorkingBuff));
    
    		for ( Cur_Chan =0 ; Cur_Chan < FILTERORDER; Cur_Chan++)
    		{
    			WorkingBuff[0][Cur_Chan] = 0;
    			WorkingBuff[1][Cur_Chan] = 0;
    			WorkingBuff[2][Cur_Chan] = 0;
    			WorkingBuff[3][Cur_Chan] = 0;
    			WorkingBuff[4][Cur_Chan] = 0;
    			WorkingBuff[5][Cur_Chan] = 0;
    			WorkingBuff[6][Cur_Chan] = 0;
    			WorkingBuff[7][Cur_Chan] = 0;
    		} 
    		FirstFlag = 0;
    	}
    	for (Cur_Chan = 0; Cur_Chan < 8; Cur_Chan++)
    	{
    
    		/* Store the DC removed value in Working buffer in millivolts range*/
    		WorkingBuff[Cur_Chan][bufCur] = CurrAqsSample[Cur_Chan];
    		ECG_FilterProcess(&WorkingBuff[Cur_Chan][bufCur],CoeffBuf,(Int16*)&FilterOut);
    		/* Store the DC removed value in Working buffer in millivolts range*/
    		WorkingBuff[Cur_Chan][bufStart] = CurrAqsSample[Cur_Chan];
    
    
    		FiltOut = (Int16)(((FilterOut[0] >> 15) & (0x0000FFFF)));
    
    		/* Store the filtered out sample to the LeadInfo buffer*/
    		FilteredOut[Cur_Chan] = FiltOut ;//(CurrOut);
    
    	}
    
    	bufCur++;
    	bufStart++;
    	if ( bufStart  == (FILTERORDER-1))
    	{
    		bufStart=0; 
    		bufCur = FILTERORDER-1;
    	}
    
    	return ;
    }
    
    ECG_FilterProcess_C (Int16 *x1, Int16 *x2, Int16 *y)
    {
    	Int32 acc = 0;
    	Int32 i;
    
    	for (i=0; i < FILTERORDER; i++)
    	{
    		acc = acc + (x1[FILTERORDER-i-1] * x2[i]);
    	}
    
    
    	y[1] = (Int16) (( acc & 0xFFFF0000)>>16); //Extract top 16 bits
    
    	y[0] = (Int16) (acc & 0x0000FFFF);  //Extract bottom 16 bits
    
    }
    

    Thank You & Regards,

    GSR