前言
之前的博客:OFDM深入学习及MATLAB仿真 中有对交织的概念进行讲解,但讲解还是比较浅显,且仿真实现时并没有加入交织及解交织流程,这里单独对交织的原理做一个讲解并在原来代码的基础上加入交织及解交织流程,再去对比一下加入后和加入前的误比特率。
一、交织
1、概念
交织是为了在时域或者频域,或者同时在时域、频域上分布传输的信息比特,使信道的突发错误在时间上得以扩散,从而使得译码器可以将他们当做随机错误处理。交织器在几个分组长度或几个约束长度的范围内对码元进行混淆,这个范围是由突发持续时间决定的。如果系统是一个纯粹的 AWGN 环境下运行,即准平稳信道,则交织的必要性不大。
作用
:交织的作用是将突发错误转换为随机错误,有利于前向纠错码的译码,提高了整个通信系统的可靠性。原理
:交织技术是改变数据流的传输顺序,将突发的错误随机化,提高纠错编码的有效性。种类
:分组交织、卷积交织- 分组交织:按列写入,按行读出。去交织时,则是按行写入,按列读出,利用这种行、列倒换,可将长突发误码随机化、离散化,克服较深的衰落。但它的主要缺点是带来较大的附加延时,交织深度越大时延越大。
- 卷积交织:卷积交织使用一个线性移位寄存器和一个交织器来重新排列数据。数据按照一定的规则通过寄存器,然后通过交织器进行交织操作,最后输出交织后的数据。
方法
:交织由两个变换过程组成。- 第一次变换保证了相邻的编码比特被映射到不相邻的子载波上。
- 第二次变换保证了相邻的编码比特被分别映射到星座图的重要和非重要比特上,避免出现长时间的低比特位映射。
交织块的长度
: Ncbps,对 qpsk、16qam、64qam 分别为 2、4、6,s=Ncbps/2,d=16。
2、图形举例
假设我要传输下图这样的一个数据,一行一行的传输,很有可能在我传输的过程中信道环境突然有个干扰导致,那么就会造成在传输空间传输的时候,导致下图某一片数据(红框内)受到干扰,然而我们之前讲到的信道编码(卷积码)可以进行纠错,但只是纠正几位减少几位的错误,然而我目前出现了一大片数据错误导致纠错码的功能也捉襟见肘了,从而接收端在接收到的时候识别错误,为了解决这个问题,交织技术就应运而生了。
交织的原理就是将错误可以打散到整个 OFDM 帧中,从而 OFDM的每个子帧里面对应的纠错码就可以对其进行纠错(下图红圈内为打散后的错误码)
3、交织的位置
了解到交织的原理后,我们得先明确到交织技术所应用的位置,如下图所示,交织使用的位置在编码之后和数字调制之前,在 bit 域中。
二、MATLAB仿真
本文仿真所采用的交织方式为分组交织。
1、MATLAB 程序
代码语言:javascript复制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个输入相关,133,171是十进制数,代表的是前面寄存器的抽头位置。
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; %将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,[]);
%% 解交织
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);%译码后的误码率
end
figure(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 所需的信噪比更低一些,因此通信性能更优。