fft.c

来自「用单片机做的音频功率谱分析」· C语言 代码 · 共 816 行 · 第 1/2 页

C
816
字号
	temp7 = (aa) % 10;
	LCD_WData(temp1+48);
	LCD_WData(temp2+48);
	LCD_WData(temp3+48);
	LCD_WData(temp4+48);
	LCD_WData(temp5+48);
	LCD_WData(temp6+48);
	LCD_WData(temp7+48);
}

void LCD_DisFreNo(int a)
{
	uchar temp1 = 0;
	uchar temp2 = 0;
	uchar temp3 = 0;
	int aa = a;
	temp1 = (aa)/100;
	temp2 = (aa - temp1*100)/10;
	temp3 = (aa) % 10;
//	if(temp1 == 0)
	LCD_WData(temp1+48);
//		if(temp2 != 0)
	LCD_WData(temp2+48);
	LCD_WData(temp3+48);
}

void LCD_DisFloat(float a)
{
	uchar temp1 = 0;
	uchar temp2 = 0;
	uchar temp3 = 0;
	uchar temp4 = 0;
	uchar temp5 = 0;
	uchar temp6 = 0;
	uchar temp7 = 0;
	uchar temp8 = 0;
	float bb = a;
	unsigned long aa = (long)(a);
	temp1 = (aa)/100;
	temp2 = (aa - temp1*100)/10;
	//temp3 = (aa - temp1*1000 - temp2*100)/10;
	temp4 = (aa) % 10;
	temp5 = (long)(bb*10)%10;
	temp6 = (long)(bb*100)%10;
	temp7 = (long)(bb*1000)%10;
	temp8 = (long)(bb*10000)%10;
	
//	if(temp1 != 0)
		LCD_WData(temp1+48);
//	if(temp2 != 0)
		LCD_WData(temp2+48);
	LCD_WData(temp4+48);
//	LCD_WData(temp4+48);
	LCD_WString(".");
	LCD_WData(temp5+48);
	LCD_WData(temp6+48);
	LCD_WData(temp7+48);
	LCD_WData(temp8+48);
}

void time1_sample() interrupt 1
{
	if(Sample_cnt < 256)
	{
		DataHigh = AD574_8;
		Ad8[Sample_cnt] = DataHigh;
		DataLow = AD574_4;
		Ad4[Sample_cnt] = DataLow;
		AD574_START = 0x00;
		Sample_cnt ++;
	}
	else
	{
		//EA = 0;
		ET0 = 0;
		Sample_cnt = 0; 
		UnFinish = 0;
	}
} 

void key_int1_pause() interrupt 0
{
/*	uchar pause = 0;
	if(!P32)
	for(pause = 0; pause < 255; pause++){;}
	
	if(P32 == 0)
	{
	}
*/
//		if(key_pause == 0)
			key_pause = 1;
//		else if(key_pause == 1)
//			key_pause = 0;
		//LCD_WPos(1,1);
		//LCD_WString("中断了");
		//while(1);

}

void key_process()
{
	uint i = 0;
	int j = 0;
	LCD_ClearLCD();
	LCD_WPos(1,2);
	LCD_WString("请按上、下键");
	LCD_WPos(2,1);
	LCD_WString("浏览各频率功率值");
	LCD_WPos(4,1);
	LCD_WString("失真度:");
	LCD_DisFloat(err);

	while(key_pause == 1)
	{
		//--------上键----------
		while(k_up == 0)
		{
			for(i = 0; i < 30000; i++){;}//延时、消抖
			if(k_up == 0 )			    //&& k_down == 1
			{	
				LCD_ClearLCD();
				LCD_WPos(1,1);
				LCD_WString("n 频率  功率/mW");
				//第二行
				key_dis_i++;
				if(key_dis_i >= 98)
				{
					key_dis_i = 0;
				}
				LCD_WPos(2,1);
				LCD_DisFreNo(key_dis_i+1);
				LCD_WString(")");
				LCD_DisFreNo(data_nm[key_dis_i]);
				LCD_WString(":");
				LCD_DisFloat(re[key_dis_i]);
				//第三行
				//key_dis_i++;
				LCD_WPos(3,1);
				LCD_DisFreNo(key_dis_i+2);
				LCD_WString(")");
				LCD_DisFreNo(data_nm[key_dis_i+1]);
				LCD_WString(":");
				LCD_DisFloat(re[key_dis_i+1]);
				//第四行
				//key_dis_i++;
				LCD_WPos(4,1);
				LCD_DisFreNo(key_dis_i+3);
				LCD_WString(")");
				LCD_DisFreNo(data_nm[key_dis_i+2]);
				LCD_WString(":");
				LCD_DisFloat(re[key_dis_i+2]);
			}
			else{ break;	}
		}
		//---------下键-----------
		while(k_down == 0)
		{
			for(i = 0; i < 30000; i++){;}//延时、消抖
			if(k_down == 0)			    // && k_up == 1
			{	
				LCD_ClearLCD();
				LCD_WPos(1,1);
				LCD_WString("频率    功率/mW");
				key_dis_i -= 2;
				//第二行
				key_dis_i++;
				if(key_dis_i < 0)
				{
					key_dis_i = 97;
				}
				LCD_WPos(2,1);
				LCD_DisFreNo(key_dis_i+1);
				LCD_WString(")");
				LCD_DisFreNo(data_nm[key_dis_i]);
				LCD_WString(":");
				LCD_DisFloat(re[key_dis_i]);
				//第三行
				//key_dis_i++;
				if(key_dis_i < 0)
				{
					LCD_WPos(3,1);
					LCD_WString("  到达频率下限");
					LCD_WPos(4,1);
				}
				else
				{
					LCD_WPos(3,1);
					LCD_DisFreNo(key_dis_i+2);
					LCD_WString(")");
					LCD_DisFreNo(data_nm[key_dis_i+1]);
					LCD_WString(":");
					LCD_DisFloat(re[key_dis_i+1]);
				}
				//第四行
				//key_dis_i++;
				if(key_dis_i < 0)
				{
					LCD_WPos(4,1);
					LCD_WString("  到达频率下限");
				}
				else
				{
					LCD_WPos(4,1);
					LCD_DisFreNo(key_dis_i+3);
					LCD_WString(")");
					LCD_DisFreNo(data_nm[key_dis_i+2]);
					LCD_WString(":");
					LCD_DisFloat(re[key_dis_i+2]);
				}
			}
			else{ break;	}
		}
		//------------频谱键-------------- 
		while(k_spec == 0)
		{
			for(i = 0; i < 30000; i++){;}//延时、消抖
			if(k_spec == 0)
			{	
				key_pause = 0;
			}
			else{ break;	}

		}
		while(k_down == 0 && k_up == 0)
		{
			for(i = 0; i < 65535; i++);
			if(k_down == 0 && k_up == 0)
			{
				draw_spec();
			}
		}
	 }//end of	while(key_pause == 1)
	 LCD_ClearLCD();
}

void BubbleSort(float* pData,int Count) 
{ 
  float iTemp; //定义交换的中间变量
  int  i,j,p;
  for( i=1;i<Count;i++) 
  { 
    for( j=Count-1;j>=i;j--) 
    { 
      if(pData[j]>pData[j-1]) //将其按升序排列
      { 
        iTemp = pData[j-1]; 
		p=data_nm[j-1];
        pData[j-1] = pData[j]; 
       data_nm[j-1]=data_nm[j];
        pData[j] = iTemp; 
	    data_nm[j] = p;
      } 
    } 
  } 
} 

void draw_spec()
{
		/*绘制频谱图*/
	int	page = 0;
	int k = 0;
	int i = 0;
	int j = 0;
	int col = 0;
	LCD_WCom(0x0c);
	LCD_WCom(0x34);
	LCD_WCom(0x36);

	for(i = 0; i < 64; i++)
	{
		for(j = 0; j < 16; j++)
		{
			buffer[i][j] = 0x00;
		}
	}

	for(i = 0; i < 16; i++)
	{
		buffer[(uchar)(64-re[i*8]/Dis_scale)][i] |= 0x80;
		buffer[(uchar)(64-re[i*8+1]/Dis_scale)][i] |= 0x40;
		buffer[(uchar)(64-re[i*8+2]/Dis_scale)][i] |= 0x20;
		buffer[(uchar)(64-re[i*8+3]/Dis_scale)][i] |= 0x10;
		buffer[(uchar)(64-re[i*8+4]/Dis_scale)][i] |= 0x08;
		buffer[(uchar)(64-re[i*8+5]/Dis_scale)][i] |= 0x04;
		buffer[(uchar)(64-re[i*8+6]/Dis_scale)][i] |= 0x02;
		buffer[(uchar)(64-re[i*8+7]/Dis_scale)][i] |= 0x01;
	}
	for(i = 0; i < 16; i++)
	{
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x80)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x80;
				}
				break;
			}
		}
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x40)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x40;
				}
				break;
			}
		}
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x20)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x20;
				}
				break;
			}
		}
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x10)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x10;
				}
				break;
			}
		}
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x08)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x08;
				}
				break;
			}
		}
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x04)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x04;
				}
				break;
			}
		}
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x02)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x02;
				}
				break;
			}
		}
		for(j = 0; j < 64; j++)
		{
			if(buffer[j][i] & 0x01)
			{
				for(k = j; k < 64; k++)
				{
					buffer[j][i] |= 0x01;
				}
				break;
			}
		}
		
	}
	page = 0;//实际行
	//上半屏
	for(i = 0; i < 32; i++)
	{	
		page = 0x80 | i;
		col = 0x80;
		LCD_WCom(page);
		LCD_WCom(col);
		for(j = 0; j < 16; j++)
		{
			LCD_WData(buffer[i][j]);
		}
	}
	//下半屏
	for(i = 0; i < 32; i++)
	{	
		page = 0x80 | i;
		col = 0x88;
		LCD_WCom(page);
		LCD_WCom(col);
		for(j = 0; j < 16; j++)
		{
			LCD_WData(buffer[i+32][j]);
		}
	}

}

⌨️ 快捷键说明

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