一、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 %lenfprintf(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/afebb4382e3f378bf06ecb7764866d8e8a5ed164u32 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;elsenum=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 HzAD9361_RXFIRConfig rx_fir_config = {3, // rx-6, // rx_gain2, // 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, // tx0, // tx_gain2, // 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 HzAD9361_RXFIRConfig rx_fir_config = {3, // rx-6, // rx_gain2, // 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, // tx0, // tx_gain2, // 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
};

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

  1. python linux编程与window编程_Python实现Windows和Linux之间互相传输文件(文件夹)的方法...

    项目中需要从Windows系统传输ISO文件到Linux测试系统,然后再Linux测试系统里安装这个ISO文件.所以就需要实现如何把文件从Windows系统传输到Linux系统中. 在项目中使用了ps ...

  2. cp linux 显示进度条_Unix/Linux/Mac os下 文件互传

    Unix/Linux/Mac os下 文件互传 说起文件互传,就不得不提命令scp. 他是Secure copy的缩写,使用ssh连接和加密方式, 如果两台机器之间配置了ssh免密登录, 那在使用sc ...

  3. python传文件_Python实现Windows和Linux之间互相传输文件(文件夹)的方法

    项目中需要从Windows系统传输ISO文件到Linux测试系统,然后再Linux测试系统里安装这个ISO文件.所以就需要实现如何把文件从Windows系统传输到Linux系统中. 在项目中使用了ps ...

  4. windows linux mac os 区别

    1.linux的操作比较复杂,windows的比较简单.  linux速度比较快,安全性比windows好  但是有很多软件只能在windows里运行  与linux兼容的软件正在开发中.  linu ...

  5. ActiveState Komodo IDE v5.2.1.34168 最新版for Linux/Mac OS/Windows 全5大平台

    ActiveState Komodo IDE v5.2.1.34168 最新版for Linux/Mac OS/Windows 全5大平台 转载于:https://www.cnblogs.com/ga ...

  6. Linux 查询 OS、CPU、内存、硬盘信息

    文章目录 Linux 查询 OS.CPU.内存.硬盘信息 一.前言 二.关于服务器基本配置 2.1 操作系统基本配置查询 2.2 CPU基本配置查询 2.3 内存基本配置查询 2.4 硬盘基本配置查询 ...

  7. linux 加入ad 用ssh,使用samba验证AD用户,允许AD用户登录到linux

    使用samba验证AD用户,允许AD用户登录到linux 2007年06月26日 星期二 14:10 1.先把samba加入到AD域中 2.在smb.conf中添加一行,让登录进来的用户使用bash ...

  8. linux工作笔记-linux之间文件传输图形界面工具gftp

    原博客地址如下: https://blog.csdn.net/w5nner/article/details/21174671 linux系统之间传输文件习惯使用gftp,现写一下安装与使用记录. 安装 ...

  9. window 与 linux 之间文件传输

    window 与 linux 之间文件传输 linux 上安装工具 安装命令:yum install lrzsz 1.linux to windows sz filename 2.windows to ...

最新文章

  1. Spring 注解之@RestController与@Controller的区别
  2. python交作业的格式_python作业4
  3. linux中的shell脚本case,【shell】Linux shell 之 case 详解
  4. java 1.8新增功能_睡觉时:新增的Java 8新增功能
  5. c语言清空输入缓冲区函数,c语言:C语言清空输入缓冲区在标准输入(stdin)情况 -电脑资料...
  6. 多存多取问题 java
  7. 2017年3月20日下午学习日志
  8. java兔子问题编程思路详解_Java算法之“兔子问题”
  9. 定时更换超级连接的代码
  10. C# 替换桌面背景图片
  11. 列举python内置函数和使用方法_python学习交流 - 内置函数使用方法和应用举例
  12. Maya粒子消散特效制作(二)
  13. 你知道吗?我喜欢你六年了——微博Redis定制化之路
  14. 站在巨人的肩膀上还是站在巨人的脚底下
  15. 黑苹果(Hackintosh)简单步骤教程
  16. 你为什么遇不到好公司
  17. iOS 开发者都该认真思考的问题 (精华)
  18. 解析腾讯视频加密播放
  19. JAVA byte取值范围表达理解
  20. 趋易避难,人之本性!

热门文章

  1. B/S文件上传下载解决方案
  2. Android apk 腾讯云-乐固的加固及签名
  3. 从乐清女孩发出救命信息后殒命想到,微信滴滴应增加SOS求救功能
  4. Unity FairyGUI(十二)
  5. 条码和自动识别的基础知识
  6. 计算机式硬盘录像机,全面分析PC式硬盘录像机十大问题
  7. RK3399 Android 7.1开发准备
  8. 无配置WCF客户端的一个简单到令人发指的实现方法
  9. android实现异网双卡双待识别运营商网络
  10. python双人对决小游戏