接上一节
https://blog.csdn.net/pxy198831/article/details/86738839DSP TMS320C5509A 控制DDS AD9854芯片驱动
各种调制中最简单的就是调幅了。调幅就是用调制信号的幅度控制载波的幅度,
对于AD9854,就是用AD采样到的音频信号的幅度控制AD9854幅度寄存器的值,
就完成了调幅的过程。平时该幅度寄存器为最大值输出。
程序如下:
interrupt void dmaCh0Isr(void)
{
int I_Q_result;
int ATW;
static int noise_flag = 0,i=0;
unsigned char AM_H,AM_L;
if (dds_flag == 1)
{
// I_Q_result = dstPing[0]; //直接出音频
I_Q_result = AGC_audio(dstPing[0]);
fir((DATA *)&I_Q_result, (DATA *)B_BS,(DATA *)&I_Q_result, BS_dbuf,1,BL_BS);
// audio_DDS[Index] += 32768;
// I_Q_result = 2*A*((float)I_Q_result)/(1+A);
I_Q_result = ((float)I_Q_result)/8192*2048;
// dc = 2048;
// dc = ((1-A)*0x3fff)/(1+A);
// ac = (2*A*I_Q_result)/(1+A);
ATW = (2*A*I_Q_result)/(1+A) + 2048;
// temp = ATW;
// ATW = (temp/65536)*4096;
AM_H = (ATW&0x0f00)>>8;
AM_L = ATW&0xff;
audio_DDS[Index] = (AM_H<<8)|AM_L;
if(Index>=200)
{
Index = 0;
}
if (audio_DDS[Index++] > 1000)
{
if (noise_flag<200)
{
noise_flag++;
}
}
else
{
noise_flag = 0;
}
if (noise_flag != 200)
{
AD9854_WR_Byte(OSK_I1_ADDRESS,AM_H); //设置I通道幅度
AD9854_WR_Byte(OSK_I2_ADDRESS,AM_L);
}
else
{
AD9854_WR_Byte(OSK_I1_ADDRESS,0xff); //设置I通道幅度
AD9854_WR_Byte(OSK_I2_ADDRESS,0xff);
}
ad9854_update();
}
}
将AD采样后的音频信号进行FIR和AGC处理,由于AD是14位有符号的,而AD9854幅度寄存器输出是12位无符号,
首先进行14位有符号到12位无符号的转换,2的14次方,有符号最多可表示-8192~+8192,
2的12次方无符号最多可表示4096,所以先将14位有符号数转化为12位有符号数,
即如下:
I_Q_result = ((float)I_Q_result)/8192*2048;
然后进行调制公式如下,调制完成后进行零点搬移,因为AD9854输出是无符号的,如下:
ATW = (2*A*I_Q_result)/(1+A) + 2048;
这时候得到的数据范围为0~2048, 不超过12位的范围,然后控制AD9854的OSK寄存器即可。
之后的文章会详解AGC、FIR滤波、音频的静噪处理。