基于OFDM的通信系统模拟实现

news2024/11/18 15:47:39

文章目录

  • 前言
  • 一、OFDM 基本知识
    • 1、OFDM 理论知识及仿真
    • 2、OFDM 调制
    • 3、OFDM 解调
  • 二、2ASK(二进制振幅键控)
    • 1、2ASK 基本原理
      • ①、OOK
      • ②、2ASK
    • 2、2ASK/OOK 信号产生方法
    • 3、2ASK/OOK 信号解调方法
  • 三、基于 OFDM 的通信系统模拟实现
    • 1、整体流程
    • 2、MATLAB 源码
    • 3、仿真结果
      • ①、OFDM 频谱分析
      • ②、OFDM 发送及接收信号时域图
      • ③、OFDM 发送及接收信号频谱图
      • ④、OFDM 误码率
  • 四、资源自取


前言

本文讲解了基于 OFDM 的通信系统模拟实现。


一、OFDM 基本知识

1、OFDM 理论知识及仿真

有关 OFDM 相关理论知识及仿真参考我之前写过的博客:OFDM原理及MATLAB仿真

2、OFDM 调制

IDFT、IFFT

3、OFDM 解调

DFT、FFT

二、2ASK(二进制振幅键控)

因后面 OFDM 载波调制时每个子载波使用 2ASK 调制,因此这里对 2ASK 进行一个理论的讲解

1、2ASK 基本原理

振幅键控是利用载波的幅度变化来传递数字信息,而其频率和初始相位保持不变。在 2ASK 中,载波的幅只有两种变化状态,分别对应二进制信息 “0” 或 “1”。

①、OOK

