赞
踩
ZC706+AD9361设置为Linux启动,使用MATLAB/Simulink产生QPSK调制的发射数据,将发射数据加载到AD-FMCOMMS3,把接收数据保存下来,再使用MATLAB/ Simulink进行滤波处理。
resources:tools-software:linux-software:zynq_images [Analog Devices Wiki]
使用的Linux镜像版本为2019_r1
开发板启动模式开关设置
AD-FMCOMMS2/3/4 Datafiles [Analog Devices Wiki]
需要注意的是:
在IIO Oscilloscope中将发射链路的DDS mode设置为DAC Buffer Output,并加载发射数据文件。设置接收和发射的采样率为30.72MHz,本振频率为2.4GHz,RF带宽为15MHz。在示波器窗口以星座图模式观察RX1的I路Q路数据,并将数据保存下来。
需要注意的是,接收根号升余弦滤波器的参数要根据发射根号升余弦滤波器的参数设置。
例如在发射模块中,Output samples per symbol=2,则接收模块中要设置 Input samples per symbol=2以及Decimation factor=2。否则不能正确滤波。(原理不清楚)
如果使用的是官方给的发射数据,接收模块就要使用Input samples per symbol=2以及Decimation factor=2。
ZC706+AD9361设置为No-OS启动,使用MATLAB/Simulink产生QPSK调制的发射数据,将发射数据处理为AD9361可以使用的数据,数据发射接收后将接收数据保存下来,再使用MATLAB/ Simulink进行滤波处理。
首先构建硬件工程,HDL选择hdl_2019_r1版本
SDK工程_persueadream的博客-CSDN博客_ad9361官方例程
ADI Reference Designs HDL User Guide [Analog Devices Wiki]
构建软件工程,源码选择2019_R1分支
AD9361 官方例程_lwd_up的博客-CSDN博客_ad9361官方例程
AD9361 No-OS Software [Analog Devices Wiki]
在config.h中选择XILINX_PLATFORM, ADC_DMA_EXAMPLE和DAC_DMA_EXAMPLE
与1.2中的步骤一样,使用官方给的Simulink model生成I路和Q路数据(Output samples per symbol=2),但AD9361中ADC的输入数据是12位补码形式。而且只使用一路TX和RX的话,输入数据为32位数,前16位存放I路数据(并且数据因该放在高12位),后16位存放Q路数据。所以就需要将生成的I路和Q路数据处理为32位格式,并保存位txt文件格式。数据处理的代码如下:
- %matlab浮点数转换为定点数参考链接
- %https://blog.csdn.net/kebu12345678/article/details/86287775
- %https://blog.csdn.net/weixin_44948109/article/details/124316655
- %https://www.cnblogs.com/yanghonker/p/7988092.html
- q=quantizer('fixed','round','saturate',[12,11]);
- I1_hex=[num2hex(q,I1),num2str(zeros(length(I1),1))];
- Q1_hex=[num2hex(q,Q1),num2str(zeros(length(Q1),1))];
-
- fid=fopen('dac_data.txt','wt');
- for i=1:8192 %len
- fprintf(fid,'%s%s\n',I1_hex(i,1:4),Q1_hex(i,1:4));
- end
- fclose(fid);
主要是在DAC_DMA_EXAMPLE的基础上进行修改,将要发送的sin数据改为QPSK调制数据,关于发送AD9361数据发送和接收的相关代码解释可以参考以下链接:
AD9361 官方例程详解(一)_lwd_up的博客-CSDN博客_ad9361官方例程
AD9361 官方例程详解(二)_lwd_up的博客-CSDN博客_ad9361官方例程
注意有几个文件夹是不需要的“platform_altera”” platform_linux”” platform_generic”。
发射数据保存在SD卡中,所以需要通过SD卡读取数据,具体操作可以参考一下链接:
ZYNQ实验——SD卡读写TXT文本_weixin_43753381的博客-CSDN博客
读取数据后需要将16进制字符转换为32位无符号数保存在指定内存地址中,代码如下:
- int ReadFile(char *FileName, u32 *DestinationAddress, UINT* br)
- {
- FIL fil;
- FRESULT rc;
- /* Open a file */
- rc = f_open(&fil, FileName, FA_READ);
- if (rc) {
- printf(" ERROR : f_open returned %d\r\n", rc);
- return XST_FAILURE;
- }
-
- UINT count=0;
- char line_buff[11];
- while(f_gets(line_buff,sizeof(line_buff),&fil))
- {
- //使用f_gets函数要将use_strfunc设置为1,并且将libsrc/xilffs_v4_0/src/include/ff.h目录下的
- //TCHAR* f_gets (TCHAR* buff, s32 len, FIL* fp);改为TCHAR* f_gets (TCHAR* buff, int len, FIL* fp);
- //参考https://github.com/Xilinx/embeddedsw/commit/afebb4382e3f378bf06ecb7764866d8e8a5ed164
- u32 num,data=0;
- u32 pos=1;
- for(int i=7;i>=0;i--)
- {
- if(line_buff[i]>='0'&&line_buff[i]<='9')
- num=line_buff[i]-'0';
- else if(line_buff[i]>='a'&&line_buff[i]<='f')
- num=line_buff[i]-'a'+10;
- else
- num=0;
- data+=num*pos;
- pos*=16;
- }
- *(DestinationAddress+count*1)=data;
- count++; //count the line num
- }
- *br=count;
- /* Close open files */
- rc = f_close(&fil);
- if (rc) {
- printf(" ERROR : f_close returned %d\r\n", rc);
- return XST_FAILURE;
- }
- /* Flush the entire Data cache to the DDR */
- Xil_DCacheFlush();
- return XST_SUCCESS;
- }
接收数据也是参考ADC_DMA_EXAMPLE的代码,将接收后的数据以txt格式保存在SD卡中。
关于AD9361中基带滤波器的介绍可以参考以下链接:
AD9361 介绍 (上)_lwd_up的博客-CSDN博客_ad9361
AD9361开发:接收与发送滤波器配置_翟二狗爱学习的博客-CSDN博客_接收滤波器
发射链和接收链的基带滤波器都由模拟滤波器和数字滤波器组成,可以使用MATLAB Filter Design Wizard生成滤波器参数,替换软件代码里的滤波器配置参数(速率、带宽、系数),关于MATLAB Filter Design Wizard的使用可以参考以下链接:
MATLAB Filter Design Wizard for AD9361 [Analog Devices Wiki]
AD9361 FIR 滤波器设计_lwd_up的博客-CSDN博客_ad9361 fir滤波器
根据1.2中分析的,QPSK调制后基带信号的带宽为9.6MHz,因此设置接收链路的滤波器带宽为13MHz(这里经过多次尝试,需要将发射带宽设置的大一些,接收带宽设置的小一些,才能正确滤波。),参数设置和仿真结果如下所示
发射链路的滤波器设置如下,
最后生成的配置文件如下图所示:
- // Generated with AD9361 Filter Design Wizard 16.1.3
- // MATLAB 9.11.0.1769968 (R2021b), 18-Sep-2022 20:46:14
- // Inputs:
- // Data Sample Frequency = 30720000 Hz
-
- AD9361_RXFIRConfig rx_fir_config = {
- 3, // rx
- -6, // rx_gain
- 2, // rx_dec
- {40,-60,-54,-185,-141,-113,39,90,91,-32,-108,-105,26,132,130,-18,-159,-164,8,190,207,5,-226,-258,-23,265,320,46,-309,-392,-76,359,479,114,-416,-583,-162,481,709,225,-558,-864,-307,650,1061,416,-764,-1321,-568,913,1681,792,-1120,-2222,-1155,1441,3144,1828,-2060,-5173,-3566,3980,14351,21782,21782,14351,3980,-3566,-5173,-2060,1828,3144,1441,-1155,-2222,-1120,792,1681,913,-568,-1321,-764,416,1061,650,-307,-864,-558,225,709,481,-162,-583,-416,114,479,359,-76,-392,-309,46,320,265,-23,-258,-226,5,207,190,8,-164,-159,-18,130,132,26,-105,-108,-32,91,90,39,-113,-141,-185,-54,-60,40}, // rx_coef[128]
- 128, // rx_coef_size
- {983040000,245760000,245760000,122880000,61440000,30720000}, // rx_path_clks[6]
- 22132016 // rx_bandwidth
- };
-
- AD9361_TXFIRConfig tx_fir_config = {
- 3, // tx
- 0, // tx_gain
- 2, // tx_int
- {51,155,188,62,-148,-146,99,258,9,-334,-205,331,450,-185,-689,-127,822,599,-746,-1165,356,1703,425,-2037,-1655,1923,3416,-954,-6068,-2135,12485,26368,26368,12485,-2135,-6068,-954,3416,1923,-1655,-2037,425,1703,356,-1165,-746,599,822,-127,-689,-185,450,331,-205,-334,9,258,99,-146,-148,62,188,155,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // tx_coef[128]
- 64, // tx_coef_size
- {983040000,122880000,122880000,122880000,61440000,30720000}, // tx_path_clks[6]
- 33889517 // tx_bandwidth
- };
使用生成的参数修改源文件
需要注意的一点是,官方给出的软件代码中,使用的是ad9361_set_tx_fir_config函数来配置滤波器设置,但通过调试观察ad9361_phy发现,该函数并不能正确配置AD9361的滤波器,并且没有使能滤波器。需要使用ad9361_trx_load_enable_fir函数进行配置,然后可以通过ad9361_get_rx_fir_en_dis函数查看FIR滤波器是否使能。
关于No-OS软件相关介绍可以参考以下链接:
AD9361 No-OS Software [Analog Devices Wiki]
还有一点需要注意,生成滤波器系数的时候,FIR抽头数可能会发生变化,需要手动改回来。
更新:
根据最佳基带传输理论,为了使采样点无符号间干扰,发送滤波器和接受滤波器频率响应的乘积应该满足奈奎斯特准则。所以在收发成形滤波器都是根号升余弦的情况下,两者之间不需要其他滤波器。也就是需要将AD9361的FIR滤波器旁路掉。 这里还是需要先使用ad9361_trx_load_enable_fir函数加载滤波器配置并使能,然后再使用ad9361_set_tx_fir_en_dis函数将收发FIR滤波器禁用(旁路掉)。但是还会存在模拟滤波器,模拟滤波器对传输的影响有多大,这一点不清楚。还有就是禁用FIR滤波器后,HB滤波器是否还工作,FIR的插值是否还存在,这些也不清楚。
与1.4中相同,将接收下来的数据通过官方Simulink model进行滤波处理(Input samples per symbol=2以及Decimation factor=2),接收信号频谱和滤波前后的星座图如下所示
如果将产生数据的速率改为7.68MHz(30.72MHz/4),TX链路的成型滤波器插值改为4,输出信号带宽为4.8MHz,输出速率仍为30.72。使用与滤波器系数和前面的一样,修改了模拟滤波器的带宽(为什么这个值可以还不清楚),接收端的滤波器抽取因子为4,接收信号频谱和滤波前后的星座图如下所示,可以正确接收
- // Generated with AD9361 Filter Design Wizard 16.1.3
- // MATLAB 9.11.0.1769968 (R2021b), 18-Sep-2022 20:46:14
- // Inputs:
- // Data Sample Frequency = 30720000 Hz
-
- AD9361_RXFIRConfig rx_fir_config = {
- 3, // rx
- -6, // rx_gain
- 2, // rx_dec
- {40,-60,-54,-185,-141,-113,39,90,91,-32,-108,-105,26,132,130,-18,-159,-164,8,190,207,5,-226,-258,-23,265,320,46,-309,-392,-76,359,479,114,-416,-583,-162,481,709,225,-558,-864,-307,650,1061,416,-764,-1321,-568,913,1681,792,-1120,-2222,-1155,1441,3144,1828,-2060,-5173,-3566,3980,14351,21782,21782,14351,3980,-3566,-5173,-2060,1828,3144,1441,-1155,-2222,-1120,792,1681,913,-568,-1321,-764,416,1061,650,-307,-864,-558,225,709,481,-162,-583,-416,114,479,359,-76,-392,-309,46,320,265,-23,-258,-226,5,207,190,8,-164,-159,-18,130,132,26,-105,-108,-32,91,90,39,-113,-141,-185,-54,-60,40}, // rx_coef[128]
- 128, // rx_coef_size
- {983040000,245760000,245760000,122880000,61440000,30720000}, // rx_path_clks[6]
- 20889517// rx_bandwidth
- };
-
- AD9361_TXFIRConfig tx_fir_config = {
- 3, // tx
- 0, // tx_gain
- 2, // tx_int
- {51,155,188,62,-148,-146,99,258,9,-334,-205,331,450,-185,-689,-127,822,599,-746,-1165,356,1703,425,-2037,-1655,1923,3416,-954,-6068,-2135,12485,26368,26368,12485,-2135,-6068,-954,3416,1923,-1655,-2037,425,1703,356,-1165,-746,599,822,-127,-689,-185,450,331,-205,-334,9,258,99,-146,-148,62,188,155,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // tx_coef[128]
- 64, // tx_coef_size
- {983040000,122880000,122880000,122880000,61440000,30720000}, // tx_path_clks[6]
- 20889517// tx_bandwidth
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。