使用MATLAB驱动USRP-N320实现OFDM自收自发

文章目录

  • 前言
  • 一、收发代码
  • 二、截取一帧 OFDM
  • 三、执行主函数
  • 四、运行结果
  • 五、资源自取


前言

本文作为实验结果记录及测试,方便后面回顾所做的工作。本文基于一台电脑和一台 USRP 设备实现了 OFDM 自发和自收功能
在这里插入图片描述


一、收发代码

ofdm_tx_rx_test.m
核心代码:

%% USRP initation
if strcmp(SYS.Platform, 'N320/N321')radio_tx = comm.SDRuTransmitter(...'Platform',             SYS.Platform, ...'SerialNum',            SYS.Address, ...'MasterClockRate',      SYS.MasterClockRate, ...'CenterFrequency',      SYS.USRPCenterFrequency, ...'Gain',                 SYS.USRPGain, ...'InterpolationFactor',  SYS.USRPInterpolationFactor);radio_rx = comm.SDRuReceiver(...'Platform',             SYS.Platform, ...'SerialNum',            SYS.Address, ...'MasterClockRate',      SYS.MasterClockRate, ...'CenterFrequency',      SYS.USRPCenterFrequency, ...'Gain',                 SYS.USRPGain, ...'DecimationFactor',     SYS.USRPDecimationFactor, ...'SamplesPerFrame',      SYS.USRPFrameLength, ...'OutputDataType',       'double');
elseerror(message('sdru:examples:UnsupportedPlatform',platform));
endradio_tx.ChannelMapping = [1];     % Use both TX channels
radio_tx.UnderrunOutputPort = true;radio_rx.ChannelMapping = [2];     % Use both TX channels
radio_rx.OverrunOutputPort = true;

二、截取一帧 OFDM

process_ofdm.m
核心代码:

function fft_data = process_ofdm(data_filename, Tx_cd)
load(data_filename)
% load('rx_recv_test.mat')
rxmimo2x2 = rx_recv_test;
%% 修改
Ng=64;
Nfft=256;
N_fft=Nfft;
P_f_inter=6;      %导频间隔
nn=1:Ng;
i=1;
for delay=0:5e5yy(i) = rxmimo2x2(nn+delay)'*(rxmimo2x2(delay+nn+Nfft));i=i+1;
end
plot(abs(yy))
val=zeros(1,1010);
pos=zeros(1,1010);
% 找到第一个峰
[val1,pos1]=max(yy(66910:66930));
val(1)=val1;
pos(1)=pos1+66910-1;
% 记录每个峰值对应的索引
for cnt=1:1010-1    [val1,pos1]=max(yy(pos(cnt)+250:pos(cnt)+390)); % 250和390是试出来的val(cnt+1)=val1;pos(cnt+1)=pos1+pos(cnt)+250;
end

这里需要手动修改几个参数,按照下面步骤做:

  • 注释第 1、2 两行,放开第 3 行
    在这里插入图片描述
  • 在第 17 行打个断点
    在这里插入图片描述
  • 运行程序 process_ofdm.m,其中黄框内的就是我们发送的一帧 OFDM
    在这里插入图片描述
  • 将图片放大,找到其中的第一个峰值,这里是 66923
    在这里插入图片描述
    因此上面程序第 19~22 行的 66910 和 66930 是为了将 66923 峰值索引包含在其范围内
% 找到第一个峰
[val1,pos1]=max(yy(66910:66930));
val(1)=val1;
pos(1)=pos1+66910-1;
  • 将第 17 行断点取消,运行 process_ofdm.m,保证程序运行无报错
  • 放开第 1、2 两行,注释第 3 行
    在这里插入图片描述

三、执行主函数

在这里我们对传输的 OFDM 进行误码率计算
main.m
核心代码:

