USRP在matlab上的连接配置与使用教程(Ubuntu)

前言

被各种SDR折磨到哭~还是选择usrp吧~不过usrp配置起来比各种sdr麻烦一点,同样是中文互联网上没有特别完整和详细的教程,本文记录一下踩坑的过程,抛砖引玉~

软件准备

这里只说在ubuntu20.04下的使用,win10下我没搞定。。。
ubuntu下首先需要安装UHD和matlab。安装好后在matlab的 主页-附加功能-获取硬件支持包 里搜索usrp,下载安装Communications Toolbox Support Package for USRP Radio这个支持包,这里不用点提示的测试连接设备,按照后面的步骤进行即可。

USRP的连接

这里我测试了USRP N210和USRP X310两款可以使用网线连接的usrp,由于我手头没有b210,因此对于usb3.0接口的usrp如何连接不太了解,但是看网上的博客似乎b210更方便连接一些。
N210和X310均是可以通过网线接入电脑的,其中X310默认是光纤接口,我这里使用了一个光电转换器实现网线接入X310,网线另一端接入计算机。注意,如果USRP刷过固件,要记住USRP的网段。例如我这里这台X310的网段是192.168.40,N210是192.168.10,因此接入后需要手动指定IPV4的IP地址到该网段下才可以被UHD识别到。


按照上面的过程修改IP即可。

确认改好IP后,在命令行输入uhd_find_devices,看uhd是否能够识别到usrp。

确认uhd可以正确识别到usrp后,打开matlab输入findsdru,观察是否能够识别到。注意这里无需使用管理支持包的时候弹出的识别测试,只需要能够在findsdru这里找到的话就说明是没问题的。

v能够识别到则连接成功。这里红字的报错至少我这里不影响使用。。。

USRP的使用–接收机

USRP的初始化

和RTL-SDR的初始化一样,都使用comm.的方法进行初始化。对于usrp接收机,具体方法是comm.SDRuReceiver:
rx = comm.SDRuReceiver
rx = comm.SDRuReceiver(address)
rx = comm.SDRuReceiver(___,Name,Value)

其中,address输入的usrp的ip地址,第三种初始化方法是直接写入需要的参数,例如:
rx = comm.SDRuReceiver(‘Platform’,’B200′, …
‘SerialNum’,’30FD838′, …
‘CenterFrequency’,2.5e9, …
‘MasterClockRate’,56e6, …
‘DecimationFactor’,125, …
‘OutputDataType’,’double’);

——–西安疫情,近期无法回到工作的地方,刚写了个开头,等能够继续工作再写——–
——–抢救了台笔记本,但是系统是linux mint,后面的教程都是基于mint系统下进行的,但应该不存在系统上的额外问题——–

先尝试声明一个接收机对象rx:
rx = comm.SDRuReceiver
rx对象下有很多参数,这里一一做解释和注意事项。

接收机对象的参数详细解释

Platform — USRP型号。默认为’N200/N210/USRP2’。可支持USRP类型有:
* ‘N200/N210/USRP2’
* ‘N300’
* ‘N310’
* ‘N320/N321’
* ‘B200’
* ‘B210’
* ‘X300’
* ‘X310’
这里的每一个USRP型号需要对应所连接的设备型号。例如,我这里连接N210的时候,需要将Platform设置为‘N200/N210/USRP2’;如果我连接的是USRP X310,则设置为’X310’。具体语法为:rx.Platform = ‘N200/N210/USRP2’ rx.Platform = ‘X310’ 等。

