OFDM原理及MATLAB仿真

news2025/1/26 15:41:28

文章目录

  • 前言
  • 一、OFDM 总体概述
    • 1、OFDM 概述
    • 2、OFDM 优点
  • 二、OFDM 基本原理
    • 1、基本思想
    • 2、OFDM 调制和解调
    • 3、OFDM 系统的发射机和接收机框图
  • 三、OFDM 系统数学模型
    • 1、sinc 函数
    • 2、OFDM 时域表达式
    • 3、OFDM 频域表达式
  • 四、OFDM 时域及频域仿真
    • 1、绘制时域及频域波形
      • ①、MATLAB 源码
      • ②、仿真结果分析
    • 2、优化 OFDM 频谱图第一版本
      • ①、MATLAB 核心源码
      • ②、仿真结果分析
    • 3、优化 OFDM 频谱图第二版本
      • ①、MATLAB 核心源码
      • ②、仿真结果分析
  • 五、资源自取
  • 总结


前言

本文讲解了 OFDM 相关概念及原理,并通过 MATLAB 仿真模拟一个 OFDM 时域及频域波形图。


一、OFDM 总体概述

1、OFDM 概述

OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,是一种特殊的多载波传输方案,它可以被看作是一种调制技术,也可以被当作一种复用技术。简而言之就是用多个相互正交的子载波搭载信息进行传输。

下面对正交频分复用字面意思进行理解:

  • 正交:可区分
  • 频分:多个载波
  • 复用:频率可重复使用

为了形象的理解,下面以 OFDM 频谱图进行讲解
在这里插入图片描述
图中每一种颜色的“小山包”都是代表一个子载波,图中有 6 个子载波

①、那么如何体现出的正交呢?也就是上面提出的可区分
答:其中一个子载波的中心频率是其他子载波的信号的零点,也就是说在每一个子载波中心频率处,当前子载波的具有巨大的信号强度,可以检测到最大的能量,其他子载波信号强度都为 0,检测到的能量为 0,如此达到了可区分的目的,即为正交。

②、如何体现出了频分呢?也就是上面说的多个载波
答:图中不仅一个子载波,具有 6 个子载波,每个子载波的中心频率不同,达到了一个频分的目的,即为频分

③、如何体现出了复用呢?也就是上面说的频率可重复使用
答:从图中前两个子载波可以看到它们在频率上有重叠的部分,也就是达到了频率可重复使用的目的,即为复用

2、OFDM 优点

早期发展的无线网络或移动通信系统,是使用单载波调制(Single-carrier Modulation)技术,单载波调制是将要传送的信号(语音或数据),隐藏在一个载波上,再藉由天线传送出去。信号若是隐藏于载波的振幅,则有 AM、ASK 调制系统;信号若是隐藏于载波的频率,则有 FM、FSK 调制系统;信号若是隐藏于载波的相位,则有 PM、PSK 调制系统。

使用单载波调制技术的通讯系统,若要增加传输的速率,所须使用载波的带宽必须更大,即传输的符元时间长度(Symbol Duration)越短,而符元时间的长短会影响抵抗通道延迟的能力。若载波使用较大的带宽传输时,相对的符元时间较短,这样的通讯系统只要受到一点干扰或是噪声较大时,就可能会有较大的误码率(Bit Error Ratio,BER)。

为降低解决以上的问题,因此发展出多载波调制(Multi-carrier Modulation)技术,其概念是将一个较大的带宽切割成一些较小的子通道(Subchannel)来传送信号,即是使用多个子载波(Subcarrier)传来送信号,利用这些较窄的子通道传送时,会使子通道内的每一个子载波的信道频率响应看似平坦,这就是分频多任务(Frequency Division Multiplexing,FDM)观念。

因为带宽是一个有限的资源,若频谱上载波可以重迭使用,那就可以提高频谱效率(Spectrum Efficiency,η),所以有学者提出正交分频多任务(Orthogonal Frequency Division Multiplexing,OFDM)的技术架构。FDM 与 OFDM两者最大的差异,在OFDM 系统架构中每个子信道上的子载波频率是互相正交,所以频谱上虽然重迭,但每个子载波却不受其他的子载波影响。
在这里插入图片描述
如上图所示,OFDM 所须的总带宽较小,倘若可以提供的载波总带宽是固定的,则 OFDM 系统架构将可以使用更多的子载波,使得频谱利用效率增加,提高传输量,而能应付高传输量需求的通讯应用

