Windows环境下使用UHD PythonAPI开发USRP X310

news/2024/11/17 23:43:54/

目录

  • UHD介绍
  • 安装UHD
  • 烧写X310固件
  • 安装uhd python API
  • 测量功率实例

UHD介绍

UHD是USRP开源软件无线电硬件架构的底层软件包,包含上位机和USRP设备中的FPGA的bit文件两个部分。提供了上位机控制FPGA和射频前端采集和处理数据的软件接口。具体实现了数字变频,射频电路切换,数据采集传输,IO口控制等功能。NI labview usrp的实例包含在uhd的框架规范内。
如果想把usrp当作复杂系统里的一个数据采集设备,采用matlab,labview等软件无法方便的和其他设备与深度学习等算法相集成。采用UHD提供的Python API可以方便简单的在系统中集成一些基本功能。
在这里插入图片描述

安装UHD

Windows下直接下载相应版本安装包VS2019版本下载链接进行安装,也可以选择其他版本,安装后可以参照UHD VS配置教程检查环境变量是否正确。

烧写X310固件

运行UHD API 上位机API需要对应版本的X310固件,按照官方教程,连接网线,配置上位机IP地址,在cmd中使用预编译好的tools直接下载fpga固件。

uhd_image_loader --args="type=x300,addr=192.168.10.2" --fpga-path="<path_to_images>/usrp_x310_fpga_HG.bit"

在uhd的安装文件加下可以找到对应的bit文件。

安装uhd python API

UHD官方说明文档仅仅给出了源码编译的安装方案,需要安装cmake等依赖后编译半小时左右。其实可以直接在conda 里面直接安装。

conda create -n usrp python=3.7 #新建一个环境防止依赖冲突
conda activate usrp
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ #添加清华镜像源
conda install uhd

在3.7环境下安装的是UHD4.0.0版本,在py3.6环境下自动安装的是3.15版本

测量功率实例

该实例是github UHD上自带的python例程,仅支持uhd4.0.0

