⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_nonbios.c

📁 一个FIR的滤波的程序
💻 C
📖 第 1 页 / 共 2 页
字号:


float FIR()
{   
	float fSum;
	fSum=0;
	for ( j=0;j<FIRNUMBER;j++ )
	{
		fSum+=(fXn[j]*fHn[j]);
	}
	return(fSum);
}

float FIR1()
{   
	float fSum;
	fSum=0;
	for ( j=0;j<FIRNUMBER;j++ )
	{
		fSum+=(fXn[j]*fLn[j]);
	}
	return(fSum);
}

float InputWave()
{  int i;
	for ( i=FIRNUMBER-1;i>0;i-- )
		fXn[i]=fXn[i-1];
	fXn[0]=(nGraphBuf1[nAD+20]+nGraphBuf2[nAD+20])/2.0;
	return(fXn[0]);
}

interrupt void  adc_isr(void)
{
  bShowAD=0;
  if(jishu1==1000)
  { jishu1=0;  
    if(jishu==0)
     {led=0;
      jishu=1;
     }
    else
     {led=1;
      jishu=0;
     }
    
   }
  jishu1++;
  ad1 = AdcRegs.ADCRESULT0 >>4;
  ad2 = AdcRegs.ADCRESULT1 >>4;
  ad1 = (ad1*2)/5;
  ad2 = (ad2*2)/5;
  Voltage1[k0++] = ad1;
  Voltage2[k1++] = ad2;
  if ( k0>=ADCNUMBER || k1>=ADCNUMBER )
				{
					
					for ( nAD=0;nAD<k0;nAD++ )
						nGraphBuf1[nAD]=Voltage1[nAD];//+1352;
					for ( nAD=k0;nAD<ADCNUMBER;nAD++ )
						nGraphBuf1[nAD]=Voltage1[k0-1];//+1352;
					for ( nAD=0;nAD<k1;nAD++ )
						nGraphBuf2[nAD]=Voltage2[nAD];//+1352;
					for ( nAD=k1;nAD<ADCNUMBER;nAD++ )
						nGraphBuf2[nAD]=Voltage2[k1-1];//+1352;
					bShowAD=1;
					k0=0; k1=0;
				}
  
  
  if ( bShowAD )
			{
				for ( nAD=0;nAD<1024;nAD++ )	nScreenBuffer[nAD]=0;
				switch ( nModeAD )
				{
					case 0: 
						LCDGraph2(&struGraph,&struGraph1);
						AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)
						break;
					case 1:
						for ( nAD=0;nAD<ADCNUMBER;nAD++ )
						{
							nGraphBuf1[nAD]+=nGraphBuf2[nAD];
							nGraphBuf1[nAD]/=2;
						}
						LCDGraph(&struGraph);
						break;
					case 2:
						nOut=0;nIn=0;
						for ( nAD=0;nAD<256;nAD++ )
						{
							fInput=InputWave();
							fIn[nIn]=fInput;
							nIn++; 
							nIn%=256;
		                    fOutput=FIR();
		                    fOut[nOut]=fOutput;
		                    nGraphBuf3[nAD]=fOut[nOut]/3;
		                    nOut++;
		                    
						}
						LCDGraph(&struGraph);
						break;
					 case 3:
						nOut=0;nIn=0;
						for ( nAD=0;nAD<256;nAD++ )
						{
							fInput=InputWave();
							fIn[nIn]=fInput;
							nIn++; 
							nIn%=256;
		                    fOutput=FIR1();
		                    fOut[nOut]=fOutput;
		                    nGraphBuf3[nAD]=fOut[nOut];
		                    nGraphBuf3[nAD]+=500;
		                    nGraphBuf3[nAD]*=2;
		                    nOut++;		                    
						}
						LCDGraph(&struGraph);
						break;
					 case 5:
					    nOut=0;nIn=0;
						for ( nAD=0;nAD<256;nAD++ )
						{
							fInput=InputWave();
							fIn[nIn]=fInput;
							nIn++; 
							nIn%=256;
		                    fOutput=FIR();
		                    fOut[nOut]=fOutput;
		                    //nGraphBuf3[nAD]=fOut[nOut]/3;
		                    nOut++;
		                    
						}
					    for ( nAD=0;nAD<128;nAD++ )                                      
                        {                                                                
	                       fDataR[nAD]=fOut[nAD+30]; 
	                       fDataI[nAD]=0; w[nAD]=0;                                 
	                                                         
                         }                                                                
                        FFT(fDataR,fDataI);                                              
                        LCDGraph(&struGraph);                                            
                        break; 
                      case 6:
					    nOut=0;nIn=0;
						for ( nAD=0;nAD<256;nAD++ )
						{
							fInput=InputWave();
							fIn[nIn]=fInput;
							nIn++; 
							nIn%=256;
		                    fOutput=FIR1();
		                    fOut[nOut]=fOutput;
		                    //nGraphBuf3[nAD]=fOut[nOut];
		                    //nGraphBuf3[nAD]+=500;
		                    //nGraphBuf3[nAD]*=2;
		                    nOut++;		                    
						}
					    for ( nAD=0;nAD<128;nAD++ )                                      
                        {                                                                
	                       fDataR[nAD]=fOut[nAD+30]; 
	                       fDataI[nAD]=0; w[nAD]=0;                                 
	                                                         
                         }                                                                
                        FFT(fDataR,fDataI);                                              
                        LCDGraph(&struGraph);                                            
                        break;                                                           
                                                          

				}
			}

  // If 40 conversions have been logged, start over
  if(ConversionCount == 149) 
  {
     ConversionCount = 0;
  }
  else ConversionCount++;

  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
  //if(jishu==1) AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0;  // Enable SEQ1 interrupt (every EOS)
  if(a==0)
  { DA_DATA_L=0xff;                   //第一通道da数据输出量低8位
    DA_DATA_H=0x0f|DA_CHN1;    //第一通道da数据输出量高8位和通道号1
    DA_CTL=0;
    a=1;
  }
  else
  {
    DA_DATA_L=0x0;                   //第一通道da数据输出量低8位
    DA_DATA_H=0x0|DA_CHN1;    //第一通道da数据输出量高8位和通道号1
    DA_CTL=0;
    a=0;
  }
  return;
}

