当前位置: 首页 > article >正文

OFDM系统仿真

1️⃣ OFDM的原理

1.1 介绍

OFDM是一种多载波调制技术,将输入数据分配到多个子载波上,每个子载波上可以独立使用 QAM、PSK 等传统调制技术进行调制。这些子载波之间互相正交,从而可以有效利用频谱并减少干扰。

1.2 OFDM的核心

  1. 多载波调制
    高速数据流被拆分成多个并行的低速数据流,每个低速数据流被分配到正交的子载波上
  2. 子载波正交性
    子载波的正交性是OFDM的核心,正交性保证了不同子载波之间不会相互干扰
  3. 使用FFT/IFFT的实现
    OFDM使用IFFT生成正交的子载波信号,而在接收端通过FFT恢复频域信号

1.3 OFDM系统架构

在这里插入图片描述

以MQAM调制为例,假设OFDM系统的输入信号是串行的二进制码元,每个二进制码元的持续时间为 T b T_\mathrm{b} Tb

分帧:首先,将输入信号分帧,每一帧包含F个二进制码元,即包含F比特。

分组:然后针对每一帧来说,每帧都会再进一步分组,即把F个二进制码元分成N组,每组中的比特数可以不同。例如,第 i i i组包含的比特数是 b i b_i bi

码元转换:将每组中的 b i b_i bi个比特看作一个 M i M_i Mi进制的码元 B i B_i Bi b i b_i bi M i M_i Mi的关系是 b i = l o g 2 M i b_i=log_2M_i bi=log2Mi

串并转换:此步骤将串行的N个码元 B i B_i Bi变成N路并行码元 B i B_i Bi。并行码元的持续时间相同,都是 T B = F ⋅ T b T_B=F·T_b TB=FTb

在这里插入图片描述

映射:在MQAM调制中,一个并行码元 B i B_i Bi可以用平面上的一个点表示,将 M i M_i Mi进制的码元 B i B_i Bi变成一一对应的复数 B i \boldsymbol{B_i} Bi的过程称为映射过程。例如 B i B_i Bi包含4bit “1100”,那就是16进制码元,进行的是16QAM调制,假设星座图如下图所示,则其相位为45°,振幅为 A / 2 A/\sqrt{2} A/2 。此映射过程将“1100”映射为复数形式 B i = ( A / 2 ) e j π / 4 \boldsymbol{B_i}=(A/\sqrt{2})e^{j\pi/4} Bi=(A/2 )e/4

在这里插入图片描述
调制:N路并行码元 B i B_i Bi对N个子载波进行不同的MQAM调制。由于各个并行码元 B i B_i Bi包含比特数不同,所以调制方式不同,举个例子,若并行码元 B i B_i Bi包含4bit,那就是16QAM调制;包含8bit就是64QAM调制

