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

news/2024/12/19 7:07:45/

文章目录

  • 前言
  • 一、收发代码
  • 二、截取一帧 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.ppmy.cn/news/1344255.html

相关文章

ArrayList和LinkedList的区别是什么

ArrayList 和 LinkedList 分别代表了两类不同的数据结构:动态数组和链表。它们都实现了 Java 的 List 接口,但是有着各自独特的特点和性能表现。 1. 数据结构 ArrayList 是基于可调整大小的数组实现的。它允许快速随机访问,因为内部元素可通…

体悟PyTorch的优雅

——PyTorch 是所有的框架中面向对象设计的最优雅的一个。 —— PyTorch的设计最符合人们的思维。 编程是一门艺术,编程可以很优雅。研究可以很优雅,研发也可以很优雅。我们的人生可以很优雅! 1. PyTorch 的优雅 PyTorch 的面向对象设计确实…

Mybatis中的sql-xml延迟加载机制

Mybatis中的sql-xml延迟加载机制 hi,我是阿昌,今天记录一下关于Mybatis中的sql-xml延迟加载机制 一、前言 首先mybatis技术本身就不多介绍,说延迟加载机制之前,那要先知道2个概念: 主查询对象关联对象 假设咱们现…

鸿蒙4.0.0 安装minitouch

鸿蒙4.0.0 安装minitouch ubuntu 系统 minitouch 地址 https://github.com/DeviceFarmer/minitouch 因为 鸿蒙4.0.0 对应安卓12 API版本31 所以启动 minitouch 需要 STFService 地址 https://github.com/openstf/STFService.apk 到release下载最新的STFService.apk &…

【DevOps】产品需求文档(PRD)与常见原型软件

文章目录 1、PRD介绍1.1、概述1.2、前提条件1.3、主要目的1.4、关键内容1.5、表述方式1.6、需求评审人员1.7、一般内容结构 2、需求流程3、常见原型软件3.1、Word3.2、Axure3.2.1、详细介绍3.2.2、应用分类3.2.3、优缺点 3.3、摹客RP3.4、蓝湖3.5、GUI Design Studio 1、PRD介绍…

[UI5 常用控件] 07.SplitApp,SplitContainer

文章目录 前言1. SplitApp1.1 组件结构1.2 Demo1.3 mode属性 2. SplitContainer 前言 本章节记录常用控件SplitApp,SplitContainer。主要功能是在左侧显示Master页面,右侧显示Detail页面。 Master页面和Detail页面可以由多个Page组成,并支持…

Flink CDC 与 Kafka 集成:State Snapshot 还是 Changelog?Kafka 还是 Upsert Kafka?

我们知道,尽管 Flink CDC 可以越过 Kafka,将关系型数据库中的数据表直接“映射”成数据湖上的一张表(例如 Hudi 等), 但从整体架构上考虑,维护一个 Kafka 集群作为数据接入的统一管道是非常必要的,这会带来很多收益。 在 Flink CDC 之前,以 Debezium + Kafka Connect …

大数据Zookeeper--案例

文章目录 服务器动态上下线监听案例需求需求分析具体实现测试 Zookeeper分布式锁案例原生Zookeeper实现分布式锁Curator框架实现分布式锁 Zookeeper面试重点选举机制生产集群安装多少zk合适zk常用命令 服务器动态上下线监听案例 需求 某分布式系统中,主节点可以有…