IPAddress — USRP的IP地址。默认为’192.168.10.2’。这个属性是针对使用网线连接USRP的设备的,包括:N200, N210, USRP2, N300, N310, N320, N321, X300, X310。也就是说除了B系列是通过USB口连接,N系列和X系列的都需要用这个参数进行指定设备。
这里指定的IP需要和findsdru指令返回的IP是一致的。
如果电脑同时连接了多台USRP(用交换机同时接入),可以一次性指定多个IP地址,具体语法为:
rx.IPAddress = ‘192.168.10.4’(以我这台210的IP为例) rx.IPAddress = ‘192.168.10.4 192.168.10.5’
这里还有一种可能需要指定两个ip地址:如果使用的usrp是X300或者X310,并且配置了2块TwinRx子板,那么matlab这个支持包是可以支持这两个子板同时接收信号,即可以用一块X310+两块TwinRx子板拼出4路接收机,TwinRx的带宽为80M,应该满足大部分做无线的需求。当然,TwinRx子板只是一个接收用的,不能用于发送信号。由于我手里并没有这个型号的子板,相关用法仅是来源于matlab官方文档和询问做SDR的同学得来的,不完全保证正确性。

SerialNum — 射频序号。默认为空。这个属性只是针对使用USB连接的B系列USRP,包括B200和B210。由于我手里并没有任何B系列的设备,所以并不太清楚这个属性的用法…

IsTwinRXDaughterboard — 启用TwinRx子板。默认为0。当设置为1时是启动两块TwinRx子板。这里解释一下,如果您使用的是USRP X300或者X310,并且上面配了两块TwinRx型号的射频子板,matlab对这种情况单独给出了4路接收的方案。如果需要进行4路接收,第一步就是将这个参数设置为1。

EnableTwinRXPhaseSynchronization — 启用两块TwinRx相位同步。默认为0。如果需要4路接收,这里同样需要将该参数设置为1。启动以后可以让两块子板接收信号相位同步。

ChannelMapping — 信道数量。默认为1。这里有多种情况需要区分开来:
1. 对于USRP N200/N210/USRP2 系列
如果只有一块接入,只能设置一个接收信道,即rx.ChannelMapping = 1。如果用交换机接入了N个该类型的USRP,信道数量为[1 : N]。
2. 对于USRP N300,N320,N321,B210 系列
这几个系列的USRP只能是1通道或者2通道,无法级联。rx.ChannelMapping = 1或者 rx.ChannelMapping = [1 2]。
3. 对于USRP B200 系列
B200只能单发单收,所以最多只能设置1个信道。都不用人为改动默认的就是1。
4. 对于USRP N310 系列
由于N310本身就是支持4发4收,因此可以最多设置到4个信道,rx.ChannelMapping = [1 2 3 4]。另外,N310不支持级联,因此不可以做多块N310的同时调用。
5. 对于USRP X300X310但不开启TwinRx双子板同步(IsTwinRXDaughterboard = 0)
如果只有一块接入,可以设置1-2个信道,rx.ChannelMapping = [1 2]。如果接入了N个该类型的USRP,可以设置的信道数量为[1:2N],例如如果级联了3块X310,这块最大的信道数量可以设置为6。(没试过,过于昂贵了~…只见过级联2块X310,不知道级联3块会不会有吞吐量的问题)
6. 对于USRP X300X310开启TwinRx双子板同步(IsTwinRXDaughterboard = 1)
matlab这里不支持TwinRx双子板配置下在级联多个X310,因此这种情况下可以设置的信道数量最大为4。rx.ChannelMapping = [1 2 3 4]。

对于多块USRP,指定信道的顺序和指定IP的顺序是一致的。例如A板和B板的ip分别是192.168.10.3和192.168.10.4,如果想要然B板的接收信道为[1 2],只需在指定ip时将192.168.10.4放在192.168.10.3之前,指定信道数量的时候自动按顺序分配。

