OFDM通信系统仿真之交织技术

文章目录

  • 前言
  • 一、交织
    • 1、概念
    • 2、图形举例
    • 3、交织的位置
  • 二、MATLAB仿真
    • 1、MATLAB 程序
    • 2、仿真结果


前言

之前的博客:OFDM深入学习及MATLAB仿真 中有对交织的概念进行讲解,但讲解还是比较浅显,且仿真实现时并没有加入交织及解交织流程,这里单独对交织的原理做一个讲解并在原来代码的基础上加入交织及解交织流程,再去对比一下加入后和加入前的误比特率。


一、交织

1、概念

交织是为了在时域或者频域,或者同时在时域、频域上分布传输的信息比特,使信道的突发错误在时间上得以扩散,从而使得译码器可以将他们当做随机错误处理。交织器在几个分组长度或几个约束长度的范围内对码元进行混淆,这个范围是由突发持续时间决定的。如果系统是一个纯粹的 AWGN 环境下运行,即准平稳信道,则交织的必要性不大。

  • 作用:交织的作用是将突发错误转换为随机错误,有利于前向纠错码的译码,提高了整个通信系统的可靠性。
  • 原理:交织技术是改变数据流的传输顺序,将突发的错误随机化,提高纠错编码的有效性。
  • 种类:分组交织、卷积交织
    • 分组交织:按列写入,按行读出。去交织时,则是按行写入,按列读出,利用这种行、列倒换,可将长突发误码随机化、离散化,克服较深的衰落。但它的主要缺点是带来较大的附加延时,交织深度越大时延越大。
    • 卷积交织:卷积交织使用一个线性移位寄存器和一个交织器来重新排列数据。数据按照一定的规则通过寄存器,然后通过交织器进行交织操作,最后输出交织后的数据。
  • 方法:交织由两个变换过程组成。
    • 第一次变换保证了相邻的编码比特被映射到不相邻的子载波上。
    • 第二次变换保证了相邻的编码比特被分别映射到星座图的重要和非重要比特上,避免出现长时间的低比特位映射。
  • 交织块的长度: Ncbps,对 qpsk、16qam、64qam 分别为 2、4、6,s=Ncbps/2,d=16。

2、图形举例

假设我要传输下图这样的一个数据,一行一行的传输,很有可能在我传输的过程中信道环境突然有个干扰导致,那么就会造成在传输空间传输的时候,导致下图某一片数据(红框内)受到干扰,然而我们之前讲到的信道编码(卷积码)可以进行纠错,但只是纠正几位减少几位的错误,然而我目前出现了一大片数据错误导致纠错码的功能也捉襟见肘了,从而接收端在接收到的时候识别错误,为了解决这个问题,交织技术就应运而生了。
在这里插入图片描述
交织的原理就是将错误可以打散到整个 OFDM 帧中,从而 OFDM的每个子帧里面对应的纠错码就可以对其进行纠错(下图红圈内为打散后的错误码)
在这里插入图片描述

3、交织的位置

了解到交织的原理后,我们得先明确到交织技术所应用的位置,如下图所示,交织使用的位置在编码之后和数字调制之前,在 bit 域中。
在这里插入图片描述

二、MATLAB仿真

本文仿真所采用的交织方式为分组交织。

1、MATLAB 程序

clc;
clear;%% 参数设置
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个输入相关,133171是十进制数,代表的是前面寄存器的抽头位置。
code_data=convenc(P_data,trellis);%% 交织
interleaved_data = matintrlv(code_data, log2(M), length(code_data) / log2(M));
code_data = interleaved_data;%% 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;         %10变换为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,[]);%% 解交织deinterleaved_data = matdeintrlv(De_Bit, log2(M), length(De_Bit) / log2(M));De_Bit = deinterleaved_data;
%% 信道译码(维特比译码)trellis = poly2trellis(7,[133 171]);rx_c_de = vitdec(De_Bit,trellis,tblen,'trunc','hard');   %硬判决%% 计算误比特率[err, Ber(jj)] = biterr(rx_c_de(1:length(P_data)),P_data);%译码后的误码率endfigure(2);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:60;stem(x,P_data(1:61));ylabel('amplitude');title('发送数据(以前60个数据为例)');legend('4PSK调制、卷积译码、有扩频');subplot(2,1,2);x=0:1:60;stem(x,rx_c_de(1:61));ylabel('amplitude');title('接收数据(以前60个数据为例)');legend('4PSK调制、卷积译码、有扩频');