#!/usr/bin/env python3
#
# Copyright 2020 Ettus Research, a National Instruments Brand
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
"""
Use a calibrated USRP as a power meter
"""import sys
import signal
import argparse
import uhddef parse_args():"""Parse the command line arguments"""parser = argparse.ArgumentParser()parser.add_argument("-a", "--args", default="",  # ip=192.168.10.3help="USRP Device Args")parser.add_argument("-f", "--freq", type=float, default=2412000000,  # required=True,help="Center Frequency")parser.add_argument("-o", "--lo-offset", type=float, default=0.0,help="Optional LO offset")parser.add_argument("-c", "--channel", type=int, default=[0],help="USRP RX Channel Index")parser.add_argument("-t", "--antenna", default='TX/RX',help="USRP RX Antenna")parser.add_argument("-r", "--rate", default=1e6, type=float,help="Sampling Rate")parser.add_argument("-b", "--bandwidth", type=float,help="Analog filter bandwidth (if supported)")parser.add_argument("-l", "--ref-level", type=float, default=-15,help="RX reference power level. ""This should be higher than the expected power.")parser.add_argument("-n", "--samps-per-est", type=float, default=1e6,help="Samples per estimate.")parser.add_argument("--mode", choices=['one-shot', 'continuous'], default='continuous',help="Measure once, or keep measuring until Ctrl-C is pressed.")return parser.parse_args()def get_streamer(usrp, chan):"""Return an RX streamer with fc32 output"""stream_args = uhd.usrp.StreamArgs('fc32', 'sc16')stream_args.channels = [chan]return usrp.get_rx_stream(stream_args)def setup_device(usrp, args):"""Apply the settings from args to the device"""chan = args.channel[0]# if chan > usrp.get_rx_num_channels():#     print("ERROR: Invalid channel selected: {} (only {} channels available!)"#           .format(chan, usrp.get_rx_num_channels()))#     raise RuntimeError("Invalid channel selected")# print("Using channel: {}".format(chan))if args.antenna:print("Setting RX antenna to `{}'...".format(args.antenna), end='')usrp.set_rx_antenna(args.antenna, chan)print("OK")# if not usrp.has_rx_power_reference(chan):#     antenna = usrp.get_rx_antenna()#     print("ERROR: This device is not calibrated for RX at RF%d-%s!" % (chan, antenna))#     raise RuntimeError("Device not calibrated for selected antenna")print("Requesting RX rate of {} Msps...".format(args.rate / 1e6), end='')usrp.set_rx_rate(args.rate, chan)if abs(usrp.get_rx_rate(chan) - args.rate) > 1.0:print("ALMOST. Actual rate: {} Msps".format(usrp.get_rx_rate(chan) / 1e6))else:print("OK")print("Requesting RX frequency of {} MHz...".format(args.freq / 1e6), end='')tr = uhd.types.TuneRequest(args.freq, args.lo_offset)usrp.set_rx_freq(tr, chan)if abs(usrp.get_rx_freq(chan) - args.freq) > 1.0:print("ALMOST. Actual frequency: {} MHz".format(usrp.get_rx_freq(chan) / 1e6))else:print("OK")print("Requesting RX power reference level of {:.2f} dBm...".format(args.ref_level), end='')# usrp.set_rx_power_reference(args.ref_level, chan)# # ref_level = usrp.get_rx_power_reference(chan)# if abs(ref_level - args.ref_level) > 1.0:#     print("ALMOST. Actual ref level: {:.2f} dBm".format(ref_level))# else:#     print("OK")if args.bandwidth:print("Requesting analog RX bandwidth of {} Msps...".format(args.bandwidth), end='')usrp.set_rx_bandwidth(args.bandwidth, chan)if abs(usrp.get_rx_bandwidth(chan) - args.bandwidth) > 1.0:print("ALMOST. Actual bandwidth: {} MHz".format(usrp.get_rx_bandwidth(chan) / 1e6))else:print("OK")ref_level = 0return (chan, ref_level)def setup_device2(usrp, args):"""Apply the settings from args to the device"""chan = args.channel[0]# if chan > usrp.get_rx_num_channels():#     print("ERROR: Invalid channel selected: {} (only {} channels available!)"#           .format(chan, usrp.get_rx_num_channels()))#     raise RuntimeError("Invalid channel selected")# print("Using channel: {}".format(chan))if args.antenna:print("Setting RX antenna to `{}'...".format(args.antenna), end='')usrp.set_rx_antenna(args.antenna, chan)print("OK")# if not usrp.has_rx_power_reference(chan):#     antenna = usrp.get_rx_antenna()#     print("ERROR: This device is not calibrated for RX at RF%d-%s!" % (chan, antenna))#     raise RuntimeError("Device not calibrated for selected antenna")print("Requesting RX rate of {} Msps...".format(args.rate / 1e6), end='')usrp.set_rx_rate(args.rate, chan)if abs(usrp.get_rx_rate(chan) - args.rate) > 1.0:print("ALMOST. Actual rate: {} Msps".format(usrp.get_rx_rate(chan) / 1e6))else:print("OK")print("Requesting RX frequency of {} MHz...".format(args.freq / 1e6), end='')tr = uhd.types.TuneRequest(args.freq, args.lo_offset)usrp.set_rx_freq(tr, chan)if abs(usrp.get_rx_freq(chan) - args.freq) > 1.0:print("ALMOST. Actual frequency: {} MHz".format(usrp.get_rx_freq(chan) / 1e6))else:print("OK")print("Requesting RX power reference level of {:.2f} dBm...".format(args.ref_level), end='')# usrp.set_rx_power_reference(args.ref_level, chan)# # ref_level = usrp.get_rx_power_reference(chan)# if abs(ref_level - args.ref_level) > 1.0:#     print("ALMOST. Actual ref level: {:.2f} dBm".format(ref_level))# else:#     print("OK")if args.bandwidth:print("Requesting analog RX bandwidth of {} Msps...".format(args.bandwidth), end='')usrp.set_rx_bandwidth(args.bandwidth, chan)if abs(usrp.get_rx_bandwidth(chan) - args.bandwidth) > 1.0:print("ALMOST. Actual bandwidth: {} MHz".format(usrp.get_rx_bandwidth(chan) / 1e6))else:print("OK")ref_level = 0return (chan, ref_level)RUN = Truedef main():"""gogogo"""args = parse_args()usrp = uhd.usrp.MultiUSRP(args.args)# uhd.usrp.SubdevSpec("A:0 B:1")(chan, ref_level) = setup_device(usrp, args)setup_device2(usrp, args)streamer = get_streamer(usrp, args.channel[0])if args.mode == 'continuous':def handle_sigint(_sig, _frame):print("Caught Ctrl-C, exiting...")global RUNRUN = Falsesignal.signal(signal.SIGINT, handle_sigint)while RUN:try:power_dbfs = uhd.dsp.signals.get_usrp_power(streamer, num_samps=int(args.samps_per_est), chan=chan)except RuntimeError:# This is a hack b/c the signal handler is not gracefully handling# SIGINTbreakpower_dbm = power_dbfs + ref_levelprint("Received power: {:+6.2f} dBm".format(power_dbm))if args.mode == 'one-shot':breakreturn Trueif __name__ == "__main__":sys.exit(not main())

运行结果如下
在这里插入图片描述
MATLAB中读取usrp保存的数据

f = fopen('C:/Users/admin/Desktop/usrppy/uhd/host/examples/python/a.txt','rb')
[data,count] = fread(f,inf,"float32")
plot(data(1:2:10000))
hold on
plot(data(2:2:10000))

在这里插入图片描述


http://www.ppmy.cn/news/560324.html

相关文章

USRP_X310_Device_Recovery手册

概述 本教程介绍了通过JTAG接口刷新FPGA image以恢复USRP X310的过程。因为USRP可以在linux、windows等系统上使用&#xff0c;但是在烧写image时&#xff0c;由于下载的image问题、烧写image过程中突然断电等都会导致USRP X310启动失败&#xff0c;无法发现设备。此时就需要在…

通用软件无线电平台 USRP X310

公司网站&#xff1a;www.luowave.com&#xff0c;欢迎登陆浏览更多产品信息 通用软件无线电平台 USRP X310 USRP X310是一款性能卓越&#xff0c;定位于高端的&#xff0c;服务于下一代软件无线电设计和开发的软件无线电设备。USRP X310由两个收发DC到6GHz&#xff0c;带宽最…

冰点还原卸载教程

1、首先你得先安装好冰点还原&#xff0c;如果没有安装&#xff0c;可以参考下面链接安装&#xff1b; 冰点还原安装以及激活教程 2、重新打开还原软件&#xff0c;按照箭头指示点击自动启动后解冻&#xff0c;然后点击应用并重启&#xff1b; 3、电脑重启后&#xff0c;打开状…

怎么关闭Deep Freeze (冰点还原精灵单机版)

如果你想暂时关闭&#xff0c;更新东西或者安装软件 你可以尝试一下这个&#xff1a;   CTRLALTSHIFTF6呼出DeepFreeze的控制面板&#xff0c;这个时候DeepFreeze会提示你要你输入管理员密码&#xff0c;输入密码后&#xff0c;可以看到所示的控制区。    DeepFreeze默认的…

计算机中冰点还原快捷键,冰点还原软件如何使用,小编教你如何使用冰点还原软件...

当我们的电脑不小心被病毒侵害时&#xff0c;使得一些文件遭受到病毒的破坏&#xff0c;该怎么办呢&#xff1f;我们可以使用冰点还原软件来解决&#xff0c;并且冰点还原软件可以保护您的硬盘免受病毒侵害&#xff0c;它能够很好的抵御病毒的入侵以及人为的对系统有意或无意的…

冰点还原精灵有什么作用

冰点还原精灵是一款超强大的系统还原软件&#xff0c;可使计算机配置免遭破坏&#xff0c;从而将 IT帮助台收到的求助数量和耗费的成本降低 75%。它可以确保每个台式机、笔记本和服务器始终处于部署该软件之初的最佳运行状态。 公司&#xff0f;组织的计算机的可靠性得以显著提…

如何卸载deepfreeze(冰点还原)

deep freeze卸载办法 按AltCtrlShfitF6可以调出设置菜单&#xff0c;设置好密码。 一共有三项设置&#xff1a; 第一项&#xff1a;保护 第二项&#xff1a;开机几次后保护 第三项&#xff1a;不保护 密码进入,第一项是保护,第二项是启动几次电脑后保护,第三个是不保护. 你要更…

冰点还原精灵简介

关于冰点还原精灵这款软件&#xff0c;用过的人都知道&#xff0c;它是一款系统恢复软件。 当把它安装在电脑上&#xff0c;它可在每次开机时&#xff0c;自动将系统还原到预定的初始状态&#xff0c;默认即为安装软件时的良好状态&#xff0c;保护你的系统不被更改&#xff0c…