MATLAB连接USRP实现数据采集

本文主要针对USRP 2955设备进行数据接收。2955由X310进行封装,可以实现数据的收发。

1、USRP连接电脑需要修改IP地址。USRP中的IP地址默认为192.168.10.2。因此电脑端需要修改IP地址为192.168.10.1 ,子网掩码为255.255.255.0。

2、MATLAB2018中的UHD版本为3.9.7,MATLAB2019中的UHD版本为3.13。USRP官网目前的最新版本为3.14。要保证MATLAB能够连接上USRP需要两个的版本一致,因此使用MATLAB2019和USRP的3.13。其中MATLAB2019中需要下载Communications Toolbox Support Package for USRP Radio功能包。

3、官网下载uhd_3.13.1.0-release_Win32_VS2014。将路径添加到环境变量中,该软件需要pip和python2.7的支持。因此需要先安装python,python2.7.8以上的版本才自带pip。因此需要安装python2.7.8。

4、安装完成后断开网络修改IP,连接USRP,首先执行uhd_find_devices确定是否发现设备,若通过网线连接,网口灯不亮,则利用VIVADO烧写bit文件。

5、uhd_usrp_probe 命令,使用探针工具若检测到如下问题(固件有问题需要更新):


Error: RuntimeError: Expected FPGA compatibility number 35, but got 33:
The FPGA image on your device is not compatible with this host code build.
Download the appropriate FPGA images for this version of UHD.
As an Administrator, please run:
"C:\Program Files\UHD\lib\uhd\utils\uhd_images_downloader.py"
Then burn a new image to the on-board flash storage of your
USRP X3xx device using the image loader utility. Use this command:
"C:\Program Files\UHD\bin\uhd_image_loader" --args="type=x300,addr=192.168.10.2"


6、连接外网,CMD中执行"C:\Program Files\UHD\lib\uhd\utils\uhd_images_downloader.py"会自动下载固件 

7、下载完成后执行"C:\Program Files\UHD\bin\uhd_image_loader" --args="type=x300,addr=192.168.10.2进行镜像文件的烧写

8、完成后,打开MATLAB,执行findsdru命令,若status显示not compatible则需要烧写MATLAB的镜像,使用getSDRuDriverVersion()  查看驱动版本

9、执行druload('Device','X310')烧入image重启后执行findsdru,statu显示success

10、参考代码:

%首先查找设备findsdru
%参数说明1:https://ww2.mathworks.cn/help/supportpkg/usrpradio/ug/comm.sdrureceiver-system-object.html#bun592c-29
%参数说明2: https://ww2.mathworks.cn/help/dsp/ref/dsp.signalsink-system-object.html?s_tid=doc_ta
%% SDRuReceiver
% 1.ChannelMapping 通道映射:1,2or[1 2] channels 1 and 2 of the radio with IP address 192.168.10.3.
% 2.CenterFrequency:2.45e9
% 3.LocalOscillatorOffset:0 本地振荡器(LO)偏移频率
% 4.Gain:default:8 硬件接收器数据路径的总体增益
% 5.ClockSource:'Internal' (default) | 'External' 时钟源
% 6.DecimationFactor 512 (default) | integer 数据接收器的抽取系数
% 7.TransportDataType int16 
% 8.OutputDataType 'Same as transport data type' (default) | 'double'   接收信号的数据类型
% 9.SamplesPerFrame 362 每帧数据的样本
% 10.EnableBurstMode false not run in real time
% 11.NumFramesInBurst 100
% 12.MasterClockRate default:200e6 120e6 186.32e6 200e6
% 13.PPSSource :Internal 
%% dsp.SignalSink
% 1.BufferLength:default:inf Maximum number of input frames to log
% 2.Decimation:default;1 抽取因子
% 3.FrameHandlingMode:Output dimensionality for frame-based inputs
% default:2-D array
% 4.Buffer:logged data

clear;close all;
rx_SDRu = comm.SDRuReceiver('Platform','X310','IPAddress','192.168.10.2','CenterFrequency',700e6,'OutputDataType','double','LocalOscillatorOffset',650e6 );
% info(rx_SDRu)  

%%进行一次数据的采集,第一次是buffer置0,第二次才是是未知数据,第三次才是正式数据
%默认buffer大小为362

% [Y1,datalen]=step(rx_SDRu);
% subplot(221);plot(real(Y1));title('空数据');
% pause(3);
% [Y2,datalen]=step(rx_SDRu);
% subplot(222);plot(real(Y2));title('未知数据');
% [Y3,datalen]=step(rx_SDRu);
% subplot(223);plot(real(Y3));title('正式数据1');
% [Y4,datalen]=step(rx_SDRu);
% subplot(224);plot(real(Y4));title('正式数据2');

%%利用SignalSink采集数据
rx_log = dsp.SignalSink('Decimation',1);
data1 = rx_SDRu();
rx_log(complex(data1));%第一轮采集的是实数0,后面为复数,因此强制转换,或者后面的数据存放新的变量里面
subplot(121);
log=rx_log.Buffer;
plot(real(log));title('空数据');
pause(3);
data2 = rx_SDRu();
rx_log(complex(data2));%第二轮采集的是未知
subplot(122);
log=rx_log.Buffer;
plot(real(log(362:end)));title('未知数据');

%正式数据
for counter = 1:20
  data = rx_SDRu();
  rx_log(data);
end
log=rx_log.Buffer;
figure;
plot(real(log(722:end)));title('正式数据');
release(rx_SDRu)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章