一种常用的、也是最简单的二进制振幅键控方式称为通一断键控(OOK),其表达式为:
e O O K ( t ) = { A c o s ω c t 以概率 P 发送 “1” 时 0 以概率 1-P 发送 “0” 时 e_{OOK}(t)= \begin{cases} Acos\omega_ct& \text{以概率 P 发送 “1” 时}\\ 0& \text{以概率 1-P 发送 “0” 时} \end{cases} eOOK(t)={Acosωct0以概率 P 发送 “1” 以概率 1-P 发送 “0” 

典型波形如下图所示:
在这里插入图片描述

2ASK/OOK信号时间波形

可见,载波在二进制基带信号 s ( t ) s(t) s(t) 控制下通一断变化,所以这种键控又称为通一断键控。在 OOK 中,某一种符号(“0” 或 “1”)用有没有电压来表示

②、2ASK

2ASK 信号的一般表达式为:
e 2 A S K ( t ) = s ( t ) c o s ω c t e_{2ASK}(t)=s(t)cos\omega_ct e2ASK(t)=s(t)cosωct
其中
s ( t ) = ∑ n a n g ( t − n T B ) s(t)=\sum_na_ng(t-nT_B) s(t)=nang(tnTB)
式中: T B T_B TB 为码元持续时间; g ( t ) g(t) g(t) 为持续时间为 T B T_B TB 的基带脉冲波形。为简便起见,通常假设 g ( t ) g(t) g(t) 是高度为 1、宽度等于 T B T_B TB 的矩形脉冲; a n a_n an 是第 n n n 个符号的电平取值。若取
a n = { 1 概率为 P 0 概率为 1-P a_n= \begin{cases} 1& \text{概率为 P}\\ 0& \text{概率为 1-P} \end{cases} an={10概率为 P概率为 1-P
则相应的 2ASK 信号就是 OOK 信号

2、2ASK/OOK 信号产生方法

2ASK/OOK 信号的产生方法通常有两种:模拟调制法(相乘器法)和键控法,相应的调制器如下图所示。图(a)就是一般的模拟幅度调制的方法,用乘法器(multiplier)实现;图(b)是一种数字键控法,其中的开关电路 s ( t ) s(t) s(t)控制
在这里插入图片描述

2ASK/OOK信号调制器原理框图

3、2ASK/OOK 信号解调方法

与 AM 信号的解调方法翌阳。2ASK/OOK 信号也有两种基本的解调方法:非相干解调(包络检波法)相干解调(同步检测法),相应的接收系统组成方框图如下图所示:
在这里插入图片描述

2ASK/OOK信号的接收系统组成方框图

与模拟信号的接收系统相比,这里增加了一个“抽样判决器”方框,这对于提高数字信号的接收性能是必要的。

下图给出了 2ASK/OOK 信号非相干解调过程的时间波形
在这里插入图片描述

2ASK/OOK信号非相干解调过程的时间波形

2ASK 是 20 世纪初最早运用于无线电报中的数字调制方式之一。但是,ASK 传输技术受噪声影响很大。噪声电压和信号一起改变了振幅。在这种情况下,“0” 可能变为 “1”,“1” 可能变为“0”。可以想象,对于主要依赖振幅来识别比特的 ASK 调制方法,噪声是一个很大的问题。由于 ASK 是受噪声影响最大的调制技术,现已较少应用,不过,2ASK 常常作为研究其他数字调制的基础,还是有必要了解它。

三、基于 OFDM 的通信系统模拟实现

1、整体流程

基于 OFDM 的通信系统模拟实现的整体流程图大致如下图所示:
在这里插入图片描述

2、MATLAB 源码

% 这段代码是一个基于正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)
% 的通信系统的模拟实现。下面是对代码进行详细分析的解释:

% 这些命令用于清除命令窗口、清除工作区变量和关闭所有打开的图形窗口
clc;            % 清除命令窗口
clear;          % 清除工作区变量
close all;      % 关闭所有打开的图形窗口

% ===============================变量参数定义=============================================

% 接下来的几行代码定义了一些变量和参数
M  = 8;			% 子载波数,指定了OFDM系统中的子载波数量
fc   = 1e6;		% 主载波频率/Hz,表示OFDM系统中的主载波频率
fsub = 1e3;		% 子载波频率间隔,表示相邻子载波之间的频率间隔
fsig = fc:fsub:fc+(M-1)*fsub; % 频率序列,计算出每个子载波的频率

% 下面的几行代码定义了一些与时间和采样相关的参数
T  = 0.001;		% 子载波持续时间,表示每个子载波的时间长度
fs = 10e6;		% 采样频率/Hz,表示对信号进行采样的频率
ts = 1/fs;		% 采样时间间隔,表示相邻采样点之间的时间间隔
t  = 0:ts:T-ts;	% 一个符号周期的时间矢量,生成了一个从0到T的时间向量,用于表示一个符号周期内的时间

% =============================== OFDM 频谱分析=============================================

% 接下来的代码段生成了子载波信号,并进行了频谱分析
c  = zeros(M,length(t));% c 是一个大小为 M×length(t)(目前这里是8*10000) 的矩阵,用于存储 M 个子载波的信号
NN = length(t)*16;      % 计算了扩展后的采样点数,乘以 16 是为了提高频谱计算的分辨率,NN=10000*16
XN = zeros(M,NN);       % XN 是一个大小为 M×NN (目前这里是8*160000)的矩阵,用于存储每个子载波信号的频域表示
f0 = fs/NN;             % 采样间隔 = 采样率 / 采样点数
f  = (0:NN-1)*f0;       % 采样间隔序列,计算出每个采样间隔的开始频率
for k = 1:M
	c(k,:)  = exp(1j*2*pi*fsig(k)*t);   % 生成一个复指数形式的子载波信号,通过循环遍历每个复指数形式的子载波,将复指数形式的子载波信号存储在矩阵 c 中
	XN(k,:) = fft(c(k,:),NN);           % 并对每个子载波的信号进行快速傅里叶变换(FFT)得到其频域表示,并将结果存储在矩阵 XN 中
end

% 最后,使用 plot 函数将每个子载波的频谱绘制在一张图上,并设置图像的标题、坐标轴标签和图例。
figure;
plot(f,abs(XN(1,:)), f,abs(XN(2,:)), f,abs(XN(3,:)), f,abs(XN(4,:)), f,abs(XN(5,:)), f,abs(XN(6,:)), f,abs(XN(7,:)), f,abs(XN(8,:)));
legend('1000kHz子载波', '1001kHz子载波', '1002kHz子载波', '1003kHz子载波', '1004kHz子载波', '1005kHz子载波', '1006kHz子载波', '1007kHz子载波');
axis([995e3 1012e3 -inf inf]);  % x 轴范围设置成[995000,1012000],y 轴范围最小值和最大值都为无穷
title('频域中 子载波分布图');
ylabel('幅度');
xlabel('频率/Hz');

% =============================== OFDM 载波调制=============================================

% OFDM载波调制(这里每个子载波使用 2-ASK 调制,实际上每个子载波使用PSK、QAM调制也可以)
symbol = M;                         % 定义了发送的符号数,这里与子载波数相等
msg  = randi([0 1],1,symbol);       % 并行发送 8bit 数据
% msg  = [1 1 0 1 1 1 0 1];         % 并行发送 8bit 数据
tx = zeros(1,length(t));            % tx 的大小是 1*10000,用来存储发射信号
for k = 1:length(msg)               % 通过循环遍历每个子载波,将每个子载波信号乘以对应的数据位(0或1),并将它们叠加得到最终的发送信号
	tx = tx + msg(k)*c(k,:);        % 子载波叠加
end
XN_tx = fft(tx,NN);                 % 使用FFT对发送信号 tx 进行频谱分析,并将结果存储在 XN_tx 中
disp(['发送数据: ' num2str(msg)]);  % 显示发送的数据 msg

% =============================== OFDM 空中信道传输=============================================

% 空中信道传输
sigma = sum(abs(tx))/length(tx) * 0.9;  % sigma 是根据发送信号 tx 的幅度计算得到的噪声标准差
rx    = tx + sigma*rand(1,length(tx));  % rx 是将发送信号 tx 加上高斯白噪声(AWGN)后得到的接收信号,加入AWGN(实际上只影响直流分量)
XN_rx = fft(rx,NN);                     % 使用FFT对接收信号 rx 进行频谱分析,并将结果存储在 XN_rx 中

% =============================== OFDM 解调=============================================

% OFDM解调
msg_demodulation = zeros(1,symbol);         % msg_demodulation 是一个大小为 1×symbol 的向量,用于存储解调后的数据
for k = 1:symbol                            % 通过循环遍历每个符号,利用FFT结果进行解调。如果接收到的信号在对应子载波的频谱中的幅度大于阈值(5e3),则将解调后的数据位设置为1,否则为0。
	if(abs(XN_rx(16001 + 16*(k-1))) > 5e3)  % 使用FFT结果来解调
		msg_demodulation(1,k) = 1;
	end
end
disp(['收到数据: ' num2str(msg_demodulation)]);

bit_error_cnt = 0;                              % bit_error_cnt 用于存储比特错误的数量,初始值为0。
for k = 1:symbol
	if(msg_demodulation(k) ~= msg(k))           % 如果解调后的数据位与发送的数据位不一致
		% 当判定的接收比特与发送比特不一致时,认为判定错误
		bit_error_cnt = bit_error_cnt + 1;
	end
end
bit_error_percent = bit_error_cnt/symbol;       % 计算误码率 bit_error_percent,即比特错误的数量除以总的符号数。
disp(['误码率: ' num2str(bit_error_percent)]);


figure;
subplot(2,1,1);plot(t,real(tx));axis([-inf inf -inf inf]);title('OFDM发送信号 时域图');
ylabel('幅度');
xlabel('时间/s');
subplot(2,1,2);plot(t,real(rx));axis([-inf inf -inf inf]);title('OFDM接收信号 时域图');
ylabel('幅度');
xlabel('时间/s');

figure;
subplot(2,1,1);plot(f,abs(XN_tx));axis([995e3 1012e3 -inf inf]);title('OFDM发送信号 频谱');
ylabel('幅度');
xlabel('频率/Hz');
subplot(2,1,2);plot(f,abs(XN_rx));axis([995e3 1012e3 -inf inf]);title('OFDM接收信号 频谱');
ylabel('幅度');
xlabel('频率/Hz');

3、仿真结果

①、OFDM 频谱分析

请添加图片描述

OFDM 频谱分析

②、OFDM 发送及接收信号时域图

请添加图片描述
请添加图片描述

③、OFDM 发送及接收信号频谱图

请添加图片描述
请添加图片描述

④、OFDM 误码率

在这里插入图片描述

四、资源自取

基于OFDM的通信系统模拟实现


我的qq:2442391036,欢迎交流!


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

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

相关文章

力扣-python-两数相加

题解 1: # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextNone): # self.val val # self.next nextclass Solution(object):def addTwoNumbers(self, l1, l2):""":type l1: ListNode:t…

数据结构:阶段测试(查漏补缺)

目录 选择题: 题一: 题二: 题三: 题四: 编程题: 题一:左叶子之和 思路一: 题二:约瑟夫问题(用单链表实现) 思路一: 本人实…

Redis设计与实现(3)字典

Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每一个哈希表节点就保存了字典中的一个键值对 redis字典所使用的哈希表由dict.h/dictht typedef struct dictht{//哈希表数组dictEntry **table;//哈希表大小unsigned long si…

【MATLAB源码-第56期】基于WOA白鲸优化算法和PSO粒子群优化算法的三维路径规划对比。

操作环境: MATLAB 2022a 1、算法描述 1.粒子群算法(Particle Swarm Optimization,简称PSO)是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述: 基本思想: 鸟群在寻找食物时,每只鸟都…

Unity游戏开发中打造游戏攻击技能架构与设计

一、技能系统的设计 在 MOBA 游戏中,每个英雄角色都会有多个技能,这些技能可以分为普通攻击和技能攻击两种。普通攻击是英雄角色的基本攻击方式,而技能攻击则需要消耗一定的资源(如蓝量)才能使用。在设计技能系统时&a…

《数字图像处理》作业一:题目+学习笔记

Hi,学习进步,共同加油💪 1、选择题 (每小题3分,总计24分) (1)下列哪种图像属于数字图像( ) A、电影胶片;B、普通照片;C、手机拍照;D、眼前看到的景物 数字图像是由离散的像素点组成的图像,可以通过数值表示。根据选项,可以排除A(电影胶片)和B(普通…

【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 刷题篇 一、删除链表的倒数第 N 个结点1.1 …

一起学数据结构(12)——归并排序的实现

1. 归并排序原理: 归并排序的大概原理如下图所示: 从图中可以看出,归并排序的整体思路就是把已给数组不断分成左右两个区间,当这个区间中的数据数量到达一定数值时,便返回去进行排序,整体的结构类似二叉树…

【Master公式】对于这一类符合的递归可以直接确定时间复杂度

Master公式 T(N) a T(N/b) O(N^d) 对于这一类符合的递归可以直接确定时间复杂度 a,b,c为常数 1、子问题调用了a次 2、子问题的规模一致,N/b指每个子问题处理总规模/b个规模(只看规模,常数个忽略,如L,mid,mid1,R) 3、…

【Airflow】构建爬虫任务系统

爬虫脚本太多了需要进行管理一下,领导决定使用airflow 我了解了一下这个平台是用来做任务调度。 是一个ETL工具 ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程 这里是一个github的地址 https://github.com/apache/airflow 这里是官方文档 http…

手机桌面待办事项APP推荐

每天,我们每个人都面临着繁琐的事务和任务,而手机成了我们日常生活中不可或缺的伙伴。手机上的待办事项工具像一个可靠的助手,可以帮助我们更好地记录、管理和完成任务。在手机桌面上使用的待办事项APP推荐用哪一个呢? 手机是我们…

【QT】信号和槽

一、前置示例代码 main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv); // 应用程序对象a&#xff0c;在Qt中&#xff0c;应用程序对象&#xff0c;有且仅有一个。Widget w; // 窗口对…

python sqlalchemy(ORM)- 02 表关系

文章目录 表关系ORM表示 1v1ORM表示 1vm 表关系 1:1&#xff0c;表A 中的一条记录&#xff0c;仅对应表B中的一条记录&#xff1b;表B的一条记录&#xff0c;仅对应表A的一条记录。1:m&#xff0c;表A中的一条记录&#xff0c;对应表B中的多条记录&#xff0c;表B中的一条记录…

编译原理-词法分析器

文章目录 对于词法分析器的要求概念词法分析器的功能和输出形式 词法分析器的设计词法分析器的结构单词符号的识别&#xff1a;超前搜索状态转换图 正规表达式和有限自动机正规式和正规集确定有限自动机&#xff08;DFA&#xff09;非确定有限自动机&#xff08;NFA&#xff09…

多级缓存入门

文章目录 什么是多级缓存JVM进程缓存环境准备安装MySQL导入Demo工程导入商品查询页面 初识Caffeine Lua语法初识Lua第一个lua程序变量和循环Lua的数据类型声明变量循环 条件控制、函数函数条件控制 多级缓存安装OpenRestyOpenResty快速入门反向代理流程OpenResty监听请求编写it…

scrapy的安装和使用

一、scrapy是什么&#xff1a;Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;可以应用在包括数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序 二、scrapy的安装&#xff1a;pip install scrapy -i https://pypi.douban.com/…

CURL简单使用

前言 最近做项目&#xff0c;需要服务器实现网络是否通畅&#xff0c;比如通过健康检查接口&#xff0c;但是只能linux服务器测试&#xff0c;很可能还需要测试h2&#xff0c;所以想到了curl&#xff0c;整理一版简单用法。 curl 实际上curl是有官网的&#xff0c;只不过比较…

java中的异常,以及出现异常后的处理【try,catch,finally】

一、异常概念 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 注意: 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的…

C语言-面试题实现有序序列合并

要求&#xff1a; a.输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤n,m≤1000 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤val≤30000 输入描述&#xff1a; 1.输入包含三行&#xff0c; 2.第一行包含两个正整数n, m&am…

Modbus协议详解4:RTU帧 ASCII帧的差错校验

前面已经分析过RTU帧和ASCII帧的报文区别&#xff0c;细心的朋友应该会发现在两种不同的报文传输模式下都有一个共同的组成部分——差错校验。 这个差错校验在RTU模式和ASCII模式下也不是不相同的。看下面的对比&#xff1a; RTU模式的差错校验&#xff1a; ASCII模式的差错校验…