上面没看明白如何提高了频带利用率?那就继续往下看,这些形象的图一定能让你看明白!!!
常规 FDM,两路信号频谱之间有间隔,互相不干扰,如下图所示
在这里插入图片描述

常规 FDM,两路信号频谱之间有间隔,互相不干扰

为了更好的利用系统带宽,子载波的间距可以尽量靠近些。如下图所示
在这里插入图片描述

存在潜在干扰的 FDM

继续靠近,近到完全等同于奈奎斯特带宽(后面有详述),使频带的利用率达到了理论上的最大值
在这里插入图片描述

OFDM

二、OFDM 基本原理

1、基本思想

OFDM 它的基本思想是在频域内将所给信道分成许多子信道,各个子信道之间保持正交高速的数据流被分配到多个正交的子信道上进行传输,从而使子信道上的符号速率大幅度降低,单个数据符号的持续时间大大加长,因而具备了较强的抗时延扩展能力,降低了由于高速传输容易引起的符号间干扰(ISI)的影响通常在 OFDM 符号送入信道前加保护间隔,只要保护间隔大于信道的最大时延扩展,那么理论上就可以完全消除 ISI 的影响,而通常的做法是加入循环前缀(CP),在有的系统中还加入循环后缀(CS),这是 OFDM 系统比较有特色的处理技术,在正交频分复用(OFDM)是多载波调制(MCM)技术的一种

多载波调制的基本思想是把数据流串并变换为 N 路速率较低的子数据流,用这些子数据流分别去调制 N 路子载波以后,再并行传输。由于子数据流的速率是原来速率的 1/N,也就是说,符号周期扩大为原来的 N 倍,远大于信道的最大延迟扩展,这样,多载波调制就把一个宽带频率选择性信道划分成了 N 个窄带平坦衰落信道,这样均衡比较简单,从而具有很强的抗多径衰落以及抗脉冲干扰的能力,这样特别适合于高速无线数据传输。OFDM 是一种子载波相互混叠的多载波调制,因此它除了具有上述多载波调制的优势外,还具有更高的频谱利用率。OFDM 选择时域相互正交的子载波,它们虽然在频域互相混叠,却仍能在接收端被分离出来。

2、OFDM 调制和解调

OFDM 发射机将信息比特流映射成一个 PSK 或 QAM 符号序列,之后将符号序列转换成 N 个并行符号流,每 N 个经过串/并转换的符号被不同的子载波调制。

频域信号 X [ k ] X[k] X[k] 调制频率为 f k = k / T s y m f_k=k/T_{sym} fk=k/Tsym 的子载波,其中载波数量为 N = 6 N=6 N=6,即 k = 0 , 1 , 2 , . . . , 5 k=0,1,2,...,5 k=0,1,2,...,5。在接收机,利用子载波的正交性,可以解调这些信号。注意,原来符号 X [ k ] X[k] X[k] 的周期为 T s T_s Ts,由于串/并转换,通过并行发射 N N N 个符号, N N N 个符号的传输时间扩展为 N T s NT_s NTs,它是单个 OFDM 符号的持续时间 T s y m T_{sym} Tsym,即 T s y m = N T s T_{sym}=NT_s Tsym=NTs。OFDM 符号是 N 个并行符号的复合信号,其周期为 $T_{sym}。

在这里插入图片描述
如下图所示,显示了所有子载波间正交性的一种典型实现。在发射机和接收机分别使用 IDFT、IFFT DFT、FFT,可以实现这种多载波调制解调
在这里插入图片描述

3、OFDM 系统的发射机和接收机框图

OFDM 系统的发射机和接收机框图如下图所示,这里的相关概念就不详细讲解了,如有感兴趣的读者可以阅读《MIMO-OFDM 无线通信技术及 MATLAB 实现》这本书籍,书里面有对相关概念进行了详细的讲解。

在这里插入图片描述

三、OFDM 系统数学模型

1、sinc 函数

问:常见于各种教材、论文的 OFDM 频谱图一般是多个 sinc 函数的叠加,那么为什么是 sinc 函数?
答:因为实际 OFDM 信号不可能是无限长的,而有限长的 OFDM 信号实际可以看做与矩形窗函数的乘积

矩形窗函数可以定义如下:
g ( t ) = { 1 , 0 ≤ ∣ t ∣ ≤ T 0 , ∣ t ∣ ≥ T g(t)= \begin{cases} 1,0\leq|t|\leq T \\ 0,|t|\geq T \\ \end{cases} g(t)={10tT0tT
对其进行傅里叶变换:
G ( j ω ) = ∫ − ∞ ∞ g ( t ) e − j w t   d t = s i n ( ω T / 2 ) ω / 2 G(j\omega)=\int_{-\infty}^{\infty} {g(t)e^{-jwt}} \,{\rm d}t=\frac{sin(\omega T/2)}{\omega/2} G()=g(t)ejwtdt=ω/2sin(ωT/2)

由于时域相乘等效于频域卷积,因此 OFDM 信号反映到频谱,就成为各个不同位置的冲击响应与 sinc 函数的卷积。

对于 OFDM信号,形象点说在时域上是信号的叠加,在频域上是多个子载波并列。

OFDM(正交频分复用)信号的时域表达式可以表示为多个子载波的叠加。假设有 N 个子载波,每个子载波的频域符号为 X [ k ] X[k] X[k],其中 k k k 表示子载波的索引(从 0 到 N-1)。

2、OFDM 时域表达式

每个子载波的频域符号经过反快速傅里叶变换(IFFT)得到时域符号 x [ n ] x[n] x[n],其中 n 表示时域的离散时间点(从 0 到 N-1)。那么 OFDM 信号的时域表达式可以表示为:
x [ n ] = ∑ k = 0 N − 1 X [ k ] ⋅ e j 2 π n k / N x[n] = \sum_{k=0}^{N-1} X[k] \cdot e^{j2\pi nk/N} x[n]=k=0N1X[k]ej2πnk/N

3、OFDM 频域表达式

每个子载波的频域符号经过快速傅里叶变换(FFT)得到频域符号 X [ k ] X[k] X[k],其中 k 表示子载波的索引(从 0 到 N-1)。那么 OFDM 信号的频域表达式可以表示为:
X [ k ] = 1 N ∑ n = 0 N − 1 x [ n ] ⋅ e − j 2 π n k / N X[k] = \frac{1}{N} \sum_{n=0}^{N-1} x[n] \cdot e^{-j2\pi nk/N} X[k]=N1n=0N1x[n]ej2πnk/N

四、OFDM 时域及频域仿真

1、绘制时域及频域波形

①、MATLAB 源码

% ======================== 绘制时域波形图=======================
Fs = 1000;                                % 总的采样率
N = 1024;                                % 总的子载波数
T = N / Fs;                              % 信号绘制为一个周期的长度
x = 0 : 1/Fs : T-1/Fs;                   % 生成时间向量,用于绘制波形
Numscr = 4;                              % 绘制的子载波数量
s_data = 1;                              % 初始相位
y = zeros(Numscr, numel(x));             % 初始化存储每个子载波的复数值的矩阵
ini_phase = repmat(s_data, 1, numel(x));  % 生成与时间长度相匹配的初始相位向量
for k = 0 : Numscr-1                      % 循环遍历要绘制的子载波数量
    for n = 0 : numel(x)-1                % 循环遍历时间序列
        y(k+1, n+1) = ini_phase(n+1) * exp(1i * 2 * pi * k * n / N);  % 计算每个时间点上每个子载波的复数值
    end
end
figure(1);
plot(x, real(y));                         % 绘制时域波形
xlabel('时间/s');                          % 设置 X 轴标签为“时间”
ylabel('幅度/V');                          % 设置 Y 轴标签为“幅度”

% ======================== 绘制频域波形图=======================
f = (-Fs/2 : Fs/numel(x) : Fs/2-Fs/numel(x));
y_fft = zeros(Numscr, numel(x));
for k = 1 : Numscr
    y_fft(k, :) = abs(fftshift(fft(y(k,:)))) / N;  % 计算每个子载波的频谱
end
figure(2)
plot(f, y_fft(1,:), f, y_fft(2,:), f, y_fft(3,:), f, y_fft(4,:));
grid on;
xlim([-10, 10]);                          % 将 x 轴范围限制在 -10 到 10 之间
xlabel('频率/Hz');
ylabel('幅度/V');

②、仿真结果分析

OFDM 时域波形图如下:
请添加图片描述

OFDM 时域波形图

可以验证上面的那句话:“对于 OFDM信号,形象点说在时域上是信号的叠加”。目前的图形是子载波分别绘制出来的结果,还未相加。

OFDM 频谱图如下:
请添加图片描述

OFDM 频谱图

与理想的 sinc 波形相比甚远,这样肯定不行。若在时域进行补零,如下。

2、优化 OFDM 频谱图第一版本

①、MATLAB 核心源码

补 1024 * 20 个 0:

a = 20;
y1 = zeros(Numscr, a * N);
y_combined = horzcat(y, y1);              % 水平拼接两个矩阵
f = (-Fs/2 : Fs/((a+1)*N) : (Fs/2-Fs/((a+1)*N)));
y_fft = zeros(Numscr, (a+1)*N);
for k = 1 : Numscr
    y_fft(k, :) = abs(fftshift(fft(y_combined(k,:)))) / N;  % 计算每个子载波的频谱
end

②、仿真结果分析

优化后的 OFDM 频谱图如下:
请添加图片描述

一次优化后的 OFDM 频谱图

原因分析:时域尾部补零等效于频域插值,让频谱图形变得圆滑。

虽然图形比较理想,但频谱图小于等于 0 的部分我们没有看到:我们绘制的频谱图幅值都是大于等于 0 的。当然必然是大于等于 0 的,因为我们是取模进行绘制,也是正确的,但是怎么获得这种图:
在这里插入图片描述

3、优化 OFDM 频谱图第二版本

要绘制上图的图形,取模肯定是不行的,我们可以尝试取实部

①、MATLAB 核心源码

a = 20;
y1 = zeros(Numscr, a * N);
y_combined = horzcat(y, y1);              % 水平拼接两个矩阵
f = (-Fs/2 : Fs/((a+1)*N) : (Fs/2-Fs/((a+1)*N)));
y_fft = zeros(Numscr, (a+1)*N);
for k = 1 : Numscr
    y_fft(k, :) = real(fftshift(fft(y_combined(k,:)))) / N;  % 计算每个子载波的频谱
end

②、仿真结果分析

优化后的 OFDM 频谱图如下:
请添加图片描述

二次优化后的 OFDM 频谱图

如此,获得了比较接近的频谱图。

五、资源自取

OFDM 时域及频域 MATLAB 仿真
在这里插入图片描述


总结

  • 本文首先在 OFDM 总体概述部分对 OFDM 的基本概念进行了介绍,并强调了使用 OFDM 的优点是什么;
  • 其次对 OFDM 的原理进行了基本的介绍,其中包括 OFDM的基本思想、OFDM 调制解调思想、OFDM系统的发射机和接收机组成框图;
  • 然后对 OFDM 的数学模型进行了分析,包括时域及频域;
  • 最后对 OFDM的时域及频域波形进行了 MATLAB 仿真,针对仿真过程中遇到的问题也进行了分析及解决。

我的qq:2442391036,欢迎交流!


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

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

相关文章

SpringCloud-Sleuth

一、介绍 (1)用于追踪服务链路 (2)搭配zipkin实现 二、项目搭建 (1)下载zipkin.jar https://repo1.maven.org/maven2/io/zipkin/java/zipkin-server/2.12.9/(2)运行 java -jar …

Android---Android 是如何通过 Activity 进行交互的

相信对于 Android 工程师来说,startActivity 就像初恋一般。要求低,见效快,是每一个菜鸟 Android 工程师迈向高级 Android 工程师的必经阶段。经过这么多年的发展,startActivity 在 google 的调教下已经变得愈发成熟,对…

Python文件读写实战:处理日常任务的终极工具!

更多资料获取 📚 个人网站:涛哥聊Python Python文件的读写操作时,有很多需要考虑的细节,这包括文件打开方式、读取和写入数据的方法、异常处理等。 在本文中,将深入探讨Python中的文件操作,旨在提供全面的…

Python开发者的宝典:CSV和JSON数据处理技巧大公开!

更多资料获取 📚 个人网站:涛哥聊Python 在Python中处理CSV和JSON数据时,需要深入了解这两种数据格式的读取、写入、处理和转换方法。 下面将详细介绍如何在Python中处理CSV和JSON数据,并提供一些示例和最佳实践。 CSV数据处理…

项目配置vue.config jsconfig babel.config .prettierc .env .eslintrc

.env 在一个产品的前端开发过程中,一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境,然后才能正式的发布。对应每一个环境可能都会有所差异,比如说服务器地址、接口地址、websorket地址…… 等等。在各个环境切换的时候&am…

java的Timer全网最详细总结

1.简介 在Java 1.3版本中引入了Timer工具类,它是一个古老的定时器,通常与TimerTask和TaskQueue一起使用。Timer工具类的实现涉及到TimerTask类、Timer类、TimerQueue类和TimerThread类。其中,TimerQueue和TimerThread类与Timer类位于同一个类…

docker安装skyWalking笔记

确保安装了docker和docker-compose sudo docker -v Docker version 20.10.12, build 20.10.12-0ubuntu4 sudo docker-compose -v docker-compose version 1.29.2, build unknown 编写docker-compose.yml version: "3.1" services: skywalking-oap:image: apach…

创意作品管理软件 Bridge 2024 mac中文版 br2024功能特色

Bridge 2024 mac旨在连接不同的Ad obe应用程序,帮助用户更轻松地管理和编辑他们的创意作品。 Bridge 2024 mac软件特色和功能介绍 一致的用户体验:Bridge 2024现在具有增强的用户界面,可提供与其他Creative Cloud应用程序类似的体验。用户还…

《向量数据库指南》——向量数据库一些技术难点

一些技术难点 在文章的前半部分,我们列举了一些向量数据库应该具备的特性,然后比较了以 Milvus 为代表的向量数据库和 ANN 算法库、向量检索插件的不同之处。接下来,我们来聊聊构建向量数据库过程中会遇到的一些技术难点。 就好像一架飞机一样,内部每个零部件和系统相互连通…

PPP的建链过程

下图是PPP协议整个链路过程需经历阶段的状态转移图: 图1 PPP链路建立过程 PPP运行的过程简单描述如下: 通信双方开始建立PPP链路时,先进入到Establish阶段。 在Establish阶段,PPP链路进行LCP协商。协商内容包括工作方式是SP&am…

解决win10因为WSL问题无法正常启动docker

解决win10无法成功启动dockerdesktop因为WSL问题无法启动 问题起因解决方法 问题起因 因为需要在windows复现一个CVE漏洞,就需要安装在WIN10上装docker,但是在启动的时候出现下面报错。 然后查了一下是因为WSL的版本太低了。更新以后发现打开docker仍然…

C++20中的关键字

文章目录 前言关键字列表关键字含义总结 前言 源于上一篇中提到了 decltype是一个关键字,所以去查了现有的关键字列表,其实我对C/C的关键字还停留在上世纪大概30多个的时代,虽然知道C加了 auto、constexpr 等关键字,但查询过后才…

52 杨辉三角

杨辉三角 题解1 DP 给定一个非负整数 numRows,生成 杨辉三角的前 numRows 行。 在杨辉三角中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1…

关于操作系统中对进程管理的认识

文章目录 前言1.计算机组成简单认识2.操作系统1). 操作系统的管理2). 操作系统的目的 3.操作系统中的进程管理1). 进程是什么?2).Linux中的进程 前言 在介绍进程之前,我们需要先了解关于进程的一些边缘的操作系统知识 以及硬件知识,因为操作…