void Delay(unsigned int nDelay)
{
	int ii,jj,kk=0;
	for ( ii=0;ii<nDelay;ii++ )
	{
		for ( jj=0;jj<512;jj++ )
		{
			//RefreshLEDArray();
			kk++;
		}
	}
}

void LCDPutString(unsigned int *pData,int x,int y,unsigned int nCharNumber,unsigned color)
{
	int i,j,l;
	unsigned int k,mcolor;
	
	for ( l=0;l<nCharNumber;l++ )
		for ( i=0;i<8;i++ )
		{
			k=1;
			for ( j=0;j<16;j++,k<<=1 )
			{
				if ( color==2 )	mcolor=2;
				else
				{
					mcolor=( pData[l*8+i]&k )?(1):(0);
					if ( color==0 )	mcolor=1-mcolor;
				}
				LCDPutPixel(x+l*8+i,y-j,mcolor);
			}
		}
	LCDRefreshScreen();
}


void ShowTitle()
{
	LCDPutCString(str1,CCXRTCX,CCYRTCX,4,1);
	//Delay(LCDDELAY);
	LCDPutCString(str2+32,CCXJXSYX,CCYJXSYX,5,1);
	//Delay(LCDDELAY);
	LCDPutCString(str12,CCXSD,CCYSD,2,1);

	LCDPutCString(str4,CCXFMQ,CCYFMQ,3,1);
	LCDPutCString(str5,CCXJP,CCYJP,2,1);
	LCDPutCString(str8,CCXAD,CCYAD,6,1);
//	LCDPutString(str8,CCXAD,CCYAD,2,1);
	LCDPutString(str3,CCXLED,CCYLED,3,1);
	LCDPutCString(str9,CCXZL,CCYZL,2,1);
	LCDPutCString(str6,CCXDJ1,CCYDJ1,2,1);
	LCDPutCString(str10,CCXBJ,CCYBJ,2,1);
	LCDPutCString(str6,CCXDJ2,CCYDJ2,2,1);
}

void RefreshLEDArray()
{
	int i;
	for ( i=0;i<8;i++ )
	{
		*(int *)0x108000=ledx[i];
		_Delay(1);
		*(int *)0x108005=ledbuf[i];
		_Delay(1);
	}
}

