📄 dso_fft.c
字号:
outcode(0x46);
outdata(lo);
outdata(hi);
outcode(0x42);
outdata(hzdot[temp2]);
temp2++;
outdata(hzdot[temp2]);
temp2++;
d=d+1;
}
}/***************************************************************
*名称:showchin(void)
*描述:显示四个汉字,波,形,正,弦
*参数:
*返回:
****************************************************************/
void showchin(void)
{
showchinese(10,20,CB2A8);
showchinese(27,20,CD0CE);
showchinese(10,140,CC6B5);
showchinese(27,140,CC6D7);
}
/***************************************************************
*名称:initall(void)
*描述:初始化液晶屏
*参数:
*返回:
****************************************************************/
void initall(void)
{
turnoff();
init();
initram();
turnon();
DrawFrame();
DrawGrid();
}
/***************************************************************
*名称:Verline(uchar x ,uchar y)
*描述:在第一层画垂直线
*参数:线的起始坐标(x,y)
*返回:
****************************************************************/
void Verline(uchar x ,uchar y)
{
uchar tempx , tempy ;
uchar i;
tempx = x ;
tempy = 200 - y ;
outcode(0x4f);
for(i=tempy;i<0xc8;i++)WriteD(x,i);
}
/***************************************************************
*名称:pinpu(void)
*描述:在第一层画频谱
*参数:
*返回:
****************************************************************/
void pinpu(uchar x[],uchar N_temp,int N_start)
{
uchar temp ,temp2,temp3;
for(temp=0;temp<N_temp;temp++)
{
temp2 = temp*2+N_start ;
temp3 = (x[temp]) ;//%200
Verline(temp2,temp3);
}
}
/***************************************************************
*名称:uchar adc0804(void)
*描述:AD0804采样一次
*参数:
*返回:采样值
****************************************************************/
uchar adc0804(void)
{
uchar ad_data ;
Adc_cs = 0 ;
lcd_a0 = 1 ;
lcd_wr = 0 ;
lcd_wr = 1 ;
while(Adc_busy) ;
lcd_a0 = 0 ;
ad_data = P0 ;
lcd_a0 = 1 ;
Adc_cs = 1 ;
return ad_data ;
}
/***************************************************************
*名称:Adc_work(void)
*描述:AD0804采样
*参数:
*返回:采样值数组
****************************************************************/
void Adc_work(void)
{
unsigned int k=0 ;
Ram_cs = 0 ;
// Ram_en = 0 ;
while(!Adc_en) ;
xr[0] = adc0804() ;
while(!Adc_en) ;
for(k=0;k<Sam_N;k++)//
{
while(!Adc_en) ;
xr[k] = adc0804() ;
xi[k] = 0 ;
xr_show[k] = xr[k] ;
while(!Adc_en) ;
}
}
/**************************************************************
*名称:Fft(float xr[],float xi[])
*描述:FFT,N=128,M=7
*参数:采样的实序列和序数部分
*返回:
****************************************************************/
void Fft(void)//float xr1[],float xi1[]
{
uchar L,B,J,P,k;
long rPartKB,iPartKB;
ChangeOrder();
for(k=0;k<=127;k=k+2)
{
rPartKB = xr[k+1] ;
xr[k+1]=xr[k]-rPartKB ;
xr[k]=xr[k]+rPartKB;
}
for(L=2;L<=N;L++)//L=1
{
B=1<<(L-1);
for(J=0;J<=B-1;J++)
{
P=J*(1<<(N-L));
for(k=J;k<=Sam_N-1;k+=1<<L)
{
if(P==0)
{
rPartKB=xr[k+B];
iPartKB=xi[k+B];
xr[k+B]=xr[k]-rPartKB;
xi[k+B]=xi[k]-iPartKB;
xr[k]=xr[k]+rPartKB;
xi[k]=xi[k]+iPartKB;
}
else if(P==32)
{
rPartKB=-xi[k+B];
iPartKB=xr[k+B];
xr[k+B]=xr[k]-rPartKB;
xi[k+B]=xi[k]-iPartKB;
xr[k]=xr[k]+rPartKB;
xi[k]=xi[k]+iPartKB;
}
else if(P==64)
{
rPartKB=-xr[k+B];
iPartKB=-xi[k+B];
xr[k+B]=xr[k]-rPartKB;
xi[k+B]=xi[k]-iPartKB;
xr[k]=xr[k]+rPartKB;
xi[k]=xi[k]+iPartKB;
}
else if(P==96)
{
rPartKB=xi[k+B];
iPartKB=-xr[k+B];
xr[k+B]=xr[k]-rPartKB;
xi[k+B]=xi[k]-iPartKB;
xr[k]=xr[k]+rPartKB;
xi[k]=xi[k]+iPartKB;
}
else{
rPartKB=xr[k+B]*rCf[P]-xi[k+B]*iCf[P];
iPartKB=xi[k+B]*rCf[P]+xr[k+B]*iCf[P];
rPartKB=rPartKB>>7;
iPartKB=iPartKB>>7;
xr[k+B]=xr[k]-rPartKB;
xi[k+B]=xi[k]-iPartKB;
xr[k]=xr[k]+rPartKB;
xi[k]=xi[k]+iPartKB;
}
}
}
}
}
/***************************************************************
*名称:ChangeOrder(float xr[],float xi[],int N)
*描述:ChangeOrder
*参数:
*返回:
****************************************************************/
void ChangeOrder()
{
uchar I,J,K;
int T;
long sum_xr = 0 ;
Ram_cs = 0 ;
J=Sam_N>>1;
for(I=1;I<=Sam_N-2;I++)
{
if(I<J)
{
T=xr[I];xr[I]=xr[J];xr[J]=T;
}
K=Sam_N>>1;
while(J>=K)
{
J=J-K;
K=(int)(K/2+0.5);
}
J=J+K;
}
for(I=0;I<Sam_N;I++)
{
sum_xr = sum_xr + xr[I] ;
}
sum_xr = sum_xr>>7 ;
for(I=0;I<Sam_N;I++)
{
xr[I]=xr[I]-sum_xr ;
}
}
/***************************************************************
*名称:Fft_out (float xr[] , float xi[])
*描述:计算频谱分析结果
*参数:fft计算结果的实虚序列
*返回:
****************************************************************/
void Fft_out (void)
{
uchar i ;
for(i=0;i<Sam_N>>1;i=i+1)
{
w[i]=sqrt(xr[i]*xr[i]+xi[i]*xi[i]);
w[i]=w[i]>>6;
}
}
/***************************************************************
*名称:showsine (void)
*描述:显示采样的结果,采64个点但显示256点
*参数:xr_temp[]显示数组,N_temp数组元素个数,
start_add图形开始的x地址,last上次显示最后一个元素
*返回:
****************************************************************/
void showsine (uchar xr_temp[],uchar N_temp,uchar start_add,uchar last)
{
uchar i ;
WriteD(start_add,xr_temp[1]>>1);
vector(start_add-1,last>>1,xr_temp[1]>>1);
for(i=2;i<N_temp;i++)
{
WriteD(i-1+start_add,xr_temp[i]>>1);
vector(i-2+start_add,xr_temp[i-1]>>1,xr_temp[i]>>1);
}
}
void main()
{
uchar temp[32] ,temp_1,temp_2;
uchar i ;
Ram_cs = 1 ;//转向对液晶操作
lcd_a0 = 0 ;
lcd_wr = 1 ;
initall() ;
while(1)
{
Ram_cs = 0 ;
//采样,采128点
P0 = 0xff ;
Adc_work() ;
lcd_a0 = 1 ;//转向对ram操作
lcd_wr = 1 ;
Ram_cs = 0 ;
Fft() ;
Fft_out() ;
for(i=0;i<32;i++)
{
temp[i]=xr_show[i];
}
temp_1=temp[31];
Ram_cs = 1 ;//转向对液晶操作
lcd_a0 = 0 ;
lcd_wr = 1 ;
initram_1();
WriteD(25,temp[0]/2);
showsine(temp,32,25+1,temp[0]);
lcd_a0 = 1 ;//转向对ram操作
lcd_wr = 1 ;
Ram_cs = 0 ;
for(i=32;i<64;i++)
{
temp[i-32]=xr_show[i];
}
temp_2=temp[31];
Ram_cs = 1 ;//转向对液晶操作
lcd_a0 = 0 ;
lcd_wr = 1 ;
showsine(temp,32,25+31,temp_1);
lcd_a0 = 1 ;//转向对ram操作
lcd_wr = 1 ;
Ram_cs = 0 ;
for(i=64;i<96;i++)
{
temp[i-64]=xr_show[i];
}
temp_1=temp[31];
Ram_cs = 1 ;//转向对液晶操作
lcd_a0 = 0 ;
lcd_wr = 1 ;
showsine(temp,32,25+63,temp_2);
lcd_a0 = 1 ;//转向对ram操作
lcd_wr = 1 ;
Ram_cs = 0 ;
for(i=96;i<128;i++)
{
temp[i-96]=xr_show[i];
}
Ram_cs = 1 ;//转向对液晶操作
lcd_a0 = 0 ;
lcd_wr = 1 ;
showsine(temp,32,25+95,temp_1);
showchin() ;
lcd_a0 = 1 ;//转向对ram操作
lcd_wr = 1 ;
Ram_cs = 0 ;
for(i=0;i<32;i++)temp[i]=w[i];
Ram_cs = 1 ;
lcd_a0 = 0 ;
lcd_wr = 1 ;
pinpu(temp,32,25) ;
lcd_a0 = 1 ;//转向对ram操作
lcd_wr = 1 ;
Ram_cs = 0 ;
for(i=0;i<32;i++)temp[i]=w[i+32];
Ram_cs = 1 ;
lcd_a0 = 0 ;
lcd_wr = 1 ;
pinpu(temp,32,32*2+25) ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -