USRP N310,Gnuradio初探

近期实验需要搭建一个软件无线电环境平台,在琢磨一段时间后,以下是对之前的实验总结一下。

实验平台

  • 硬件:笔记本2台,USRP N310两台,及辅助天线等
  • 软件:在Ubuntu系统下安装Gnuradio3.7
    实验前提,USRP能与电脑建立收发通信

USRP-OFDM发送端框架

在这里插入图片描述
​利用Socket PDU模块与外部程序建立TCP连接,通过外部程序向9090端口发送数据从而写入发送端,经PDU to Tagged Stream将协议数据转换为byte格式数据,再经过CRC32给数据加上循环冗余校验码,再分两路生成数据头部和数据载荷部分,分别进行BPSK与QPSK映射,通过Tagged Stream Mux模块组装在一起,然后经过OFDM调制部分,分别进行载频子波分配、加入导频系列、加入同步字与循环前缀,再通过Multiply Const进行约束,防止波形发生非线性失真,Tag Gate模块抑制标记符号向下传递,最后通过UHD:USRP Sink 模块连接硬件设备,对数据进行DAC转换,数字变频发送到环境空间。

发送端模块简介

Socket PDU:与外部程序建立socket连接,对整个流图进行数据输入。

PDU to Tagged Stream:将协议数据转化为固定长度byte类型数据,并给数据加上长度标记。

Stream CRC32:给数据尾部加上32位(4字节)循环冗余校验-----信道编码。

Protocol Formatter:利用数据头生成对象创建一个6字节的数据头,包含数据帧长度,当前数据帧号等。

Repack Bits:对数据进行重新打包,8bits一组转换为2bits一组或者1bit一组的数据,为后续进行BPSK、 QPSK映射,此过程不存在数据bit丢失。

Chunks to Symbols:根据Symbol Table将byte数据进行浮点数或者复数映射,byte型数据转换为复数型数 据。

Tagged Stream Mux:将头部BPSK符号与载荷QPSK符号组装在一起进行OFDM调制。

OFDM Carrier Allocator:OFDM子载波分配,分配数据子载波,导频子载波,同步子载波,直流子载波。

FFT:对分配后的子载波进行傅里叶变换,完成OFDM调制。

OFDM Cyclic Prefixer:给OFDM加入循环前缀,防止ofdm符号间干扰(ISI)。

Multiply Const:乘常数模块,乘以小于1的值,限制幅度,防止发送非线性失真。

Tag Gate:阻止标记符号向后延续。

其他参数:

protocol parser: 协议分析器

FEC: 前向纠错编码,送入传输信道之前

MSB: 最高位有效

Becimation: 抽取,转变频率

OFDM符号结构

  • ofdm输出标签:载波偏移,信道均衡系数,数据帧,接收时间

  • ofdm子载波: 左6个子载波[-32,-27],右5个子载波[26,31]为虚拟子载波

​ 不使用载波为0,———减少带外功率,抑制ACI(相邻信道干扰)

  • 一个OFDM符号:包含 虚拟子载波直流子载波射频子载波有效数据子载波

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfNVPpsv-1601025338052)(D:\实验作图记录\OFDM符号结构.jpg)]

​ 以进行64FFT变换为例,总载波个数为64,除去虚拟子载波,直流子载波,射频子载波,剩余有效数据子载波48个,数据头部Head采用BPSK调制,(6 * 8)/1一个符号用一位比特表示,数据载荷加上校验码Payload部分采用QBSK调制,((96+4 )* 8)/2,一个符号用两个比特位表示。数据生成头部加载荷总共需要OFDM符号个数:
( 6 ∗ 8 ) / 1 + ( 96 + 4 ) ∗ 8 / 2 = 448 (6*8)/1 + (96 + 4 )*8 / 2 = 448 68/19648/2=448

448 / 48 ≈ 10 个 O F D M 符 号 448 / 48 ≈ 10 个OFDM符号 448/4810OFDM

​ 加上2个OFDM符号同步字,发送一次数据共需要 12 个OFDM符号周期。

发送端外部TCP客户端程序

import socket
import time

"""
    tcp 客户端,输入发送内容,从文件读出数据,按照每次96字节方式发送

"""

def main1():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('192.168.10.3', 9090))
    while True:
        tmp = input('请输入您要发送的内容:')
        if tmp != 'exit':
            s.send('{}\n'.format(tmp).encode('utf-8'))
            print('{}\n'.format(tmp).encode())
        else:
            break


def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('192.168.10.3', 9090))

    with open('./SendData', 'r', encoding='utf-8') as R_file:
        while True:
            content = R_file.read(96)
            if content != '':
                s.send('{}'.format(content).encode('utf-8'))
                print(content, end='')
                time.sleep(0.01)

            else:
                print('数据发送结束!!!')
                s.close()
                break


if __name__ == '__main__':
    main()
    # main1()

USRP-OFDM接收端框架