void SetLEDArray(int nNumber)
{
	int i;
	for ( i=0;i<8;i++ )
		ledbuf[i]=~ledkey[nNumber][7-i];
}

char ConvertScanToChar(unsigned char cScanCode)
{
	char cReturn;
	
	cReturn=0;
	switch ( cScanCode )
	{
		case SCANCODE_0: cReturn='0'; break;
		case SCANCODE_1: cReturn='1'; break;
		case SCANCODE_2: cReturn='2'; break;
		case SCANCODE_3: cReturn='3'; break;
		case SCANCODE_4: cReturn='4'; break;
		case SCANCODE_5: cReturn='5'; break;
		case SCANCODE_6: cReturn='6'; break;
		case SCANCODE_7: cReturn='7'; break;
		case SCANCODE_8: cReturn='8'; break;
		case SCANCODE_9: cReturn='9'; break;
		case SCANCODE_Plus: cReturn='+'; break;
		case SCANCODE_Minus: cReturn='-'; break;
	}
	 
	return cReturn;
}

                                                                                                                                                                                                                  
void FFT(float dataR[SOUNDBUFFERLENGTH],float dataI[SOUNDBUFFERLENGTH])                                                                                                                                           
{                                                                                                                                                                                                                 
	int x0,x1,x2,x3,x4,x5,x6,xx;                                                                                                                                                                              
	int i,j,k,b,p,L;                                                                                                                                                                                          
	float TR,TI,temp;                                                                                                                                                                                         
	                                                                                                                                                                                                          
	/********** following code invert sequence ************/                                                                                                                                                  
	for ( i=0;i<SOUNDBUFFERLENGTH;i++ )                                                                                                                                                                       
	{                                                                                                                                                                                                         
		x0=x1=x2=x3=x4=x5=x6=0;                                                                                                                                                                           
		x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;                                                                                            
		xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;                                                                                                                                                           
			dataI[xx]=dataR[i];                                                                                                                                                                       
	}                                                                                                                                                                                                         
	for ( i=0;i<SOUNDBUFFERLENGTH;i++ )                                                                                                                                                                       
	{                                                                                                                                                                                                         
		dataR[i]=dataI[i]; dataI[i]=0;                                                                                                                                                                    
	}                                                                                                                                                                                                         
                                                                                                                                                                                                                  
	/************** following code FFT *******************/                                                                                                                                                   
	for ( L=1;L<=7;L++ )                                                                                                                                                                                      
	{ /* for(1) */                                                                                                                                                                                            
		b=1; i=L-1;                                                                                                                                                                                       
		while ( i>0 )                                                                                                                                                                                     
		{                                                                                                                                                                                                 
			b=b*2; i--;                                                                                                                                                                               
		} /* b= 2^(L-1) */                                                                                                                                                                                
		for ( j=0;j<=b-1;j++ ) /* for (2) */                                                                                                                                                              
		{                                                                                                                                                                                                 
			p=1; i=7-L;                                                                                                                                                                               
			while ( i>0 ) /* p=pow(2,7-L)*j; */                                                                                                                                                       
			{                                                                                                                                                                                         
				p=p*2; i--;                                                                                                                                                                       
			}                                                                                                                                                                                         
			p=p*j;                                                                                                                                                                                    
			for ( k=j;k<128;k=k+2*b ) /* for (3) */                                                                                                                                                   
			{                                                                                                                                                                                         
				TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];                                                                                                                                        
				dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];                                                                                                                    
				dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];                                                                                                                    
				dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];                                                                                                                        
				dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];                                                                                                                              
			} /* END for (3) */                                                                                                                                                                       
		} /* END for (2) */                                                                                                                                                                               
	} /* END for (1) */                                                                                                                                                                                       
	for ( i=0;i<SOUNDBUFFERLENGTH/2;i++ )                                                                                                                                                                     
	{                                                                                                                                                                                                         
		temp=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);                                                                                                                                                   
		w[i]=temp/SOUNDBUFFERLENGTH/2;                                                                                                                                                                    
	}                                                                                                                                                                                                         
	w[0]=w[0]/2;                                                                                                                                                                                              
} /* END FFT */                                                                                                                                                                                                   
/*** end of file *****************************************************/                                                                                                                                           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -