📄 agc_audio.c
字号:
/*****************************************************************************/
/* Filename: agc_aduio.c */
/* Author:ZhangYong */
/* 2002-12 */
/*****************************************************************************/
#include "agc_face.h"
#include "agc_func.h"
int dIn,dOut;
int Read_BSP1(void); //读串口1
void Write_BSP1(int); //写串口
//void Led_Light(void);
int AGC_audio(int); //自动增益控制函数
// 主函数
void main()
{
init_board();
while (1)
{
dIn=Read_BSP1(); //从串口1读入一个数据
dOut=AGC_audio(dIn); //作自动增益
Write_BSP1(dOut); //将数据送出到AD50
//Led_Light();
}
}
int Read_BSP1(void) //从串口1读入一个数据子函数
{
int dDataIn;
*(volatile u16 *)SPSA_ADDR(1)=SPCR1_SUBADDR; //从McBSP接收数据
while(!((*(volatile u16 *)SPSD_ADDR(1)) & 0x0002)){};
dDataIn=*(volatile u16*)DRR1_ADDR(1);
return dDataIn;
}
void Write_BSP1(int dDataOut) //写一个数据到串口1的子函数
{
*(volatile u16 *)SPSA_ADDR(1)=SPCR2_SUBADDR; //发送数据到McBSP1
while(!((*(volatile u16 *)SPSD_ADDR(1)) & 0x0002)){};
*(volatile u16 *)DXR1_ADDR(1)=dDataOut;
}
/*void Led_Light(void)
{
static int i=0;
if(i>1024)
{
// *(int *)(0x0007)^=0x2000;
*(volatile u16 *)reg_ST1 ^= 0x2000; //Every 1024 times XF changed
i=0;
}
i++;
}*/
int AGC_audio(int AGC_in) //自动增益控制子函数
{
int AGC_out;
static int dTime=0;
static float AGC_Coff=1.0;
static int maxAGC_in=0;
static int maxArrIn=0;
if(AGC_in>maxArrIn)
maxArrIn=AGC_in;
if(-1*AGC_in>maxArrIn)
maxArrIn=-1*AGC_in;
if(dTime>4096)
{
if(maxArrIn<maxAGC_in)
maxAGC_in=maxArrIn;
maxArrIn=0;
dTime=0;
}
dTime++;
if(AGC_in > maxAGC_in)//数据为正时
{
maxAGC_in=AGC_in;
if(maxAGC_in>1)
AGC_Coff=20000.0/maxAGC_in;
}
if((-1*AGC_in)>maxAGC_in)//数据为负时
{
maxAGC_in=-1*AGC_in;
if(maxAGC_in>1)
AGC_Coff=20000.0/maxAGC_in;
}
AGC_out=AGC_in*AGC_Coff; //计算输出数据
if(AGC_out>20000)
AGC_out=20000;
if(AGC_out<-20000)
AGC_out=-20000;
return AGC_out;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -