OFDM深入学习及MATLAB仿真
文章目录
- 前言
- 一、OFDM 基本原理及概念
- 1、OFDM 简介
- 2、子载波
- 3、符号
- 4、子载波间隔与符号长度之间的关系
- 二、涉及的技术
- 1、保护间隔
- 2、交织
- 3、信道编码
- 4、扩频
- 5、导频
- 6、RF(射频)调制
- 7、信道估计
- 三、变量间的关系
- 四、IEEE 802.11a WLAN PHY 层标准
- 五、OFDM 基本参数的选择
- 1、基本参数
- 2、有用符号持续时间T
- 3、子载波数
- 4、调制模式
- 5、具体实例
- 六、OFDM 的完整仿真过程
- 1、MATLAB 源码
- 2、程序流程
- 3、仿真结果
- ①、QPSK 星座图
- ②、AWGN 信道下误比特率曲线
- ③、发送信号和接收信号对比
- 七、资源自取
前言
前面对 OFDM 的学习及了解还是比较浅显的,例如没有考虑到其中涉及的技术,例如保护间隔、信道编码、扩频、导频相关技术,本文通过学习这些技术,并进行 OFDM 的完整仿真过程。
之前博客中已经介绍过的原理性东西这里就不再重复阐述了,对于之前没有讲过的概念会重点讲述,可以详见我之前的博客:
- OFDM原理及MATLAB仿真
- 基于OFDM的通信系统模拟实现
一个完整的 OFDM 系统的发射机和接收机如下图所示:
- 过程介绍–发送端: OFDM 发射机的输入位首先要进行编码(有冗余),以减少特定信道的误差,编码后的位通过调制在相位和正交(IQ)平面上映射成星座,得到的 IQ 数据用复数表示。在 IQ 数据中插入导频和保护频带,形成频域 OFDM 符号。频域 OFDM 符号通过反离散傅里叶变换(IDFT)转化为时域,再通过并行到串行(P/S)的转换转化为一维(1D)。循环前缀(Cyclic Prefix,CP),是将时域 IQ 数据从末尾的一段复制到时域 IQ 数据的开头,形成一个完整的时域 OFDM 符号,然后,基带 IQ 数据流被向上转换为射频(RF),并通过 RF 前端进行空中广播。通过无线信道传播的无线电波被接收机的射频前端接收并下变频为基带数字 IQ 数据。
- 过程介绍–接收端:载波同步器回收时域 OFDM 符号,并将其发送到基带接收器。在接收机上,首先去除 CP,其余的 IQ 数据通过 FFT 转换到频域。信道均衡器估计信道的响应,并对接收到的被衰落信道扭曲的 IQ 数据进行均衡。接下来,经过均衡的频域 IQ 数据被解调为软位(浮点数),再由信道解码器将其进一步解码为二进制位。输出的比特流被送到下一层,并回收成数据包。请注意,信道均衡是针对衰减而不是加性高斯白噪声(AWGN)信道的。
- 这里理解为传输的频域信号是因为IFFT是从频域到时域,实际上这里 IFFT 充当的是一个实现子载波正交的作用。
一、OFDM 基本原理及概念
1、OFDM 简介
OFDM(Orthogonal Frequency Division Multiplexing),即正交频分复用,是一种用于数字通信的调制技术,它将数据流分为多个子载波,每个子载波都以不同的频率传输数据,被广泛应用于现代数字通信系统中,如 Wi-Fi,DAB,DVB,LTE,5G NR 等。OFDM 符号是 OFDM 技术中的一个重要组成部分,它是在子载波上传输信息的基本单位。
2、子载波
子载波(subcarrier)是数字通信中的一个概念,它是在正交频分复用(OFDM)系统中使用的一种调制技术。在 OFDM 系统中,将宽带信号分成多个独立的子信道,每个子信道都可以看作是一个独立的信号载波,称为子载波。
在 OFDM 系统中,将频率范围分成多个子载波,每个子载波都有一个固定的频率和相位,可以独立传输数据,如 5G NR 系统中,将 100MHz 的带宽,按照 15KHz 的子载波带宽进行分配,可以分成 6666 个子载波,而 4G LTE 20MHz 系统中的子载波仅有 1333 个。每个子载波的频带宽度比整个带宽窄很多,这样可以减少频带的浪费,并且在接收端可以更容易地进行信号分离和恢复。
3、符号
从时域上来看,ODFM 符号就是一个时间长度。利用了 OFDMA 原理中的串并变换技术,原本高速的串行数据被转换成低速的并行数据发送,原来传 N 个符号(数字映射后的符号,譬如每个 QPSK 符号包含 2 个比特)的时间,现在相当于只传一个符号(但由于并行传输,N 个子载波上各传一个,相当于同时传 N 个,只是这 N 个子载波之间互相独立,并且所代表的数据仅是原始数据中的一小部分)。所用的这个时间称为 OFDM 符号长度,或 OFDM 符号周期。
OFDM 符号由一组正交的子载波组成,每个子载波上携带独立的信息
。因为子载波之间正交,所以它们可以在同一频段上同时传输信息,从而实现了高效的频谱利用。OFDM 符号通常使用快速傅里叶变换(FFT)来实现,将时域的数据序列转换为频域的子载波信号。OFDM 符号的特点是抗多径衰落和频偏干扰能力强,同时也容易实现频率同步。
在实际中,为了消除符号间的干扰,还要在符号间插入循环前缀(CP),即经过 IFFT 之后的发送数据经过并串变换,把位于最末的 CP 长度的符号拷贝到 OFDM 符号的起始端,用于消除符号间干扰。这时,实际的每个 OFDM 符号的长度变为 T s y m b o l + T c p T_{symbol}+T_{cp} Tsymbol+Tcp ,你所看到的 IFFT 长度 + CP 长度是以 OFDM 符号周期为单位的表示方法。
4、子载波间隔与符号长度之间的关系
OFDM 技术中,符号长度(也称为时域上的时间长度)为 T 的子载波在频域上是一个 Sinc 函数,在 1/T 处过零。为了满足正交性,各个子载波的峰值应该对应于其他子载波的过零点。因此,子载波的间隔应为 1/T。例如,在 5G NR中,子载波的间隔为 15kHz,因此 OFDM 的符号长度为 1/15kHz=66.7us。这个长度是子载波的调制符号时间。
二、涉及的技术
1、保护间隔
- 作用:多径信道会对 OFDM 符号造成 ISI 影响,破坏了子载波间的正交性。故需要
采取一些方法来消除多径信道带来的符号间干扰(ISI)影响,即插入保护间隔
。 - 方法:
- 一种是补零(zp),即在保护间隔中填充 0;
- 另一种是插入循环前缀(cp)或循环后缀(cs)实现OFDM的循环扩展(为了某种连续性)。
zp 是在保护间隔内不插入任何信号,但是在这种情况下,由于多径传播的影响,会产生载波间干扰(ICI),即不同的子载波间会产生干扰。
一般采用 cp。cp 是将 OFDM 后部的采样复制到前面,长度为 T c p T_{cp} Tcp,故每个符号的长度为 T s y m = T s u b + T c p T_{sym}=T_{sub}+T_{cp} Tsym=Tsub+Tcp, T s u b T_{sub} Tsub 为数据部分子载波数。 T c p T_cp Tcp 大于或等于多径时延,符号间的 ISI 影响将被限制在保护间隔中,因此不会影响下一个 OFDM 的 FFT 变换。
上面所讲可以参考下面的文章,文章中讲解的很详细:
多径效应、符号内干扰、符号间干扰ISI、ICI
2、交织
- 作用:交织的作用是将突发错误转换为随机错误,有利于前向纠错码的译码,提高了整个通信系统的可靠性。
- 原理:交织技术是改变数据流的传输顺序,将突发的错误随机化,提高纠错编码的有效性。
- 方法:交织由两个变换过程组成。
- 第一次变换保证了相邻的编码比特被映射到不相邻的子载波上。
- 第二次变换保证了相邻的编码比特被分别映射到星座图的重要和非重要比特上,避免出现长时间的低比特位映射。
- 交织块的长度: Ncbps,对 qpsk、16qam、64qam 分别为 2、4、6,s=Ncbps/2,d=16。
3、信道编码
- 作用:由于移动通信存在干扰和衰落,在信号传输过程中将出现差错,故对数字信号必须采用纠、检错技术,即纠、检错编码技术,以增强数据在信道中传输时抵御各种干扰的能力,提高系统的可靠性。
- 原理:信道编码技术是通过给原数据添加冗余信息,从而获得纠错能力,适合纠正非连续的少量错。
- 方法
- 卷积编码是现代数字通信系统中常见的一种前向纠错码,区别于常规的线性分组码,卷积编码的码字输出不仅与当前时刻的信息符号输入有关,还与之前输入的信息符号有关。
- 这里的信道编码一般采用卷积编码,Viterbi 译码。
有关信道编码的知识可以参考我之前写的文章
:信道编码译码及MATLAB仿真
4、扩频
- 本质:“扩频通信技术是一种信息传输方式,其信号所占有的频带宽度远大于所传信息必需的最小带宽;频带的扩展是通过一个独立的码序列来完成,用编码及调制的方法来实现的,与所传信息数据无关;在接收端则用同样的码进行相关同步接收、解扩及恢复所传信息数据”
- 优点和作用
- 根据香农定理,带宽和信噪比可用互换,扩频扩展了带宽,则对信噪比的要求可降低 。
- 对背景的噪声(noise)、干扰(interference)以及自体多路径干扰(Multipath interference)有免疫力。
- 对人为的刻意干扰(jamming)信号有良好的抵御能力
5、导频
- 本质:导频不携带信息,导频是双方已知的数据,是用来做信道估计的。
- 原理:将训练信号(导频)插入帧中,以便接收器可以根据导频和数据类似地失真的假设来估计信道响应。 设计了一种适当的导频模式来满足这种假设。 OFDM系统中的典型导频模式为:块,梳状和分散式。如下图所示。
- 使用原理:在接收机中,虽然利用接收到的段训练序列、长训练序列可以进行信道均衡、频率偏差校正,但符号还会存在一定的剩余偏差,且偏差会随着时间的累积而累积,会造成所有子载波产生一定的相位偏移。因此,还需要不断地对参考相位进行跟踪。要能实现这个功能,需要在子载波中插入导频符号。
6、RF(射频)调制
- 方法:OFDM 调制器的输出产生了一个基带信号,将此基带信号与所需传输的频率进行混频操作,利用模拟技术或数字上变频可完成。
- 原理:由于数字调制技术提高了处理 I、Q 信道之间的匹配性和数字 IQ 调制器相位的准确性,将会更加精确。
7、信道估计
- 本质:在OFDM系统的相干检测中需要对信道进行估计,获得详细的信道信息,从而在接收端正确地解调出发射信号,是衡量一个无线通信系统性能的重要指标。
三、变量间的关系
- T u T_u Tu:有效数据部分符号时间
- T G I T_{GI} TGI:循环前缀长度
- T s T_s Ts:OFDM 符号长度
- T s = T u + T G I T_s=T_u+T_{GI} Ts=Tu+TGI
- N N N:子载波个数
- Δ f \Delta f Δf:子载波间隔
- Δ f = 1 T u \Delta f=\large \frac{1}{T_u} Δf=Tu1
- B B B:带宽
- B = N ∗ Δ f B=N*\Delta f B=N∗Δf
- T s a m p l e T_{sample} Tsample:采样时间间隔
- T s a m p l e = 1 B = T u N T_{sample}=\large \frac{1}{B}=\frac{T_u}{N} Tsample=B1=NTu (时域频域的关系)
- F s F_s Fs:采样频率
- F s = 1 T s a m p l e = N T u F_s=\large \frac{1}{T_{sample}}=\frac{N}{T_u} Fs=Tsample1=TuN (1s的采样点数)
四、IEEE 802.11a WLAN PHY 层标准
IEEE 802.11a WLAN PHY层标准的主要参数:
其他参数以保护间隔长度为基础进行定义。为了把保护间隔所占用的功率减小到 1 d B 1dB 1dB,(OFDM符号长度定为 4 μ s 4\mu s 4μs,除去 G I GI GI 外有效数据部分的长度为 3.2 μ s 3.2\mu s 3.2μs,进而可得子载波间隔为 1 3.2 μ s \large \frac{1}{3.2\mu s} 3.2μs1 = 312.5 k H z =312.5kHz =312.5kHz 。标准采用 48 个并行子载波进行数据传输,这样当调制方式为 BPSK 或 16QAM 时,可以提供的未编码数据速率分别为 48 × 1 × 48×1× 48×1× 1 4 μ s \large \frac{1}{4\mu s} 4μs1= 12 M b / s 12Mb/s 12Mb/s 和 48 × 4 × 48×4× 48×4× 1 4 μ s \large \frac{1}{4\mu s} 4μs1= 48 M b / s 48Mb/s 48Mb/s。
IEEE 802.11a 中使用了 52 个子载波(实际上应为 53 个,其中 k=0 处的直流子载波上不传输符号),由于 IFFT 算法基于 2 点,故采用 64 点的 IFFT。53 个子载波在频率分配时分别在编号低端和高端留有 6 个和 5 个空符号,即 k=一32…,一27,27,…,31,这样就可以保证系统的子载波频谱集中,从而使得系统占用的频谱带宽尽可能窄,以节约频谱资源,减少信道间干扰。所以,52 个非零子信道映射到 64 点输入的 IFFT 当中应按照下面图所指定的方式,把子信道 1~26 映射到相同标号的 IFFT 输入端口;而子信道 -26~-1 被映射到标记为 38~63 的 IFFT 输入端口;其余的 IFFT 输入端口,即 27~37 输入空值。
采用64点IFFT意味着系统的采样间隔为0.05us,这样采样频率至少应该是20M samples/s
五、OFDM 基本参数的选择
1、基本参数
各种 OFDM 参数的选择就是需要在多项要求冲突中进行折衷考虑。通常来说,首先要确认 3 个参数:带宽、比特率、及保护间隔。
保护间隔
: 按照惯例,保护间隔的时间长度应该为应用移动环境信道的时延扩展均方根值的 2~4 倍。OFDM 符号周期长度
:确定保护间隔之后,则 OFDM 符号周期长度就确定了。为了最大限度的减少由于插入保护比特所带来的信噪比的损失,OFDM 符号周期长度远远大于保护间隔长度。但是符号周期又不能任意大,否则就需要更多的子载波,带宽不变,子载波间隔就变小,系统的实现复杂度就提高了,而且还加大了系统的峰值平均功率比,同时系统对频率偏差更加敏感。因此,一般选择符号周期长度是保护间隔的 5 倍,这样,由于插入保护比特所造成的信噪比损耗只有 1dB 左右。子载波的数量
:确定保护间隔和符号周期长度之后,子载波的数量可由 − 3 d B -3dB −3dB 带宽除以子载波间隔(即去掉保护间隔之后的符号周期的倒数)得到。或者可由所要求比特速率除以每个子信道的比特速率来确定子载波的数量。每个信道中所传输的比特速率可由调制类型、编码速率、和符号速率来确定。
2、有用符号持续时间T
T 对子载波之间间隔、译码的等待周期都有影响,为了保持数据的吞吐量,子载波数目和 FFT 的长度要有相对较大的数量,这就导致符号持续时间变长。总之,符号周期长度的选择以保证信道的稳定为前提。
3、子载波数
N = 1 / T N=1/T N=1/T
其数值与 FFT 处理过的复数点数相对应,需适应数据速率和保护间隔的要求。
4、调制模式
OFDM系统的调制模式基于功率和频谱利用率来选择,可采用 qam、psk。
为了使所有的点有相同的平均功率,二进制序列映射后的复数要归一化。(BPSK\QPSK\16QAM\64QAM分别对应乘以1、1/根号2、1/根号10、1/根号42),解调的时候再变回去。
5、具体实例
如下要求:(1)比特率为25Mbit/s(2)可容忍的时延扩展为200ns(3)带宽小于18MHz。
- ①、由 200ns 时延扩展得保护间隔为 800ns;
- ②、由保护间隔 800ns 得符号周期长度 6*800ns=4.8us;
- ③、子载波的间隔选取 4.8-0.8=4us 的倒数,即 250KHz;
- ④、由所要求的比特速率与OFDM符号速率的比值,每个符号需要传送的比特:(25Mbit/s)/(1/4.8us)=120 bit。
- ⑤、为了完成上面 120bit 符号,有两种选择:利用 16QAM 和码率为 1/2 的编码方法,这样每个子载波携带 2bit 的有用信息,因此需要 60 个子载波;另一种是利用 QPSK 和码率为 3/4 的编码方法,每个子载波携带 1.5bit 信息。因此需要 80 个子载波,然而 80 个子载波意外着带宽:80*250KHz=20MHz,大于所给带宽要求,故取第一种,即 60 个子载波。可利用 64 点 IFFT 来实现,剩余 4 个子载波补 0。
六、OFDM 的完整仿真过程
1、MATLAB 源码
OFDM.m
clc;
clear;
%全文原理介绍见:https://zhuanlan.zhihu.com/p/57967971
%————————————————————————————————————————————————————————%
%q1:ifft点数难道不是应该等于子载波数吗?子载波数与ifft点数的关系?
%a:ifft点数等于子载波数
%q2:对矩阵进行fft?
%a:y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。
%q3:怎么对ofdm信号上变频
%————————————————————————————————————————————————————————%%% 参数设置N_sc=52; %系统子载波数(不包括直流载波)、number of subcarrierA
N_fft=64; % FFT 长度
N_cp=16; % 循环前缀长度、Cyclic prefix
N_symbo=N_fft+N_cp; % 1个完整OFDM符号长度
N_c=53; % 包含直流载波的总的子载波数、number of carriers
M=4; %4PSK调制
SNR=0:1:25; %仿真信噪比
N_frm=10; % 每种信噪比下的仿真帧数、frame
Nd=6; % 每帧包含的OFDM符号数;一帧OFDM通常由多个连续的OFDM符号组成 ;OFDM符号时长 = 子载波时长 × 子载波数量;一帧由多个连续的OFDM符号组成,每个OFDM符号由多个子载波组成。
P_f_inter=6; %导频间隔
data_station=[]; %导频位置
L=7; %卷积码约束长度
tblen=6*L; %Viterbi译码器回溯深度
stage = 3; % m序列的阶数
ptap1 = [1 3]; % m序列的寄存器连接方式
regi1 = [1 1 1]; % m序列的寄存器初始值%% 基带数据数据产生
P_data=randi([0 1],1,N_sc*Nd*N_frm);%% 信道编码(卷积码、或交织器)
%卷积码:前向纠错非线性码
%交织:使突发错误最大限度的分散化
%[133 171]卷积码其实是卷积码(2,1,7)的最佳编码形式
trellis = poly2trellis(7,[133 171]); %(2,1,7)卷积编码;首先是7,他是1*k的vector,此处k为1,[171 133]是k*n的vector,此处n就是2,那么这个编码就是1/2码率的卷积码,这个卷积码的约束长度是7,也就是输出与前7个输入相关,133,171是十进制数,代表的是前面寄存器的抽头位置。
code_data=convenc(P_data,trellis);%% qpsk调制
data_temp1= reshape(code_data,log2(M),[])'; %以每组2比特进行分组,M=4
data_temp2= bi2de(data_temp1); %二进制转化为十进制
modu_data=pskmod(data_temp2,M,pi/M); % 4PSK调制
% figure(1);
scatterplot(modu_data),grid; %星座图(也可以取实部用plot函数)%% 扩频
%————————————————————————————————————————————————————————%
%扩频通信信号所占有的频带宽度远大于所传信息必需的最小带宽
%根据香农定理,扩频通信就是用宽带传输技术来换取信噪比上的好处,这就是扩频通信的基本思想和理论依据。
%扩频就是将一系列正交的码字与基带调制信号内积
%扩频后数字频率变成了原来的m倍。码片数量 = 2(符号数)* m(扩频系数)
%————————————————————————————————————————————————————————%
% 由于m序列的均衡性、游程分布和自相关特性与随机序列的基本性质极其相似,所以通常将m序列称为为噪声(PN)序列,或称为伪随机序列
% 扩频通信的主要目的是提高通信信号的抗干扰性和保密性。通过在发送信号时对其进行频率扩展,使得信号在宽带频谱上占用更大的带宽,从而可有效抵消窄带干扰信号对于通信信号的影响
code = mseq(stage,ptap1,regi1,N_sc); % 扩频码的生成
code = code * 2 - 1; %将1、0变换为1、-1
modu_data=reshape(modu_data,N_sc,length(modu_data)/N_sc);
spread_data = spread(modu_data,code); % 扩频
spread_data=reshape(spread_data,[],1);%% 插入导频 梳状结构
P_f=3+3*1i; %Pilot frequency
P_f_station=1:P_f_inter:N_fft;%导频位置(导频位置很重要,why?)
pilot_num=length(P_f_station);%导频数量for img=1:N_fft %数据位置if mod(img,P_f_inter)~=1 %mod(a,b)就是求的是a除以b的余数data_station=[data_station,img];end
end
data_row=length(data_station);
data_col=ceil(length(spread_data)/data_row);pilot_seq=ones(pilot_num,data_col)*P_f;%将导频放入矩阵
data=zeros(N_fft,data_col);%预设整个矩阵
data(P_f_station(1:end),:)=pilot_seq;%对pilot_seq按行取if data_row*data_col>length(spread_data) % 判断数据的总数是否大于扩展数据的长度,如果是,说明书菊矩阵中还有空余位置,需要补零data2=[spread_data;zeros(data_row*data_col-length(spread_data),1)];%将数据矩阵补齐,补0是虚载频~
end%% 串并转换
data_seq=reshape(data2,data_row,data_col);
data(data_station(1:end),:)=data_seq;%将导频与数据合并%% IFFT
ifft_data=ifft(data); %% 插入保护间隔、循环前缀
Tx_cd=[ifft_data(N_fft-N_cp+1:end,:);ifft_data];%把ifft的末尾N_cp个数补充到最前面%% 并串转换
Tx_data=reshape(Tx_cd,[],1);%由于传输需要%% 信道(通过多经瑞利信道、或信号经过AWGN信道)Ber=zeros(1,length(SNR));Ber2=zeros(1,length(SNR));
for jj=1:length(SNR)rx_channel=awgn(Tx_data,SNR(jj),'measured');%添加高斯白噪声%% 串并转换Rx_data1=reshape(rx_channel,N_fft+N_cp,[]);%% 去掉保护间隔、循环前缀Rx_data2=Rx_data1(N_cp+1:end,:);%% FFTfft_data=fft(Rx_data2);%% 信道估计与插值(均衡)data3=fft_data(1:N_fft,:); Rx_pilot=data3(P_f_station(1:end),:); %接收到的导频h=Rx_pilot./pilot_seq; % 将接收到的导频除以发送的导频(pilot_seq)来估计信道的频域响应(h)% 将估计得到的信道响应(h)插值到数据子载波的位置(data_station)上,并得到最终的信道估计结果(H)。H=interp1( P_f_station(1:end)',h,data_station(1:end)','linear','extrap');%分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。对超出已知点集的插值点用指定插值方法计算函数值%% 信道校正 % 目的是消除信道引起的失真和干扰,使接收到的数据恢复到发送时的原始状态。% 信道校正的原理是利用估计得到的信道响应(H)对接收信号进行除法运算。由于信道引起的失真和干扰可以看作是对发送信号的乘性影响,% 通过将接收信号与信道响应的倒数相乘,可以抵消信道引起的乘性失真和干扰。这样,经过信道校正后的数据(data_aftereq)将尽可能接近发送时的原始数据。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); % 数据解扩
% if jj == 10
% tmp = reshape(demspread_data,[],1);
% scatterplot(tmp),grid;
% end%% QPSK解调demodulation_data=pskdemod(demspread_data,M,pi/M); De_data1 = reshape(demodulation_data,[],1);De_data2 = de2bi(De_data1);De_Bit = reshape(De_data2',1,[]);%% (解交织)
%% 信道译码(维特比译码)trellis = poly2trellis(7,[133 171]);rx_c_de = vitdec(De_Bit,trellis,tblen,'trunc','hard'); %硬判决%% 计算误比特率[err,Ber2(jj)] = biterr(De_Bit(1:length(code_data)),code_data);%译码前的误码率[err, Ber(jj)] = biterr(rx_c_de(1:length(P_data)),P_data);%译码后的误码率endfigure(2);semilogy(SNR,Ber2,'b-s');hold on;semilogy(SNR,Ber,'r-o');hold on;legend('4PSK调制、卷积码译码前(有扩频)','4PSK调制、卷积码译码后(有扩频)');hold on;xlabel('SNR');ylabel('BER');title('AWGN信道下误比特率曲线');figure(3)subplot(2,1,1);x=0:1:30;stem(x,P_data(1:31));ylabel('amplitude');title('发送数据(以前30个数据为例)');legend('4PSK调制、卷积译码、有扩频');subplot(2,1,2);x=0:1:30;stem(x,rx_c_de(1:31));ylabel('amplitude');title('接收数据(以前30个数据为例)');legend('4PSK调制、卷积译码、有扩频');
2、程序流程
程序流程思维导图文末资源自取。
3、仿真结果
①、QPSK 星座图
基带数据经过信道编码后进行 QPSK 调制后的星座图如下所示:
基带数据 -> 信道编码 -> QPSK 调制 -> 扩频 -> 插入导频 -> 串并转换 -> IFFT -> 插入保护间隔、循环前缀 -> 并串转换 -> 信道 -> 串并转换 -> 去掉保护间隔、循环前缀 -> FFT -> 信道估计与插值 -> 信道校正 -> 并串转换 -> 解扩频 后信噪比为 10dB 的星座图如下:
②、AWGN 信道下误比特率曲线
分析:信噪比越大,误码率越低
③、发送信号和接收信号对比
分析:对比上下两个图,可以看出信号解调后完全一样。
七、资源自取
以下部分源码来源于知乎子木前辈,对其中的代码注释进行了更详细的标注,思维导图自己制作,有需要的朋友自行取用。
OFDM深入学习及MATLAB仿真源码
参考文献:
1、多径效应、符号内干扰、符号间干扰ISI、ICI
2、OFDM完整仿真过程及解释(MATLAB)
3、【学习笔记】OFDM的原理和技术介绍以及仿真结果分析附代码–MATLAB
我的qq:2442391036,欢迎交流!
相关文章:

OFDM深入学习及MATLAB仿真
文章目录 前言一、OFDM 基本原理及概念1、OFDM 简介2、子载波3、符号4、子载波间隔与符号长度之间的关系 二、涉及的技术1、保护间隔2、交织3、信道编码4、扩频5、导频6、RF(射频)调制7、信道估计 三、变量间的关系四、IEEE 802.11a WLAN PHY 层标准五、…...

软件测试简历原来是写了这些才让面试官已读不回
前言: 马上就到了面试跳槽涨薪好时候了,最近看很多的小伙伴已经开始投简历了,一天投了几十次几百次,面试官已读不会,面试的机会都没有更别说后面的事情的,这是为什么呢? 很大一部分的原因是的…...

ESP32网络开发实例-Web服务器RGB LED调光
Web服务器RGB LED调光 文章目录 Web服务器RGB LED调光1、RGB LED介绍3、软件准备4、硬件准备4、代码实现在本文中,我们将创建一个 RGB LED 控制器网络服务器。 Web 服务器将显示用于设置 RGB LED 颜色的色谱。 颜色将主要分为三种:红色、绿色和蓝色。 用户将从光谱中选择一种…...

C# TCP Server服务端多线程监听RFID读卡器客户端上传的读卡数据
本示例使用设备介绍:液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sy…...

【electron】【附排查清单】记录一次逆向过程中,fetch无法请求http的疑难杂症(net::ERR_BLOCKED_BY_CLIENT)
▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ Adblock等插件拦截2️⃣ 【失败】Content-Security-Policy启动服务器json-serverhtml中的meta字段 3️⃣ 【失败】https vs httpwebPreferences & allowRunningInsecureContent disable-features 4️⃣ 【失败】检测fetch…...

【JS】scrollTop+scrollHeight+clientTop+clientHeight+offsetTop+offsetHeight
scrollTop、scrollHeight、clientTop、clientHeight、offsetTop以及offsetHeight 1. scrollTop 与 scrollHeight 1.1 scrollTop scrollTop 是这六个属性中唯一一个可写的属性。 Element.scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数。 一个元素的 scrollT…...

Go语言函数用法
文章目录 Go语言函数用法 Go语言函数用法 函数在Go语言中有多种用法,它们是组织和模块化代码、提高代码的可维护性和可重用性的关键部分。以下是函数的一些常见用法: 封装代码:函数允许将一组相关的代码块封装到一个独立的单元中,…...

3.5、Linux:命令行git的使用
个人主页:Lei宝啊 愿所有美好如期而遇 在Linux Centos7.6下安装git yum -y install git 注册一个gitee账号 进去注册就好,记住自己的用户名和密码。 创建一个仓库 点击复制,接着就可以在Linux上使用了 git clone git clone 刚才复制的地…...

基于servlet+jsp+mysql网上书店系统
基于servletjspmysql网上书店系统 一、系统介绍二、功能展示四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型:Java web项目 项目名称:基于servletjspmysql网上书店系统 项目架构:B/S架构 开发语言:Java语言 前端技…...

自用工具类整理
自动生成数据 uuid&雪花id private static Long workerId 1L; private static Long datacenterId 1L; private static Snowflake snowflake IdUtil.createSnowflake(workerId, datacenterId);public static String getId(String idType) {if (idType.equals("uui…...

jenkins2
jenkins插件管理安装:docker-build jenkins安装了docker 配置docke builder 添加 unix:///var/run/docker.sock rootubuntu20:~# usermod -G docker jenkins 修改docker中service文件添加 -H tcp://0.0.0.0:2376 jenkins中系统管理中 tcp://localhost:2376...

YOLOv5独家改进:分层特征融合策略MSBlock | 南开大学提出YOLO-MS |超越YOLOv8与RTMDet,即插即用打破性能瓶颈
💡💡💡本文独家改进:分层特征融合策略MSBlock,不同Kernel-Size卷积在不同尺度提升特征提取能力,最终引入到YOLOv5,做到二次创新 1)MSBlock使用;2)和C3结合使用 推荐指数:5颗星 MSBlock | 亲测在多个数据集能够实现大幅涨点,小目标检测效果也不错 💡💡…...

HTTP 协议详解-上(Fiddler 抓包演示)
文章目录 HTTP 协议HTTP 协议的工作过程HTTP 请求 (Request)认识URL关于 URL encode认识 "方法" (method)GET 方法POST 方法其他方法请求 "报头" (header)请求 "正文" (body) HTTP 响应详解状态码响应 "报头" (header) HTTP 协议 HTT…...

龙迅LT8911EXB功能概述 MIPICSI/DSI TO EDP
LT8911EXB 描述: Lontium LT8911EXB是MIPIDSI/CSI到eDP转换器,单端口MIPI接收器有1个时钟通道和4个数据通道,每个数据通道最大运行2.0Gbps,最大输入带宽为8.0Gbps。转换器解码输入MIPI RGB16/18/24/30/36bpp、YUV422 16/20/24bp…...

EtherCAT主站SOEM -- 5 -- SOEM之ethercatdc.h/c文件解析
EtherCAT主站SOEM -- 5 -- SOEM之ethercatdc.h/c文件解析 一 ethercatdc.h/c文件功能预览:二 ethercatdc.h/c 文件的主要函数的作用:2.1.1 函数:`ec_configdc()`2.1.2 函数:`ec_dcsync0(uint16 slave, boolean act, uint32 CyclTime, int32 CyclShift)`2.1.3 函数:`ec_dcs…...

【分布式事务】深入探索 Seata 的四种分布式事务解决方案的原理,优缺点以及在微服务中的实现
文章目录 前言一、XA 模式1.1 XA 模式原理1.2 XA 模式的优缺点及应用场景1.3 Seata XA 模式在微服务中的实现 二、AT 模式2.1 Seata AT 模式原理2.2 AT 模式的脏写问题和写隔离3.3 AT 模式的优缺点3.4 Seata AT 模式在微服务中的实现 三、TCC 模式3.1 TCC 模式原理3.2 Seata 的…...

C语言 || volatile
在C语言中,volatile是一个关键字,用于告诉编译器某个变量是易变的(即可能会被程序以外的因素修改),从而告诉编译器不要对该变量进行优化,以确保程序的正确性。 volatile常用于以下几种情况: 并…...

网络安全之CSRF漏洞原理和实战,以及CSRF漏洞防护方法
一、引言 总体来说CSRF属于一种欺骗行为,是一种针对网站的恶意利用,尽管听起来像跨站脚本(XSS),但是与XSS非常不同,并且攻击方式几乎向佐。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任…...

vivo 网络端口安全建设技术实践
作者:vivo 互联网安全团队 - Peng Qiankun 随着互联网业务的快速发展,网络攻击的频率和威胁性也在不断增加,端口是应用通信中的门户,它是数据进出应用的必经之路,因此端口安全也逐渐成为了企业内网的重要防线之一&…...

[ Linux Busybox ] flash_eraseall 命令解析
文章目录 相关结构体flash_eraseall 函数实现flash_eraseall 实现流程图 文件路径:busybox-1.20.2/miscutils/flash_eraseall.c 相关结构体 MTD 相关信息结构体 struct mtd_info_user {__u8 type; // MTD 设备类型__u32 flags; // MTD设…...

RabbitMQ 消息中间件 消息队列
RabbitMQ1、RabbitMQ简介2、RabbitMQ 特点3、什么是消息队列4、RabbiMQ模式5、集群中的基本概念 单实例安装RabbitMQ安装依赖安装erlang安装rabbitmq开启rabbitmq的web访问界面添加用户修改配置文件重启服务浏览器访问Rabbit-test rabbitMQ集群准备工作(三台&#x…...

ChatGPT王炸升级GPT-4 Turbo:更强大还更便宜
11月7日,OpenAI首届开发者大会如期召开,在大会上OpenAI正式推出了GPT-4 Turbo。 据OpenAI介绍,相比于GPT-4,GPT-4 Turbo主要有6方面的提升: 第一,上下文对话长度,GPT4最大只能支持8k的上下文长…...

3.JMeter高级使用-让你与众不同
目录 概述插件下载与安装插件下载配置插件 服务器硬件资源监控(精简版)配置服务端代理JMeter配置监控CPU监控网络 JMeter下载结束 概述 今日目标: 插件下载与安装Basic Graphs 主要点 Average Response Time 平均响应时间Active Threads 活动线程数Successful/Fai…...

考研408-计算机网络 第一章-计算机网络体系结构学习笔记及习题
第一章 计算机网络体系结构 一 计算机网络概述 1.1 概念及功能 1.1.1 计算机网络的概念 计算机网络就是互连的、自治的计算机系统的集合 互连:通过通信链路互联互通 自治:各个节点之间无主从关系,高度自治的 1.1.2 计算机网络的功能 功…...

【快速使用ShardingJDBC的哈希分片策略进行分库分表】
文章目录 🔊博主介绍🥤本文内容🍊1.引入maven依赖🍊2.启动类上添加注解MapperScan🍊3.添加application.properties配置🍊4.普通的自定义实体类🍊5.写个测试类验证一下🍊6.控制台打印…...

102. 二叉树的层序遍历
原题链接:102. 二叉树的层序遍历 以下代码为模板,需要层序遍历时都可以使用该模板进行代码更改 全代码: class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {//创建一个TreeNode* 队列用于存储树中的每…...

macOS磁盘分区调整软件--Paragon Camptune X 中文
Paragon Camptune X是一款专为Mac用户设计的强大分区大小调整工具。通过它,用户可以简便地调整Mac硬盘上的分区大小,实现存储空间的高效管理。无论是需要在Mac和Windows系统之间切换的双系统用户,还是有其他特定存储需求的用户,Ca…...

kaggle中报错NameError: name ‘q_1‘ is not defined
在开始练习之前,先点击“全部运行”按钮。...

SQL注入漏洞 其他注入
文章目录 宽字节注入案例 HTTP头部注入Cookie注入base64User-Agent注入Referer 注入 SQL注入读写文件条件1.是否拥有读写权限2.文件路径3.secure_file_priv 读取文件写入文件 SQLMap安装sqlmapkail 源安装仓库克隆 参数简介快速入门;SQLmap(常规…...

Java自学第2课:Java语言基础知识要点
1 Java主类结构 任务:创建新项目名为item,包名为number,类名为first。 1.1 包声明 不指定包时,默认就是工程名,指定后,类文件可以分类了,是这意思吧。包就大概等于一个文件夹。而且在类文件中…...