%% 插入保护间隔、循环前缀
Tx_cd=[ifft_data(N_fft-N_cp+1:end,:);ifft_data];%把ifft的末尾N_cp个数补充到最前面%% 相关峰处理
fft_data = process_ofdm(data_filename, Tx_cd);%% 信道估计与插值(均衡)
data3=fft_data(1:N_fft,:); 
Rx_pilot=data3(P_f_station(1:end),:); %接收到的导频
h=Rx_pilot./pilot_seq; 
H=interp1( P_f_station(1:end)',h,data_station(1:end)','linear','extrap');%分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。对超出已知点集的插值点用指定插值方法计算函数值
% factor_64QAM = [3.5361    4.0446    4.7685    5.5782    6.7192    7.6219    8.5716    7.5685    6.4031    4.1531];%% 信道校正
data_aftereq=data3(data_station(1:end),:)./H;%% 并串转换
data_aftereq=reshape(data_aftereq,[],1);
data_aftereq=data_aftereq(1:length(spread_data));
data_aftereq=reshape(data_aftereq,N_sc,length(data_aftereq)/N_sc);%% 解扩
demspread_data = despread(data_aftereq,code);       % 数据解扩%% QPSK/16QAM/64QAM解调
De_Bit = demodulation(demspread_data, MODE);%% 信道译码(维特比译码)
trellis = poly2trellis(7,[133 171]);
rx_c_de = vitdec(De_Bit,trellis,tblen,'trunc','hard');   %硬判决%% 计算误码率
[err,Ber2] = biterr(De_Bit(1:length(code_data)),code_data);%译码前的误码率
[err, Ber] = biterr(rx_c_de(1:length(P_data)),P_data);%译码后的误码率

四、运行结果

以发送和接收的前 30 个数据为例:
在这里插入图片描述
误码率计算:
在这里插入图片描述

五、资源自取

链接:https://mbd.pub/o/bread/ZZqak5xq
在这里插入图片描述


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年美赛数学建模F题思路分析 - 减少非法野生动物贸易 (1)

# 1 赛题 问题F:减少非法野生动物贸易 非法的野生动物贸易会对我们的环境产生负面影响,并威胁到全球的生物多样性。据估计,它每年涉及高达265亿美元,被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目&#xff0c…

paddle环境安装

一、paddle环境安装 如pytorch环境安装一样,首先在base环境下创建一个新的环境来安装paddlepaddle框架。首先创建一个新的环境名叫paddle。执行如下命令。 conda create -n paddle python3.8创建好了名叫paddle这个环境以后,进入到这个环境中&#xff…

ubuntu 安装 kvmQemu no active connection to install on

更新 apt sudo apt update检查虚拟化是否开启 0 不开,其余数字表示开启,开不开都可以,不开性能弱,只能跑 x86 系统 egrep -c (vmx|svm) /proc/cpuinfo安装 sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virt…

用【Java】调用百度千帆大模型并提供流式接口【SSE】响应

代码参考: 千帆API流式调用:PHP、JS、Nodejs、Python、Java、C# 、Go流式示例代码 - 百度智能云千帆社区本文旨在提供一个全面的指南,涵盖了在PHP、JS、Nodejs、Python、Java、C# 中流式调用千帆API的关键技巧和最佳实践。不论您是初学者还是…

React18构建Vite+Electron项目以及打包

一.先创建项目 cnpm create vite 选择React > JavaScript >cd react_vite > cnpm i >npm run dev 二.安装Electron依赖 指定版本相对稳定 cnpm i electron19.0.10 -D cnpm i vite-plugin-electron0.9.3 -D cnpm i electron-builder23.0.1 -D三.创建electron目录…

前端面试拼图-数据结构与算法

摘要:总结一些前端算法题,持续更新! 一、数据结构与算法 时间复杂度-程序执行时需要的计算量(CPU) 空间复杂度-程序执行时需要的内存空间 前端开发:重时间,轻空间 1.把一个数组旋转k步 arr…

C语言——N/自定义类型:联合和枚举