IDFT:使用IDFT实现正交频分复用

  • 最低子载波频率设定:为了用IDFT实现OFDM,先将OFDM的最低子载波频率设定为0。这是为了满足IDFT公式: s ( k ) = 1 K ∑ n = 0 K − 1 S ( n ) e j ( 2 π / K ) n k , k = 0 , 1 , 2 , ⋯ , K − 1 s(k)=\frac{1}{\sqrt{K}} \sum_{n=0}^{K-1} \boldsymbol{S}(n) \mathrm{e}^{\mathrm{j}(2 \pi / K) n k} \quad ,k=0,1,2, \cdots, K-1 s(k)=K 1n=0K1S(n)ej(2π/K)nk,k=0,1,2,,K1在n=0时,其右端第一项的指数因子等于1的条件,方便后续数学运算和信号处理。

  • IDFT项数设定与等效复码元序列生成:假设IDFT的项数为K,设置K=2N,即IDFT的项数等于子信道数目N的2倍。根据下述共轭对称性条件:

    若信号的时域函数 s ( k ) s(k) s(k) 是实函数,则其 K K K 点 DFT 的值 S ( n ) \boldsymbol{S}(n) S(n) 一定满足对称性条件: S ( K − k ) = S ∗ ( k ) k = 0 , 1 , 2 , ⋯ , K − 1 \boldsymbol{S}(K-k)=\boldsymbol{S}^*(k) \quad k=0,1,2, \cdots, K-1 S(Kk)=S(k)k=0,1,2,,K1式中: S ∗ ( k ) \boldsymbol{S}^*(k) S(k) S ( k ) \boldsymbol{S}(k) S(k) 的复共轭。

    从N个并行复数码元序列 { B i } \left\{\boldsymbol{B_i}\right\} {Bi} i = 0 , 1 , ⋯ , N − 1 ) i=0,1, \cdots, N-1) i=0,1,,N1) 生成 K = 2 N K=2 N K=2N 【将 IDFT 项数设为2N】个等效复数码元序列 { B n ′ } ( \left\{\boldsymbol{B_n}^{\prime}\right\}( {Bn}( n = 0 , 1 , ⋯ , 2 N − 1 ) n=0,1, \cdots, 2 N-1) n=0,1,,2N1),具体规则如下:
    ① 当 n = 1 , 2 , ⋯ , N − 1 n=1,2, \cdots, N-1 n=1,2,,N1 时, B K − n − 1 ′ = B n ∗ ( B n ∗ \boldsymbol{B}_{K-n-1}^{\prime}=\boldsymbol{B}_n^* \quad\left(B_n^*\right. BKn1=Bn(Bn B n B_n Bn 的共轭复数)。
    ② 当 n = N , N + 1 , ⋯ , 2 N − 2 n=N, N+1, \cdots, 2 N-2 n=N,N+1,,2N2 时, B K − n − 1 ′ = B K − n − 1 \boldsymbol{B}_{K-n-1}^{\prime}=\boldsymbol{B}_{K-n-1} BKn1=BKn1
    B 0 ′ = Re ⁡ ( B 0 ) \boldsymbol{B}_0^{\prime}=\operatorname{Re}\left(B_0\right) B0=Re(B0) ,即取 B 0 \boldsymbol{B}_0 B0 的实部。
    B K − 1 ′ = B 2 N − 1 ′ = Im ⁡ ( B 0 ) \boldsymbol{B}_{K-1}^{\prime}=\boldsymbol{B}_{2 N-1}^{\prime}=\operatorname{Im}\left(\boldsymbol{B}_0\right) BK1=B2N1=Im(B0) ,即取 B 0 \boldsymbol{B}_0 B0 的虚部。

    补充:为什么一定要K=2N?
    OFDM 系统最终需要生成实值的时域信号进行传输(实信号在实际硬件中更易处理和传输)。IDFT 具有这样的特性:当频域序列满足一定的共轭对称性质时,经过 IDFT 变换后得到的时域序列是实值的。通过将 IDFT 项数设为 2 N 2 N 2N ,可以利用这一性质,通过对 N N N 个并行复数码元序列构建出具有共轭对称性质的 2 N 2 N 2N 个等效复数码元序列(如前面提到的通过特定的对称规则生成),从而确保经过 IDFT 后得到实值的时域信号。

  • OFDM信号的离散形式:将生成的新码元序列 { B n ′ } \left\{\boldsymbol{B}_n^{\prime}\right\} {Bn} 作为频域信号代入IDFT公式,得到时域离散信号:
    e ( k ) = 1 K ∑ n = 0 K − 1 B n ′ e j ( 2 π / K ) n k ( k = 0 , 1 , ⋯ , K − 1 ) e(k)=\frac{1}{\sqrt{K}} \sum_{n=0}^{K-1} \boldsymbol{B}_n^{\prime} \mathrm{e}^{\mathrm{j}(2 \pi / K) n k} \quad(k=0,1, \cdots, K-1) e(k)=K 1n=0K1Bnej(2π/K)nk(k=0,1,,K1)
    这里的 e ( k ) e(k) e(k) 是离散的,且 e ( k ) = e ( k T B / K ) e(k)=e\left(k T_{\mathrm{B}} / K\right) e(k)=e(kTB/K),即在离散的时间点 k T B / K k T_{\mathrm{B}} / K kTB/K 上对连续的 OFDM 信号 e ( t ) e(t) e(t) 进行抽样得到了 e ( k ) e(k) e(k)

循环前缀:对每个 OFDM 符号添加循环前缀,以对抗多径效应等引起的干扰,它是在时域上操作的【OFDM信号长啥样??? 例如,50个OFDM符号,每个符号64个子载波,那矩阵大小就是64×50,加8个循环前缀的话,就会变成72×50】

并串转换:此时的信号 e ( k ) e(k) e(k) 在时域上还是以并行的形式存在,为了后续能够进行 D/A 转换以及在实际信道中传输【因为D/A 转换器通常接收串行的信号】,需要将这些并行的离散信号进行并串转换,将其变为串行的离散信号序列

通过D/A转换得到连续形式:离散抽样信号 e ( k ) e(k) e(k)经过数模(D/A)转换后就得到OFDM 信号的连续时间表达式:
e ( t ) = 1 K ∑ n = 0 K − 1 B n ′ e j ( 2 π / T B ) n t ( 0 ⩽ t ⩽ T B ) e(t)=\frac{1}{\sqrt{K}} \sum_{n=0}^{K-1} \boldsymbol{B}_n^{\prime} \mathrm{e}^{\mathrm{j}\left(2 \pi / T_{\mathrm{B}}\right) n t} \quad\left(0 \leqslant t \leqslant T_{\mathrm{B}}\right) e(t)=K 1n=0K1Bnej(2π/TB)nt(0tTB)
它是从离散抽样信号 e ( k ) e(k) e(k) 推导而来的,体现了 OFDM 信号在整个时间区间 [ 0 , T B ] \left[0, T_{\mathrm{B}}\right] [0,TB] 上的连续变化情况。在这个表达式中,每一项 B n ′ e j ( 2 π / T B ) n t \boldsymbol{B}_n^{\prime} \mathrm{e}^{\mathrm{j}\left(2 \pi / T_{\mathrm{B}}\right) n t} Bnej(2π/TB)nt 都代表一个子载波信号,不同的 n n n 对应不同的子载波,通过对这些子载波信号进行叠加,就得到了完整的 OFDM 信号 e ( t ) e(t) e(t)

  • 子载波频率:子载波频率 f k = n / T B ( n = 0 , 1 , ⋯ , N − 1 ) f_k=n / T_{\mathrm{B}}(n=0,1, \cdots, N-1) fk=n/TB(n=0,1,,N1) 。在 OFDM 系统中,子载波是承载信息的关键元素。这个公式表明子载波频率是等间隔分布的,间隔为 1 / T B 1 / T_{\mathrm{B}} 1/TB T B T_{\mathrm{B}} TB是并行码元的持续时间】 。从物理意义上讲,不同的子载波频率使得各个子载波能够在频域上相互正交,从而在相同的时间和带宽资源下,实现多个子载波同时传输不同信息,提高了频谱利用率。

上变频:由于实际通信中信号需要在特定高频频段传输,后续会用上变频将OFDM信号频谱搬移到指定高频为止

相关文章:

OFDM系统仿真

1️⃣ OFDM的原理 1.1 介绍 OFDM是一种多载波调制技术,将输入数据分配到多个子载波上,每个子载波上可以独立使用 QAM、PSK 等传统调制技术进行调制。这些子载波之间互相正交,从而可以有效利用频谱并减少干扰。 1.2 OFDM的核心 多载波调制…...

torch numpy seed使用方法

1 import numpy as np np.random.seed(500) np.random.rand(5)array([0.69367953, 0.06171699, 0.6666116 , 0.55920894, 0.08511062])import torch torch.manual_seed(500) torch.rand(5)为了能够复现数据,我们可以使用seed 来控制生成的随机数。设置seed数据来设…...

【Go语言圣经】第四节:复合数据类型

第四章:复合数据类型 本节主要讨论四种类型——数组、slice、map和结构体。 数组和结构体都是有固定内存大小的数据结构。相比之下,slice 和 map 则是动态的数据结构,它们可以根据需要动态增长。 4.1 数组 数组是一个定长的由特定类型元素…...

【Vite + Vue + Ts 项目三个 tsconfig 文件】

Vite Vue Ts 项目三个 tsconfig 文件 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件?首先我们先了解什么是 tsconfig.json ? 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件? 在使用 Vite 创建 vue-ts 模板的项目时,会发现除了 ts…...

论文和代码解读:RF-Inversion 图像/视频编辑技术

Diffusion Models专栏文章汇总:入门与实战 前言:Rectified Flow的反演和DDIM这些不太一样,上一篇博客中介绍了腾讯提出的一种方法《基于Rectified Flow FLUX的图像编辑方法 RF-Solver》,主要就是用泰勒展开和一阶导数近似来分解反演公式。这篇博客介绍谷歌提出的方法RF-Inv…...

完美还是完成?把握好度,辨证看待

完美还是完成? 如果说之前这个答案有争议,那么现在,答案毋庸置疑 ■为什么完美大于完成 ●时间成本: 做事不仅要考虑结果,还要考虑时间和精力,要说十年磨一剑的确质量更好,但是现实没有那么多…...

Many Whelps! Handle It! (10 player) Many Whelps! Handle It! (25 player)

http://db.nfuwow.com/80/?achievement4403 http://db.nfuwow.com/80/?achievement4406 最少扣你50DKP! 第二阶段 当奥妮克希亚升空后,在10秒内引出50只奥妮克希亚雏龙,随后击败奥妮克希亚。 World of Warcraft [CLASSIC][80猎人][Grandel][最少扣你5…...

3.4 Go函数作用域(标识符)

只有精准分析每个标识符的作用域范围,才能编写出优质、健壮的代码,避免逻辑错误的发生。 作用域标识符 简单来说,作用域指的是标识符可以起作用的范围,即其可见范围。将标识符的可见性限制在一定范围内,这个范围就是…...

【React】PureComponent 和 Component 的区别

前言 在 React 中,PureComponent 和 Component 都是用于创建组件的基类,但它们有一个主要的区别:PureComponent 会给类组件默认加一个shouldComponentUpdate周期函数。在此周期函数中,它对props 和 state (新老的属性/状态)会做一…...

MongoDb user自定义 role 添加 action(collStats, EstimateDocumentCount)

使用 mongosh cd mongsh_bin_path mongosh “mongodb://user:passip:port/db”这样就直接进入了对应的db 直接输入: 这样 role “read_only_role" 就获得了3个 action, 分别是 查询,列举集合,集合元数据查询 P.S: 如果没有 …...

fastadmin中require-form.js的data-favisible控制显示隐藏

只要在任意元素上添加data-favisible属性就可以轻松的控制显示隐藏了 其中reportype是php传到前端的一个变量??? <div class"form-group" data-favisible"reportype6"><label class"control-label col-xs-12 col-sm-2">{:__(Ove_…...

Day51:type()函数

在 Python 中&#xff0c;type() 是一个内置函数&#xff0c;用于返回对象的类型。它可以用于检查变量的类型&#xff0c;也可以用于动态创建新的类型。今天&#xff0c;我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...

vue 无法 局域网内访问

资料 Vue项目设置可以局域网访问_vue.js_脚本之家 过程 上午&#xff0c;前端vue服务能够在局域网内访问&#xff0c; 下午就不行了&#xff0c;但是后端服务能够正常访问&#xff0c;本机也能正常访问ip&#xff1a;端口号 前端服务 判定不是下面的问题&#xff1a; 同一…...

【llm对话系统】大模型 Llama 源码分析之 LoRA 微调

1. 引言 微调 (Fine-tuning) 是将预训练大模型 (LLM) 应用于下游任务的常用方法。然而&#xff0c;直接微调大模型的所有参数通常需要大量的计算资源和内存。LoRA (Low-Rank Adaptation) 是一种高效的微调方法&#xff0c;它通过引入少量可训练参数&#xff0c;固定预训练模型…...

蓝桥杯刷题DAY2:二维前缀和 一维前缀和 差分数组

闪耀的灯光 &#x1f4cc; 题目描述 蓝桥公园是一个适合夜间散步的好地方&#xff0c;公园可以被视为由 n m 个矩形区域构成。每个区域都有一盏灯&#xff0c;初始亮度为 a[i][j]。 小蓝可以选择一个大的矩形区域&#xff0c;并按下开关一次&#xff0c;这将使得该区域内每盏…...

网件r7000刷回原厂固件合集测评

《网件R7000路由器刷回原厂固件详解》 网件R7000是一款备受赞誉的高性能无线路由器&#xff0c;其强大的性能和可定制性吸引了许多高级用户。然而&#xff0c;有时候用户可能会尝试第三方固件以提升功能或优化网络性能&#xff0c;但这也可能导致一些问题&#xff0c;如系统不…...

算法随笔_35: 每日温度

上一篇:算法随笔_34: 最后一个单词的长度-CSDN博客 题目描述如下: 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升…...

C++初阶 -- 手撕string类(模拟实现string类)

目录 一、string类的成员变量 二、构造函数 2.1 无参版本 2.2 有参版本 2.3 缺省值版本 三、析构函数 四、拷贝构造函数 五、c_str函数 六、operator重载 七、size函数 八、迭代器iterator 8.1 正常版本 8.2 const版本 九、operator[] 9.1 正常版本 9.2 const版…...

【Unity3D】实现2D角色/怪物死亡消散粒子效果

核心&#xff1a;这是一个Unity粒子系统自带的一种功能&#xff0c;可将粒子生成控制在一个Texture图片网格范围内&#xff0c;并且粒子颜色会自动采样图片的像素点颜色&#xff0c;之后则是粒子编辑出消散效果。 Particle System1物体&#xff08;爆发式随机速度扩散10000个粒…...

构建一个数据分析Agent:提升分析效率的实践

在上一篇文章中,我们讨论了如何构建一个智能客服Agent。今天,我想分享另一个实际项目:如何构建一个数据分析Agent。这个项目源于我们一个金融客户的真实需求 - 提升数据分析效率,加快决策速度。 从分析师的痛点说起 记得和分析师团队交流时的场景&#xff1a; 小张&#xff…...

85.[1] 攻防世界 WEB easyphp

进入靶场 属于代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;常用于调试或展示代码 highlight_file(__FILE__);// 初始化两个标志变量&#xff0c;用于后续条件判断 $key1 0; $key2 0;// 从 GET 请求中获取参数 a 和 b $a $_GET[a]; $b $_GET[b];// 检…...

嵌入式硬件篇---CPUGPUTPU

文章目录 第一部分&#xff1a;处理器CPU&#xff08;中央处理器&#xff09;1.通用性2.核心数3.缓存4.指令集5.功耗和发热 GPU&#xff08;图形处理器&#xff09;1.并行处理2.核心数量3.内存带宽4.专门的应用 TPU&#xff08;张量处理单元&#xff09;1.为深度学习定制2.低精…...

pytorch图神经网络处理图结构数据

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;是一类能够处理图结构数据的深度学习模型。图结构数据由节点&#xff08;vertices&#xff09;和边&#xff08;edges&#xff09;组成&a…...

海外问卷调查,最常用到的渠道查有什么特殊之处

市场调研&#xff0c;包含市场调查和市场研究两个步骤&#xff0c;是企业和机构根据经营方向而做出的决策问题&#xff0c;最终通过海外问卷调查中的渠道查&#xff0c;来系统地设计、收集、记录、整理、分析、研究市场反馈的工作流程。 市场调研的工作流程包括&#xff1a;确…...

【Uniapp-Vue3】解决uni-popup弹窗在安全区显示透明问题

我们在使用uni-popup时&#xff0c;如果想要给弹出内容添加一个背景颜色&#xff0c;我们会发现在安全区域是不显示该背景颜色的。 首先根据如下的目录结构找到uni-popup.vue文件 在该文件中找到bottom配置&#xff0c;将红箭头所指代码注释掉 下面的安全区域就没有了&#xff…...

什么是麦克斯韦方程

飞书链接&#xff0c;格式更好&#xff0c;⭐⭐⭐&#xff1a;长尾 - 什么是麦克斯韦方程 基于作者的内容&#xff0c;做了一些扩展&#xff08;问了 DeepSeek&#xff09; 最美的公式&#xff1a;你也能懂的麦克斯韦方程组&#xff08;积分篇&#xff09; 04通量的引入 用一个…...

webrtc peerconnection_client peerconnection_server 连接失败问题解决 win10 win11

0 常见问题 (1) webrtc peerconnection_client 连接 peerconnection_server 无连接列表 &#xff08;2&#xff09;连接导致崩溃debug状态下因为这个断言 RTC_DCHECK_RUN_ON(&capture_checker_); 1 在 peerconnection\client\main.cc 当中 定义类 class CustomSock…...

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么&#xff0c;有存就有取 在取值的时候&#xff0c;报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中&#xff1a;LoginUser u…...

2025年2月1日(Keep calm and code Python)

“Keep calm and code Python” 的意思是 “保持冷静&#xff0c;编写 Python 代码”。 这句话来源于 “Keep Calm and Carry On”&#xff08;保持冷静&#xff0c;继续前进&#xff09;&#xff0c;这是二战时期英国政府的宣传口号。后来&#xff0c;这种句式被广泛模仿&…...

核心集:DeepCore: A Comprehensive Library for CoresetSelection in Deep Learning

目录 一、TL&#xff1b;DR 二、为什么研究核心集&#xff1f; 三、问题定义和如何做 3.1 问题定义 3.2 业界方法 3.2.1 基于几何的方法 3.2.2 基于不确定性的方法 3.2.3 基于误差/损失的方法 3.2.5 GraNd 和 EL2N 分数 3.2.6 重要性采样 3.2.7 基于决策边界的办法 …...