AD-FMCOMMS3 使用matlab+Linux/No-OS传输QPSK信号

一、Matlab+Linux

ZC706+AD9361设置为Linux启动,使用MATLAB/Simulink产生QPSK调制的发射数据,将发射数据加载到AD-FMCOMMS3,把接收数据保存下来,再使用MATLAB/ Simulink进行滤波处理。

1.设置ZC706+AD9361的Linux启动SD卡

resources:tools-software:linux-software:zynq_images [Analog Devices Wiki]

使用的Linux镜像版本为2019_r1

开发板启动模式开关设置

2.使用官方给的Simulink modle产生QPSK调制的发射数据

AD-FMCOMMS2/3/4 Datafiles [Analog Devices Wiki]

需要注意的是:

  • AD9361设置的ADC,DAC采样率为30.72MHz,在调制模块中根号升余弦滤波器的插值设置为2,插值后采样率变为2倍,为了使调制后数据的采样率和AD9361设置的采样率一致,则进入滤波器的数据采样率应该为15.36MHz,因此产生数据模块的采样率为15.36MHz,对应的单比特数据采样率为30.72MHz。
  • 官方模型中根号升余弦滤波器的滚降因子设置为0.25,Output samples per symbol设置为2(内插值为2),对应的调制信号基带带宽为9.6MHz,通过测试,在IIO Oscilloscope中将RF Bandwidth设置为15MHz(半边带?)可以正确解调。

3.将发射数据加载到AD-FMCOMMS3

在IIO Oscilloscope中将发射链路的DDS mode设置为DAC Buffer Output,并加载发射数据文件。设置接收和发射的采样率为30.72MHz,本振频率为2.4GHz,RF带宽为15MHz。在示波器窗口以星座图模式观察RX1的I路Q路数据,并将数据保存下来。

4.使用官方给的Simulink modle对接收数据进行滤波处理

需要注意的是,接收根号升余弦滤波器的参数要根据发射根号升余弦滤波器的参数设置。 

例如在发射模块中,Output samples per symbol=2,则接收模块中要设置 Input samples per symbol=2以及Decimation factor=2。否则不能正确滤波。(原理不清楚)

如果使用的是官方给的发射数据,接收模块就要使用Input samples per symbol=2以及Decimation factor=2。

二、Matlab+No-OS

ZC706+AD9361设置为No-OS启动,使用MATLAB/Simulink产生QPSK调制的发射数据,将发射数据处理为AD9361可以使用的数据,数据发射接收后将接收数据保存下来,再使用MATLAB/ Simulink进行滤波处理。

1.将ZC706+AD9361设置为No-OS启动

首先构建硬件工程,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

2.使用MATLAB/Simulink产生QPSK调制的发射数并进行数据处理

与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);

3.编写ZC706+AD9361的软件工程,将发射数据读取出来并保存到指定的内存地址中

主要是在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卡中。

4.使用MATLAB Filter Design Wizard设置AD9361的基带滤波器

关于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的插值是否还存在,这些也不清楚。

5.使用MATLAB/ Simulink进行滤波处理

与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
};

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值