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

2023-11-11

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 uhd

def parse_args():
    """Parse the command line arguments"""
    parser = argparse.ArgumentParser()
    parser.add_argument("-a", "--args", default="",  # ip=192.168.10.3
                        help="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 = 0
    return (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 = 0
    return (chan, ref_level)

RUN = True

def 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 RUN
            RUN = False
        signal.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
            # SIGINT
            break
        power_dbm = power_dbfs + ref_level
        print("Received power: {:+6.2f} dBm".format(power_dbm))
        if args.mode == 'one-shot':
            break
    return True

if __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))

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows环境下使用UHD PythonAPI开发USRP X310 的相关文章

  • Pandas 字符串提取所有匹配项

    我正在学习 pandas 系列字符串方法中的正则表达式操作 我能够从字符串中提取第一个数字 但我的正则表达式与第二个数字不匹配 如何捕获这两个数字 注意第二行 第二个元素在这里是 NAN CODE import pandas as pd d
  • 在 Python 中绘制分类数据的三个维度

    我的数据包含三个我试图可视化的分类变量 城市 五个之一 职业 四种之一 血型 四种之一 到目前为止 我已经成功地以一种我认为易于使用的方式对数据进行了分组 import numpy as np pandas as pd Make data
  • 小数缓存是Python规范中定义的还是一个实现细节?

    Python 似乎有一个所谓的 小数字缓存 用于存储 5 到 256 范围内的数字 我们可以使用以下程序来演示这一点 for i in range 7 258 if id i id i 0 print i is cached else pr
  • Django 未在 404 页面上应用应用程序中的 CSS 文件

    姜戈3 0 8 Python 3 7 x 我有一个包含一些应用程序的 Django 项目 我正在尝试为 400 403 404 500 错误制作一些 默认 错误页面 我已经这样做了 并显示了适当的模板 但没有任何样式或 JS 在 404 错
  • 使用 boto3 从 s3 下载时使用 filename 作为文件名

    我正在使用 boto3 上传文件 如下所示 client boto3 client s3 aws access key id id aws secret access key key client upload file tmp test
  • 如何使用 xlrd 将新列和行添加到 .xls 文件

    如何向 xlrd 中的工作表添加新列和 或行 我有一个使用 open workbook 读取的 xls 文件 我需要在第一张表中添加一个新列 bouncebacks 然后在该表中添加新行 但我在 xlrd 文档中找不到任何显示如何添加新行和
  • pandas to_sql sqlalchemy 与 secure_transport 的连接

    我正在尝试将数据发送到具有 require secure transport ON 的服务器上的 mysql 数据库 当我尝试使用以下代码连接到它时 import pandas as pd import pymysql from sqlal
  • 根据给定列表中的值替换列中的值[重复]

    这个问题在这里已经有答案了 我在数据框中有一列 仅允许定义列表中存在的值 例如 给定列表 l1 1 2 5 6 如果列表中不存在列中的值 我需要将每个值替换为 0 column Expected column 1 1 5 5 2 2 3 0
  • Python,多线程,获取网页,下载网页

    我想在一个站点批量下载网页 我的 urls txt 文件中有 5000000 个 url 链接 大约有300M 如何让多线程链接这些网址并下载这些网页 或者如何批量下载这些网页 我的想法 with open urls txt r as f
  • 如何在交互式绘图(Python)中获得鼠标指向的(x,y)位置?

    我使用 ipython 笔记本 带有魔法 matplotlib nbagg 我正在审查matplotlib widget Cursor但仅查看光标widgets Cursor http matplotlib org 1 4 3 exampl
  • 如何在 Pytorch 中将一维 IntTensor 转换为 int

    如何将一维 IntTensor 转换为整数 这 IntTensor int 给出错误 KeyError Variable containing 423 torch IntTensor of size 1 我所知道的最简单 最干净的方法 In
  • 如何绘制多类分类器的精度和召回率?

    我正在使用 scikit learn 我想绘制精度和召回曲线 我正在使用的分类器是RandomForestClassifier scikit learn 文档中的所有资源都使用二元分类 另外 我可以绘制多类的 ROC 曲线吗 另外 我只找到
  • 使用 Python 脚本打开特定文件类型?

    如何使 Python 脚本成为特定文件类型 例如 foo 的默认应用程序 例如 当我双击 Finder Explorer 中的文件时 我希望该文件在 Python 脚本中打开 这可以在 Win 和 或 OS X 中实现吗 如果重要的话 该应
  • 在python中安装scipy模块时出错

    我正在尝试使用 pip 在 python 中安装 scipy 模块 它显示以下错误 Command c users sony appdata local programs python python35 32 python exe u c
  • 如何加速 pandas 字符串函数?

    我正在使用 pandas 矢量化 str split 方法来提取从 上的拆分 返回的第一个元素 我还尝试使用 df apply 与 lambda 和 str split 来产生等效的结果 使用 timeit 时 我发现 df apply 的
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • Scrapy 抓取并跟踪 href 中的链接

    我对 scrapy 很陌生 我需要从 url 的主页跟踪 href 到多个深度 再次在 href 链接内我有多个 href 我需要遵循这些href 直到到达我想要抓取的页面 我的页面的示例 html 是 初始页 div class page
  • Pip 突然使用了错误版本的 Python

    在 os x 上使用 pip 时遇到一个奇怪的问题 据我所知 快速查看我的 bash history 似乎可以确认 我最近没有对我的配置进行任何更改 唉 pip 命令似乎突然使用了与以前不同的 python 版本 到目前为止 我使用命令 p
  • Flask 扩展未在 app.extensions 中注册

    我想访问在我的 Flask 应用程序上注册的一些扩展 我尝试使用app extensions 但我初始化的一些扩展不在字典中 from flask import current app current app extensions get
  • 在多个图表上绘制一条线

    I don t know how this thing is called or even how to describe it so the title may be a little bit misleading The first a

随机推荐

  • 数据库分库分表

    一 为什么要分库分表 如果一个网站业务快速发展 那这个网站流量也会增加 数据的压力也会随之而来 比如电商系统来说双十一大促对订单数据压力很大 Tps十几万并发量 如果传统的架构 一主多从 主库容量肯定无法满足这么高的Tps 业务越来越大 单
  • Linux下Socket编程

    什么是Socket Socket接口是TCP IP网络的API Socket接口定义了许多函数或例程 程式员能够用他们来研发TCP IP网络上的应用程式 要学Internet上的TCP IP网络编程 必须理解Socket接口 Socket接
  • 七. Kubernetes Objects对象,对象状态与yaml

    目录 一 基础概念理解 二 k8s 对象中的spec与status 三 如何编写yaml 一 基础概念理解 Kubernetes Objects 官方地址 在k8s中所有操作资源实体都可以称为对象 先下图中的这些 都可以称为对象 不同对象功
  • 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

    不同类型内中断的区分 中断类型码 8086cpu中在下面4种情况下会产生内中断 1 除法错误 如之前提到的除法溢出 2 单步执行 3 执行into指令 4 执行int指令 那么当内中断发生时cpu如何来区分到底是哪种中断源呢 通过中断类型码
  • 代码随想录训练营day9

    题目一 实现strStr 力扣题目链接 题目描述 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标 下标从 0 开始 如果 needle 不是 haysta
  • GLSL的in、out存储限制符使用错误

    在GLSL中用in修饰的变量表示传入的数据 用out修饰的变量表示传出的数据 通过这样可以实现顶点着色器向片段着色器传递数据 但要注意这个变量的命名要相同 不相同的话 片段着色器是获取不到从顶点着色器传入的数据的 1 顶点着色器 versi
  • unity打包技巧

    打包准备 1 android 需要jdk 和android sdk 如果有使用C 的库 还需要NDK 只有将 so文件放在 Assets Plugins Android libs下 Unity才会将 so文件识别为共享库 并在打包时将之拷贝
  • 分布式事务-seata AT模式-强一致性。

    目录 1 seata原理 2 关键组件 3 seate服务端参数 4 微服务配置 5 业务流程 6 依次启动eureka seate服务器 微服务 1 seata原理 Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的
  • element-ui 表格一行显示多行内容并实现多行内某一行列合并

    这是加上边框的 去掉边框后这个表格看着更明显一点 表格一行放多行内容 并让第二行进行列合并 第一行不合并
  • 详解数据结构之顺序栈的基本操作(C语言描述)

    1 栈是线性表的特例 因此栈的顺序存储其实也就是线性表顺序存储的简化 我们称之为顺序栈 线性表是采用数组来实现的 因此顺序栈也采用数组来实现 2 栈的结构定义 elementype类型根据实际情况而定 这里假设为int类型 栈的结构体定义为
  • 时间序列ARIMA滚动预测

    什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列 时间序列分析就是通过观察历史数据预测未来的值 在这里需要强调一点的是 时间序列分析并不是关于时间的回归 它主要是研究自身的变化规律的 这里不考虑含外生变量的时间序列 为什么用py
  • C语言结构体struct的比较

    两个struct结构体进行比较 首先不能直接比较 struct A a b a和b相比是错误的 其次不能进行内存比较 如下 程序运行的结果会如何 void DiffStructWithMultiVar struct A a 0 struct
  • 远程连接身份验证错误,找不到加密Oracle修正(正解)

    出现问题 使用远程连接弹出一个对话框 提示 发生身份验证错误 要求的函数不受支持 方法一 win r 输入gpedit msc 找到下面路径 策略路径 计算机配置 gt 管理模板 gt 系统 gt 凭据分配 设置名称 加密 Oracle 修
  • 图像质量评估

    图像质量评估 http jingyan baidu com article cbf0e500f5505a2eab28936e html 客观评价方法 图像质量的客观评价方法是根据人眼的主观视觉系统建立数学模型 并通过具体的公式计算图像的质量
  • Java基础——集合

    首先呢 给大家讲一下集合的由来 java的思想是面向对象思想 如果想统一的管理所有的对象 就涉及到用容器来储存对象 而对象数组是可以存储对象的 但是数组有一个缺点就是长度固定 为了突破这一限制 集合就应运而生了 数组和集合的优缺点 长度 数
  • 代码随想录刷题--(链表篇)19. 删除链表的倒数第 N 个结点 ---快慢指针法

    题目链接 https leetcode cn com problems remove nth node from end of list 代码随想录链接 https programmercarl com 0019 删除链表的倒数第N个节点
  • 前端实现换肤功能

    项目背景 由于项目要求 需要前端对不同的企业用户展示不一样的颜色 也就是简单的更改肤色 本来使用前端框架会很容易解决 但是公司目前的架构不是很好 前后端分离也没有那么彻底 web工程还是搭配jsp 没办法 只好用最纯粹的css来实现换肤要求
  • 一个月拿下十几份测试岗offer的简历是什么样子的?

    一 简历模板 在应聘之前 不能不聊一聊简历 简历是职场的敲门砖 是获得offer的通行证 那样对一个初级测试工程师来说 应该如何写简历呢 可能对萌新来说 完完全全不知道怎么下手 在这里大家从0开始写 第一步你需要去找一份简历模板 可以是网络
  • 实时系统RTX之理解一

    文献来源 http wzhyblog yo2 cn articles e5 ae 9e e6 97 b6 e7 b3 bb e7 bb 9frtx e5 ae 98 e6 96 b9 e6 96 87 e6 a1 a3 e4 b8 ad e
  • Windows环境下使用UHD PythonAPI开发USRP X310

    目录 UHD介绍 安装UHD 烧写X310固件 安装uhd python API 测量功率实例 UHD介绍 UHD是USRP开源软件无线电硬件架构的底层软件包 包含上位机和USRP设备中的FPGA的bit文件两个部分 提供了上位机控制FPG