OFDM深入学习及MATLAB仿真

news2024/11/26 20:49:59

文章目录

  • 前言
  • 一、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,:);

%% FFT
    fft_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);%译码后的误码率

end
 figure(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 星座图

基带数据 -> 信道编码 -> QPSK 调制 -> 扩频 -> 插入导频 -> 串并转换 -> IFFT -> 插入保护间隔、循环前缀 -> 并串转换 -> 信道 -> 串并转换 -> 去掉保护间隔、循环前缀 -> FFT -> 信道估计与插值 -> 信道校正 -> 并串转换 -> 解扩频 后信噪比为 10dB 的星座图如下:
请添加图片描述

②、AWGN 信道下误比特率曲线

请添加图片描述
分析:信噪比越大,误码率越低

③、发送信号和接收信号对比

请添加图片描述
请添加图片描述
分析:对比上下两个图,可以看出信号解调后完全一样。

七、资源自取

以下部分源码来源于知乎子木前辈,对其中的代码注释进行了更详细的标注​,思维导图自己制作,有需要的朋友自行取用。
OFDM深入学习及MATLAB仿真源码
在这里插入图片描述

参考文献
1、多径效应、符号内干扰、符号间干扰ISI、ICI
2、OFDM完整仿真过程及解释(MATLAB)
3、【学习笔记】OFDM的原理和技术介绍以及仿真结果分析附代码–MATLAB


我的qq:2442391036,欢迎交流!


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

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

相关文章

电脑怎么做图片二维码?在线制作二维码的方法

图片制作二维码是现在经常被使用的一个功能,比如产品照片、自拍、海报等等不同格式或者类型的文件都可以生成二维码。那么想要快速完成二维码制作,使用图片二维码生成器就可以快速完成制作,本文将给大家分享一下在电脑上制作图片二维码的操作…

python自动化测试(4)-使用第三方python库技术实现

1 概述 关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化做好接口自动化,一定要有透过界面看到数据本质的能力 后面所谈到的 测试自动化 也将围绕着 接口自动化 来…

手写一个Webpack,带你了解构建流程

如果对前端八股文感兴趣,可以留意公重号:码农补给站,总有你要的干货。 前言 Webpack是一个强大的打包工具,拥有灵活、丰富的插件机制,网上关于如何使用Webpack及Webpack原理分析的技术文档层出不穷。最近自己也是发现…

人大金仓物理备份异机恢复

概述 KingbaseES V8支持使用RMAN物理备份在异机环境恢复,通过重新克隆方式完扩展主备集群。 原集群环境:演示用例,仅供参考 查看原集群备份和物理备份路径 异机恢复 前置条件 *获取原集群物理备份文件,包括全量备份、增量备份…

基于springboot的医护人员排班系统 全套代码 全套视频教程

基于springboot的医护人员排班系统,springboot vue mysql (毕业论文10411字以上,共27页,程序代码,MySQL数据库) 代码获取: 链接:https://pan.baidu.com/s/177HdCGtTvqiHP4O7qWAgxA?pwd0jlf 提取码:0jlf 【运行环境】 IDEA, JDK1.8, My…

后视镜为什么要检测反射率

后视镜反射率检测是评估后视镜质量的重要步骤,可以反映后视镜的反射效果是否满足设计要求。一般来说,后视镜的反射率越高,驾驶员观察车后的道路状况就越清晰,从而能够更好地判断与后方车辆的距离和速度差。 后视镜反射率检测的原理…

C++冒号的作用域

当同时定义了一个全局变量a和局部变量a: 结果输出了局部变量的10,因为程序遵循就近原则。 :: 代表全局作用域 如果想无视就近原则,打印全局变量的a,就在输出时把a的前面加两个冒号。 ::

【ChatGLM2-6B】小白入门及Docker下部署

【ChatGLM2-6B】小白入门及Docker下部署 一、简介1、ChatGLM2是什么2、组成部分3、相关地址 二、基于Docker安装部署1、前提2、CentOS7安装NVIDIA显卡驱动1)查看服务器版本及显卡信息2)相关依赖安装3)显卡驱动安装 2、 CentOS7安装NVIDIA-Doc…