在这里插入图片描述
​ 通过UHD:USRP Source模块接收空间中的电磁数据,通过去频偏,同步去数据头分离出载荷,OFDM解调,IFFT变换,解符号映射,CRC32校验,再通过Socket PDU与外部TCP服务器连接,解码恢复出发送的数据。

接收端模块简介

UHD USRP Source:与硬件USRP N310 连接,接收空间中电磁数据,实现数字下变频,ADC变换,转换为基 带信号输入给Gunradio软件款图。

Schmidl & Cox OFDM Synch​:实现符号定时同步,除去小数部分载波频偏​。

Delay:延时模块,延迟一个ofdm符号周期,fft_len + 循环前缀(64+16)。

Frequency Mod:频率调制模块,产生一个和载波频偏对应的序列,与接收数据流相乘,达到去载波频偏。

Multiply:两数据相乘,去除小数载波频偏,消除ACI干扰。

Head/Payload Demux:根据定时信息与帧头信息,将数据头与载荷部分分开,输入信号分别为去除载波频偏 的数据流,触发信息,解码后的帧头信息。输出为帧头部数据,载荷数据。

FFT:进行逆傅里叶变换。

OFDM Channel Estimation:信道评估模块,得到整数倍频偏和系统频域响应。

OFDM Frame Equalizer:OFDM帧均衡模块,纠正整数倍频偏,对接收信号进行均衡。

OFDM Serializer:逆OFDM子载波分配,与发送端OFDM Carrier Allocator 相逆的过程,找到携带数据的48 个子载波,并提取出其信息。

Constellation Decoder:解符号映射,分别进行逆BPSK,QPSK映射,转化为byte类型数据。

Repack Bits:与发送端相逆的过程,字节重新组合,不丢失比特信息。

Stream CRC32:循环冗余校验,校验数据是否出错并输出。

Tagged Stream to PDU:byte类型数据转换为协议数据。

Socket PDU:与外部程序建立socket连接。

接收端外部TCP服务端程序

import socket

"""
    tcp 服务端,接收客户端发送的数据

"""

def main():
    host = '192.168.10.1'
    port = 9090
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(1)
    client_socket, client_add = server_socket.accept()
    while True:
        data = client_socket.recv(1024)
        data = data.decode('utf-8')
        print(data)
        # client_socket.close()


if __name__ == '__main__':
    main()

TCP客户端服务器注意事项

  • TCP服务器端需要先绑定IP与端口,等待客户端连接,客户端则不需要
  • TCP客户端需先与服务器端建立连接才能通信
  • TCP 三次握手

输入数据编码选择

  • ASCII:128个字符,单字节编码,目前只使用低7位二进制表示,保留最高位,A-65,a-97,0-48

  • UTF-8:可变长字节编码,1-4字节:

    • US-ASCII:1字节
    • 拉丁文,希腊字母,阿拉伯文:2字节
    • 中日韩,东南亚文字:3字节
    • 少数语言字符:4字节
  • GBK:汉字编码字符集

IP数据帧传输效率

IP数据帧:MTU,包含头部信息14个字节,尾部校验和FCS 4个字节,以太网数据帧的传输效率:
α = ( T − 14 − 4 ) / T α=(T-14-4)/T α=(T144)/T

参考资料

1.USRP—OFDM通信实验报告.
2.GNU Radio教程.
3.Linux系统下搭建USRP + GNU Radio开发环境.
4.OFDM调制理解.
5.PDU(协议数据单元).
6.Python学习笔记——网络-TCP.

  • 8
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
USRP( Universal Software Radio Peripheral )是一款软件无线电外围设备,可与GNU Radio等各种软件无线电系统结合使用,为用户提供灵活、高性能的软件定义无线电系统解决方案。而GNU Radio则是一款免费开源的软件工具集,支持搭建软件定义无线电系统。当结合使用USRP和GNU Radio时,可以实现广泛的无线电应用。 USRP设备可以配置为支持多种无线电协议,例如Wi-Fi、Bluetooth、2G/3G/4G/LTE等。用户可以通过GNU Radio框架内编写的软件定义的无线电信号处理流程,通过USRP设备实现对各种信号的识别、接收、分析等多种功能。因此,在无线电通信、无线电监测、无线电取证等方面,USRP和GNU Radio结合使用,为各种无线电应用提供了高度灵活性和可定制性。 除此之外,USRP和GNU Radio还具有广泛的应用场景。在无线电研究领域,研究者可以通过USRP和GNU Radio搭建软件定义无线电系统,进行无线电频谱利用率、信道特性、调制解调、遥感等技术的研究。在教育领域,USRP和GNU Radio也可以被用于教学,让学生了解无线电通信、无线电协议、信号处理等方面的知识。同时,在无人机遥控、智能交通等智能化领域,USRP和GNU Radio也可以实现信号的解析、控制等功能,提高信息处理能力。 总之,USRP和GNU Radio结合起来,可以为广泛的无线电应用提供高品质、高度可定制、广泛适配等特点的解决方案。越来越多的用户在各种领域中使用它,以满足不断发展的无线电技术需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值