📄 main_nonbios.c
字号:
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 + -