目录 一、联合体 1、联合体类型的声明 2、联合体的特点 3、相同成员的结构体和联合体对比 4、联合体大小的计算 5、联合的一个练习 二、枚举类型 1、枚举类型的声明 2、枚举类型的优点 3、枚举类型的使用 一、联合体 1、联合体类型的声明 像结构体⼀样,…

互联网加竞赛 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的植物识别算法 ** …

京东广告算法架构体系建设--大规模稀疏场景高性能训练方案演变

一、前言 京东广告训练框架随着广告算法业务发展的特点也在快速迭代升级,回顾近几年大致经历了两次大版本的方案架构演变。第一阶段,随着2016年Tensorflow训练框架的开源,业界开始基于Tensorflow开源框架训练更复杂的模型。模型对特征规模和…

【代码随想录】LC 455. 分发饼干

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。 一、题目 1、原题链接 455. 分发饼干 2、题目描述 二、解题报告 1、…

如何在PS5上使用金手指修改游戏

环境:windows PS5 问题:PS5 没有GodHen,无法使用json金手指,PKG金手指比较少 解决办法:使用MultiTrainerv从网络注入PS5,修改进程内存 背景:为了护肝,拒绝刷刷刷 解决过程&#xff…

pytest的常用插件和Allure测试报告

pytest常用插件 pytest-html插件 安装: pip install pytest-html -U 用途: 生成html的测试报告 用法: ​在.ini配置文件里面添加 addopts --htmlreport.html --self-contained-html 效果: 执行结果中存在html测试报告路…

GPT3.5\GPT4系列计算完整prompt token数的官方方法

前言: ChatGPT如何计算token数?https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502 GPT3.5\GPT4系列计算完整prompt token数的官方方法&#xff1…

Xmind 2023 下载安装教程,保姆级教程,小白也能轻松搞定,附安装包

前言 XMind 是一款非常实用的思维导图软件,应用全球最先进的Eclipse RCP 软件架构,全力打造易用、高效的可视化思维软件,强调软件的可扩展、跨平台、稳定性和性能,致力于使用先进的软件技术帮助。 准备工作 1、Win7 及以上系统…

在VM虚拟机搭建NFS服务器

NFS共享要求如下: (1)共享“/mnt/自已姓名的完整汉语拼音”目录,允许XXX网段的计算机访问该共享目录,可进行读写操作。(说明:XXX网段,请根据你的规划,再具体指定&#xf…

C++初阶 内存管理和模板

目录 一、new 1.1什么是new? 1.2为什么要有new? 1.3使用new 1.4 new的超级好处 二、delete 2.1什么是delete? 2.2为什么要有delete? 2.3使用delete 三、 malloc / free和new / delete的共同点和区别 四、浅谈模板 4.1什…

【计网·湖科大·思科】实验七 路由信息协议RIP、开放最短路径优先协议OSPF、边界网关协议BGP

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

2024年第四届工业自动化、机器人与控制工程国际会议 | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第四届工业自动化、机器人与控制工程国际会议(IARCE 2024) 会议时间:2024年7月5 -7日 召开地点:中国成都 大会官网:www.iarce.org 2024年第四届工业自动化、机器人与控制工程国际会…

ffmpeg 时间裁剪之-ss -t与滤镜中trim=start=*:duration=*的区别和联系

背景 工作中遇到的呗。记下来贡着。 滤镜重置时间戳:setptsPTS-STARTPTS 在FFmpeg中,setptsPTS-STARTPTS是一种用于调整视频时间戳(PTS)的滤镜表达式。这个表达式通常用于视频编辑和处理过程中,用于修改视频的时间轴…

正点原子--STM32定时器学习笔记(2)

书接上文,本篇是对基本定时器实验部分进行的总结~ 实验目标:通过TIM6基本定时器定时500ms,让LED0每隔500ms闪烁。 解决思路:使用定时器6,实现500ms产生一次定时器更新中断,在中断里执行“翻转LED0”。 定时…