leetCode 1143.最长公共子序列 动态规划 + 图解

此题我的往期文章推荐: leetCode 1143.最长公共子序列 动态规划 滚动数组-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133689692?spm1001.2014.3001.5501leetCode 1143.最长公共子序列 一步步思考动态规划 优化空间复杂度_呵呵哒(&#xf…

Lua 调试库( debug )

一、调试库作用 使用调试库可以获取 Lua 环境运行过程中的变量和跟踪代码执行。 调试库主要分为两类函数:自省函数和钩子函数 自省函数:允许检查一个正在运行中的程序,例如活动函数的栈、当前正在执行的代码行、局部变量的名称和值。钩子函…

Java多线程悲观锁和乐观锁

悲观锁: 一上来就加锁,没有安全感,每次只能一个线程进入访问完毕后,再解锁。 线程安全,性能较差 乐观锁: 一开始不上锁,认为是没有问题的,大家一起跑,等要出现线程安全问…

SpringBoot--手写组件动态更新@Value的值

原文网址:SpringBoot--手写组件动态更新Value的值_IT利刃出鞘的博客-CSDN博客 简介 本文手写组件,动态更新SpringBoot里Value的值(无需重启服务)。 不是可以用RefreshScope吗?为什么要手写组件? 动态更…

docker数据卷+挂载(命令讲解+示例)

在容器中管理数据主要有两种方式: 数据卷(Volumes) 、挂载主机目录 (Bind mounts)。 一、数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用。 特点: 对 数据卷 的修改会立马生效对 …

动态规划简述;斐波那契数列自顶向下和自底向上

概述 动态规划就是把一个问题分解为若干子问题,把子问题的解累加起来,就是当前问题的值。 斐波那契数列(自顶向下) 一个很好的演示demo, 在进行运算时,要用上备忘录(缓存)&#x…