CenterFrequency — 中心频率。默认为2450e6,单位是Hz。CenterFrequency的设定范围和所使用的子板相关,每款射频子板对应的频率可以参考:Ettus官网。这里同样分为多种情况:
1. 单信道
对于只有1个信道的接收机,只需指定想要的中心频率即可。例如rx.CenterFreqency = 1000e6;
2. 多信道
对于声明了多个信道的接收机对象,如果要让接收不同频率的信号,中心频率可以指定为多个不同的频率,例如:rx.CenterFrequency = [2412e6 2442e6];
注意!不是以下情况是不可以指定多个中心频率的:
(1)对于B210,matlab不支持设置两个通道接收不同频率,虽然B210本身有2个口,但是在matlab上只能设置一个接收信道。(虽然没用过B系列的,但是我猜是因为USB口的吞吐量限制问题?)
(2)对于N310,如果N310上配置了2块子板,在matlab指定中心频率时,统一子板上的2个接收信道的中心频率必须指定一致。
(3)对于X310上配置2块TwinRx子板,如果想要接收的中心频率一致,需要将参数EnableTwinRXPhaseSynchronization 设置为1;如果需要不同的中心频率,该参数设置为0,并分别设定每个通道的中心频率即可。

LocalOscillatorOffset — 本振频偏。默认为0。单位为Hz,具体可设定的范围同样参考Ettus官网的子板描述。该参数用于修正接收信号与射频信号之间的频率偏移,理想情况下f中心 – f射频 = 0

Gain — 增益。默认为8。单位为dB。对于单通道,只需指定一个标量;对于多通道,用行向量进行指定不同通道的增益,例如:rx.Gain = [10 12]。

PPSSource — PPS信号源。默认为Internal,即USRP的内部PPS源。可支持项有:
1. Internal–内部PPS源
2. External–外部PPS源。如果接入外部信号发生器
3. GPSDO–使用GPSDO的PPS信号

ClockSource — 时钟源。默认为Internal,即USRP的内部时钟源。可支持项有:
1. Internal–内部时钟源
2. External–外部时钟源。如果接入一个外部时钟
3. GPSDO-使用GPSDO的时钟信号

MasterClockRate — 主时钟速率。对于不同信号的USRP,其主时钟速率对应关系如下:
* N200/N210/USRP2 — 100MHz(不可更改)
* N300/N310 — 122.88MHz, 125MHz或153.6MHz。默认为125MHz
* N320/N321 — 200MHz, 245.76MHz或250MHz。默认为200MHz
* B200/N210 — 5MHz~56MHz。对于B210,如果使用2个通道,该参数必须小于等于30.72MHz。默认为32MHz
* X300/X310 — 184.32MHz或200MHz。如果使用双TwinRx子板,该参数需要设置为200MHz。默认为200MHz

DecimationFactor — 抽取系数。与MasterColckRate共同决定了采样率。具体可设置范围与USRP型号的关系如下:

!SampleRate! 这里提一下采样率的问题,该工具包不是直接通过设置某个参数实现对采样率的设置,而是通过MasterClockRate和DecimationFactor这两个参数共同设置的。具体关系为:SampleRate = rx.MasterClockRate / rx.DecimationFactor

TransportDataType — 传输信号的数据类型。(好像是针对发射机的?)默认类型为’int16’。可以修改为’int8’。

OutputDataType — 输出信号的数据类型。默认为’Same as transport data type’。可修改为’int8′, ‘single’, ‘double’。
如果设置为int8类型,返回原始的IQ信号数据范围为[-128, 127]
如果设置为int16类型,返回原始的IQ信号数据范围为[-32768, 32767]
如果设置为’single’类型,返回的是单精度数据,范围为[-1, 1]
如果设置为’double’类型,返回的是双精度数据,范围为[-1, 1]

SamplesPerFrame — 每帧采样数。默认为362。这和matlab调用LimeSDR那篇教程中的同名参数是一个意思,即每次调用一次rx去接收数据,会返回SamplesPerFrame个点。

接收信号

声明好rx接收机对象,并修改好对应的参数,调用usrp采集数据只需要一句:rx()就可以。每调用一次rx()采集到的点数为SamplesPerFrame。

杂糅着mathworks的文档说明和我对USRP的浅薄了解先写到这,写不动了…..具体用法的代码有机会再加吧,其实可以参考limeSDR和RTL-SDR在matlab下用法的那两篇博客,代码写法大同小异

Add a Comment

邮箱地址不会被公开。 必填项已用*标注