Nginx常用配置与命令,nginx代理转发配置

Nginx特点 高并发、高性能; 模块化架构使得它的扩展性非常好; 异步非阻塞的事件驱动模型这点和 Node.js 相似; 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性; 热部署、平滑升级; 完全开源,生态繁荣; Nginx作用 Nginx 的最重要的…

JAVA IDEA 下载

超简单步骤一: IntelliJ IDEA 官方下载链接 点击以上链接进入下图,点击下载 继续点下载,然后等待下载完后打开安装包即可 步骤二: 打开下好的安装包,点击Browse...我们把它下载到自己喜欢的地方(主要是别占…

信息系统项目管理师第四版:第5章 信息系统工程

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 信息系统工程是用系统工程的原理、方法来指导信息系统建设与管理的一门工程技术学科,它是信息科学、管理科学、系统科学、计算机科学与通信技术相结合…

简析电能管理系统在某煤矿的应用

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要:针对传统的煤矿电能管理主要是由专人人工抄表,存在抄收数据繁琐,统计困难,煤矿用电分析等方面数据缺乏,电量峰谷比不合理等问题。某煤矿应用电能管理系统&#…

11月9日星期四今日早报简报微语报早读

11月9日星期四,农历九月廿六,早报微语早读。 1、中国数字经济规模十年增至50.2万亿元,网民规模增至10.79亿; 2、世界互联网发展指数排名发布:中国位居第二; 3、中国—拉美开发性金融合作机制扩容&#x…

【修车案例】一波形一案例(10)

故障车型: 2005 teana 2.0日产 维修厂: 建兴汽车保养厂示波器诊断: 通道A – ABS霍尔传感器信号测量故障分析: 诊断计算机报错左后轮胎轮速异常, 速度与其他车轮差较大。 通过示波器量测ABS信号, 2线式霍尔传感器, 信道A正极接信号线, 负极接地线, 干扰较严重就不建议从蓄电池…

图解三傻排序 选择排序、冒泡排序、插入排序

&#xff08;1&#xff09;选择排序 // 交换 void swap(int arr[], int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp; }// 选择排序 void selectionSort(int arr[],int len) {if (len < 2) return;for (int minIndex, i 0; i < len - 1; i) {minIndex i;f…

彻底改变您的用户体验设计:您需要了解的 5 个工具包和指南

问题 进行设计冲刺、设计思维工作坊期间&#xff0c;如何找到好用的UX工具&#xff1f; 市面上有很多优秀的UX书籍&#xff0c;但也有越来越多的在线 用户体验设计 工具包和方法指南详细介绍了大量的UX工具和方法&#xff0c;包括这些方法是什么、为什么要用、何时用还有怎么…

这8大优势你都不知道,你敢说你精通单元测试?

一、什么是单元测试 在计算机编程中&#xff0c;单元测试是一种软件测试方法&#xff0c;通过该方法可以测试源代码的各个单元以确定它们是否适合使用。单元是最小的可测试软件组件&#xff0c; 它通常执行单个内聚功能。单元测试就是是指对这个最小可测试组件——即单元进行检…

SAP 开发查找增强程序

参考文章https://blog.csdn.net/SAPmatinal/article/details/129987722?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169949816116800225559526%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id16994981611680022555…

为什么冰酒会被视为珍品?

在某些年份&#xff0c;珍贵稀有的葡萄酒让酿酒师有了冒险的意愿&#xff0c;葡萄比平时在藤上停留更长时间&#xff0c;需要等待至少-7℃的温度&#xff0c;酿酒师需要与自然玩游戏&#xff0c;可以持续到1月&#xff0c;在罕见的情况下可以持续到2月。对于酿酒师来说&#xf…