DSP

DSP TMS320C5509A 控制DDS AD9854芯片进行AM幅度调制

2019-07-13 15:27发布

接上一节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滤波、音频的静噪处理。