使用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.hqwc.cn/news/449538.html

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

相关文章

Linux 系统开始配置

文章目录 备份源为root 设置密码安装基本工具切换root 用户删除snap从 Ubuntu 移除 Snap 后使用 deb 文件安装软件商店和 Firefox在 Ubuntu 系统恢复到 Snap 软件包总结 删除 vim安装neovim在线安装neovim压缩安装neovim安装lazyvim安装剪切板 安装qt配置 Qt 环境不在sudoers文…

预处理详解(上)

⽬录: 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作⽤的宏参数 5. 宏替换的规则 6. 宏函数的对⽐ 7. #和## 8. 命名约定 9. #undef 10. 命令⾏定义 11. 条件编译 12. 头⽂件的包含 13. 其他预处理指令 正⽂开始 1. 预…

Facebook未来展望:社交媒体的下一个篇章

社交媒体一直是连接人与人之间的纽带,而Facebook则一直在推动这一领域的发展。随着科技不断演进和社会需求的不断变迁,Facebook正积极筹谋社交媒体的下一个篇章。本文将深入剖析Facebook的未来展望,探讨其在社交媒体领域所迎接的新时代。 1. …

2023年计算机视觉领域突破性研究有哪些?

B站:啥都会一点的研究生公众号:啥都会一点的研究生 ​回顾2023年,计算机视觉领域有哪些较为突出的研究成果?一起看看吧 SAM(Segment Anything Model) SAM 由 Meta AI 开发,是 CV 中分割任务的基础模型,彻…

Lambda表达式(匿名函数)

C11中引入了lambda表达式,定义匿名的内联函数。 我们可以直接原地定义函数而不用再跑到外面去定义函数跳来跳去。 同时在stl的排序上也有作用。 [capture] (parameters) mutable ->return-type {statement}下面逐一介绍各个参数的含义. [capture] : 捕获&#…

【Rust】——rust前言与安装rust

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

【gcc】webrtc发送侧计算 丢包率

大神的分析 : 提到: 每当收到cc-feedback或者收到RR-report的时候就能统计出丢包率,在cc-controller中就会调用SendSideBandwidthEstimation::UpdatePacketsLost()去更新丢包率,同时进行码率预估 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_b…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第6章 逻辑斯谛回归与最大熵模型(1)6.1 逻辑斯谛回归模型

文章目录 第6章 逻辑斯谛回归与最大熵模型6.1 逻辑斯谛回归模型6.1.1 逻辑斯谛分布6.1.2 二项逻辑斯谛回归模型6.1.3 模型参数估计6.1.4 多项逻辑斯谛回归 《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第3章 k邻近邻法 《统计学习…

Vue2+ElementUI 弹窗全局拖拽 支持放大缩小

拖拽组件 dialogDrag.vue <template><div></div> </template> <script>export default {name: dialogDrag,data() {return {originalWidth: null,originalHeight: null}},created() {this.$nextTick(()>{this.dialogDrag()})},mounted() {}…

win wsl2 Ubuntu-22.04 设置时间为国内时间

使用 wsl2 安装 Ubuntu-22.04 后 时间不正确&#xff0c;主要有两个原因 时区设置不正确&#xff0c;国内为京八区。 时区正确后&#xff0c;没有同步时间。&#xff08;大部分人容易忽略这一点&#xff09; Linux 默认情况下使用 UTC 格式作为标准时间格式&#xff0c;如果在…

Go语言的100个错误使用场景(11-20)|项目组织和数据类型

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…

嵌入式系统学习(一)

嵌入式现状&#xff08;UP经历&#xff09;&#xff1a; 大厂的招聘要求&#xff1a; 技术栈总结&#xff1a; 产品拆解网站&#xff1a; 52audio 方案查询网站iotku,我爱方案网&#xff0c; 主要元器件类型&#xff1a;