2、仿真结果

上述程序将交织及解交织相关的程序注释后跑出的仿真如下:
在这里插入图片描述

未加入交织技术

上述程序将交织及解交织相关的程序加入系统后跑出的仿真如下:
在这里插入图片描述

加入交织技术

从上述仿真的结果可以看出,加入交织技术后误比特率为 0 所需的信噪比更低一些,因此通信性能更优。


我的qq:2442391036,欢迎交流!


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

庖丁解牛:NIO核心概念与机制详解 01 _ 入门篇

文章目录 Pre输入/输出Why NIO流与块的比较通道和缓冲区概述什么是缓冲区?缓冲区类型什么是通道?通道类型 NIO 中的读和写概述Demo : 从文件中读取1. 从FileInputStream中获取Channel2. 创建ByteBuffer缓冲区3. 将数据从Channle读取到Buffer中 Demo : 写…

【评估分级方法】自然断点法(Python实现全代码)

自然断点法 自然断点法有两个称呼,一个就是直接英文名称,叫做“Natural Breaks”,这就不解释了,还有一个称呼就是ArcGIS里面用的,叫做“Jenks”,主要是来源于它的创造者:乔治弗雷德里克詹克斯&…

python 的 import 机制

引言 对于初学 python,或多或少在 import 一个 module 时遇到过 ImportError: attempted relative import with no known parent package 这样的错误信息。对于初学 python,遇到这样的问题是因为在执行 python xxx.py 程序时,xxx.py 程序中 …

ubuntu安装完qt后发现找不到图标

layout: post # 使用的布局(不需要改) title: Qt启动问题 # 标题 subtitle: ubuntu安装完Qt #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: true # 是否归档 tags: …

R语言:利用biomod2进行生态位建模

在这里主要是分享一个不错的代码,喜欢的可以慢慢研究。我看了一遍,觉得里面有很多有意思的东西,供大家学习和参考。 利用PCA轴总结的70个环境变量,利用biomod2进行生态位建模: #------------------------------------…

【半监督学习】CNN与Transformer的结合

本文介绍了几篇结合使用CNN和Transformer进行半监督学习的论文,CNN&Trans(MIDL2022),Semi-ViT(ECCV2022),Semiformer(ECCV2022). Semi-Supervised Medical Image Seg…

【Promise12数据集】Promise12数据集介绍和预处理

【Segment Anything Model】做分割的专栏链接,欢迎来学习。 【博主微信】cvxiayixiao 本专栏为公开数据集的介绍和预处理,持续更新中。 要是只想把Promise12数据集的raw形式分割为png形式,快速导航,直接看2,4标题即可 …

交易机器人-规则部分

微信公众号:大数据高性能计算 背景 背景是基于人工去做交易本身无法做到24小时无时无刻的交易,主要是虚拟币本身它是24小时交易,人无法做到24小时盯盘,其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行…

个人博客添加访问人数以及访问时间-githubpage

layout: post # 使用的布局(不需要改) title: 个人博客添加访问人数以及访问时间 # 标题 subtitle: 个人博客优化 #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: tr…

MySQL 的执行原理(四)

5.5. MySQL 的查询重写规则 对于一些执行起来十分耗费性能的语句,MySQL 还是依据一些规则,竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式,这个过程也可以 被称作查询重写。 5.5.1. 条件化简 我们编写的查询语句的搜索条件…

【数据结构初阶】单链表SLlist

描述 不同于顺序表,顺序表的数据是存储在一个连续的空间里的 而链表它是链接起来的结构体地址。 所以我们不用像顺序表一样先创建一块空间出来,而是创建一个能存数据节点和节点与下一个节点之间的连接; 所以:“一个能存数据节点…

redis+python 建立免费http-ip代理池;验证+留接口

前言: 效果图: 对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个! 思路: 1.单页获取ipporttime (获取time主要是为了后面使用的时候,依照时效可以做文章) 2.整…