OFDM在光纤通信中的卷积编码.docx
《OFDM在光纤通信中的卷积编码.docx》由会员分享,可在线阅读,更多相关《OFDM在光纤通信中的卷积编码.docx(23页珍藏版)》请在冰豆网上搜索。
![OFDM在光纤通信中的卷积编码.docx](https://file1.bdocx.com/fileroot1/2023-1/22/2f5c5084-496a-4aa3-b409-670536a8aff6/2f5c5084-496a-4aa3-b409-670536a8aff61.gif)
OFDM在光纤通信中的卷积编码
OFDM在光纤通信中的卷积编码的研究
一、实验工具:
MathworksMatlab
二、实验目的:
掌握信道编码,卷积编码的编码与解码方式,熟练操作Matlab软件;
三、实验要求:
1、Matlab完成简单的OFDM信号的产生与解调程序;
2、信道编码采用卷积编码,解码采用维特比译码;
3、OFDM符号采用QPSK映射方式;
4、采用不同的编码速率进行编码,如:
1/3,1/2,5/8,or3/4;
5、在AWG信道下,比较卷积编码的OFDM系统的误比特率性能;
6、具体的编码要求,见参考文献pp55-59。
五、实验内容
3.1OFDM
3.1.1OFDM基本原理
OFDM(OrthogonalFrequencyDivisionMultiplexing)即正交频分复用技术,OFDM是一种无线环境下的高速传输技术。
无线信道的频率响应曲线大多是非平坦的,而OFDM技术的主要思想就是在频域内将给定信道分成许多正交子信道,在每个子信道上使用一个子载波进行调制信号带宽小于信道的相应带宽,因此就可以大大消除信号波形间的干扰。
由于在OFDM系统中各个子信道的载波相互正交,它们的频谱是相互重叠的,这样不但减小了子载波间的相互干扰,同时又提高了频谱利用率。
OFDM的基本思想是把高速率的信源信息流通过串并变换,变换成低速率的N路并行数据流,然后将这N路数据流分别调到N个相互正交的子载波上,再将N路调制后的信号相加即得发射信号。
3.1.2、OFDM调制原理框图
其主要思想是:
将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。
正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰ICI。
每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上的可以看成平坦性衰落,从而可以消除符号间干扰。
而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。
OFDM通过把需要发射的数据流分解为若干个并行的数据子流,这样每个数据子流在速率上就会降低很多,然后再进行相关调制,将它们调制到一组总数为N,频率之间的间隔相等,且又两两正交的子载波上。
设一个OFDM符号之内包含N个经过相移键控(PSK)或者正交幅度调制(QAM)的子载波。
T表示OFDM符号的持续时间(周期),则OFDM的基带信号为
(3一1)
对于信号s(t)以T/N的速率进行抽样,即令t=kT/N(k=0,1,…,N-1),则可得:
(3一2)
可以看出,抽样值刚好为N点反离散傅里叶变换(IDFT)。
同样在接收端,恢复原始数据符号
的处理就可以通过对
进行N点离散傅里叶变换(DFT)获得。
由此可见,OFDM系统的调制和解调可以分别通过IDFT/DFT来实现。
下图为OFDM系统的调制与解调框图。
2、OFDM解调原理框图
3.1.3Matlab完成简单的OFDM信号的产生于解调
方案一:
c=6;%子载波个数
bits=108;%每个信道的比特数
n=c*bits;%总的传送比特数
data=2*round(rand(1,n))-1;%产生信源数据
s=reshape(data,c,bits);%串/并变换
tp=1:
0.1:
(1+10.8)-0.1;
fori=1:
c
carrier(i,:
)=cos(2*i*pi*tp);%产生载波信号
bpsk_sig(i,:
)=s(i,:
).*carrier(i,:
);%产生调制信号
fin(i,:
)=ifft(bpsk_sig(i,:
));%对信号进行IFFT
end
%并串变换
transmit=reshape(fin,1,648);
%加噪声
snr=10;
rxdata=awgn(transmit,snr,'measured');
%并串变换
rec=reshape(rxdata,c,bits);
fori=1:
c
rd(i,:
)=fft(rec(i,:
));%进行FFT处理
uncarry(i,:
)=rd(i,:
).*carrier(i,:
);%解调
end
rdata=sign(real(uncarry));%判决输出结果
%并串变换
rdout=reshape(rdata,1,648);
通过对比rdata和data
方案二:
Tu=224e-6;%usefulOFDMsymbolperiod224微秒作用符号周期
T=Tu/2048;%basebandelementaryperiod基带基本周期
%求每个子载波的周期,2k模式里有2048个子载波(方便FFT/IFFT计算)
%2048=1512(数据载波)+17(参数信令载波TPS)+176(导频载波)+343(虚拟载波)
G=1/4;%choiceof1/4,1/8,1/16,and1/32保护间隔长度,这里为1/4
delta=G*Tu;%guardbandduration
Ts=delta+Tu;%totalOFDMsymbolperiod
Kmax=1705;%numberofsubcarriers有效子载波1705=1512(数据载波)+17(参数信令载波TPS)+176(导频载波)
Kmin=0;
FS=4096;%IFFT/FFTlength2N-IFFT,N=2048.
%一般情况下我觉得取2048就可以了,我猜想用4096的目的是考虑中心频率,而且这样的话采样频率不变,
q=10;%carrierperiodtoelementaryperiodratio
fc=q*1/T;%carrierfrequencyf=1/T=9.124这个关系使得载波频率接近于90MHz,这个频率是VHF信道5的范围内,
Rs=4*fc;%simulationperiod是基带信号初始周期长度,
t=0:
1/Rs:
Tu;%Datagenerator(A确定一个符号周期内的采样点数)
M=Kmax+1;%1706便于计算,产生1706个4QAM符号
rand('state',0);
a=-1+2*round(rand(M,1)).'+i*(-1+2*round(rand(M,1))).';%有0,1转换成-1,1调制信号,将二进制信息映射到星座图上
%从A开始到info结束是串并转换,将每个OFDM符号的串行数据分配到多个信道上,每个信道上若干个数据(子载波是并行的,每个子载波上的数据也是并行的,所以数据要经过串并转换,分别调制个个子载波)。
A=length(a);
info=zeros(FS,1);
info(1:
(A/2))=[a(1:
(A/2)).'];%Zeropadding
info((FS-((A/2)-1)):
FS)=[a(((A/2)+1):
A).'];%info的长度是4096,前853和后853的a值的倒置,中间补0
%Subcarriersgeneration(B)
carriers=FS.*ifft(info,FS);%频域转时域,始于信号可以世家顺序依次发送
%IFFT保证各个子载波之间的正交性,%把数据调制(频谱搬移)到不同的的正交子载波上
tt=0:
T/2:
Tu;
figure
(1);
subplot(211);
stem(tt(1:
20),real(carriers(1:
20)));%绘制针状图
%real函数是求实部,imag函数求虚部,
%abs函数是求模,angle函数求这个复数在复平面内的角度
subplot(212);
stem(tt(1:
20),imag(carriers(1:
20)));
figure
(2);
f=(2/T)*(1:
(FS))/(FS);
subplot(211);
plot(f,abs(fft(carriers,FS))/FS);
[Pxx,f]=pwelch(carriers,[],[],[],2/T);
plot_Pxx1=10*log10(Pxx);
subplot(212);
plot(f,plot_Pxx1);
%D/Asimulation数模转换
L=length(carriers);
chips=[carriers.';zeros((2*q)-1,L)];%串并转换,得到81939个字符
p=1/Rs:
1/Rs:
T/2;
g=ones(length(p),1);%pulseshape脉冲波形
figure(3);
stem(p,g);
dummy=conv(g,chips(:
));%卷积
u=[dummy(1:
length(t))];%(C)%这里去的是81921个符号,但是最后一位是0,%所以只有81920个
figure(4);
subplot(211);
plot(t(1:
400),real(u(1:
400)));;%画出x,y,当两者有相应的矩阵或者量,
%就是画出y相对于x
subplot(212);
plot(t(1:
400),imag(u(1:
400)));
figure(5);
ff=(Rs)*(1:
(q*FS))/(q*FS);
subplot(211);
plot(ff,abs(fft(u,q*FS))/FS);
[Pxx,f]=pwelch(u,[],[],[],Rs);%U是要处理的信号2是窗函数3是分段平均时%重合的部分4是fft的点数Rs是采样频率
plot_Pxx2=10*log10(Pxx);
subplot(212);
plot(f,plot_Pxx2);
[b,a]=butter(13,1/20);%reconstructionfilter这里得到的是光滑的模拟信号。
%这里的butterworth滤波器,是13阶,
%1/20是固有频率与采样频率Fs有关
[H,F]=freqz(b,a,FS,Rs);
通过低通滤波器,下一半为噪声。
3.2卷积编码和维特比译码及QPSK
3.2.1卷积原理
介绍了卷积码的原理,给出了卷积码的几种表示方法及卷积码的性能描述;接着给出了维特比译码算法的基本原理。
卷积码是1955年由爱里斯提出,它与分组编码不同。
分组码中本组中的n-k个校验元仅与本组中的k个信息元有关,与其他组的码元无关。
分组码译码时,也只从本组中提取有关译码信息。
但卷积编码中,编码码字不仅与本组的信息有关,而且与以前时刻的其他组的信息有关。
同样,译码时不仅从此时刻收到的码组中提取译码信息,同时还利用以前一段时刻收到的码字。
卷积码以“位”为单位进行,因此编码设备结构比分组码简单。
卷积码的译码方式有二种:
(1)1963年由梅西(Masse)提出的门限译码,这是一种码代数结构的代数译码,类似于分组码中的大数逻辑译码;
(2)1961年由沃曾克拉夫特(Wozencraft)提出,1963年由费诺(Eano)改进的序列译码,这是基于码树图结构上的一种准最佳的概率译码;(3)1967年由维特比(Viterbi)提出的Viterbi算法,这是基于码的网(trellis)图基础上的一种最大似然译码算法,是一种最佳的概率译码方法。
维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间。
卷积码通常用(n,k,m)表示。
m为编码约束长度,说明编码过程中互相约束的码段个数。
k/n=R同分组码一样称为卷积码的码率。
它们是衡量卷积码的重要参数。
典型的卷积编码器如图所示。
卷积编码器
%cnv_encd.m
%卷积码编码程序
functionoutput=cnv_encd(G,k0,input)
%cnv_encd(G,k0,input),k0是每一时钟周期输入编码器的bit数,
%G是决定输入序列的生成矩阵,它有n0行L*k0列n0是输出bit数,
%参数n0和L由生成矩阵G导出,L是约束长度。
L之所以叫约束长度
%是因为编码器在每一时刻里输出序列不但与当前输入序列有关,
%而且还与编码器的状态有关,这个状态是由编码器的前(L-1)k0。
%个输入决定的,通常卷积码表示为(n0,k0,m),m=(L-1)*k0是编码
%器中的编码存贮个数,也就是分为L-1段,每段k0个
%有些人将m=L*k0定义为约束长度,有的人定义为m=(L-1)*k0
%查看是否需要补0,输入input必须是k0的整数部
ifrem(length(input),k0)>0
input=[input,zeros(size(1:
k0-rem(length(input),k0)))];
end
n=length(input)/k0;
%检查生成矩阵G的维数是否和k0一致
ifrem(size(G,2),k0)>0
error('Error,Gisnotoftherightsize.')
end
%得到约束长度L和输出比特数n0
L=size(G,2)/k0;
n0=size(G,1);
%在信息前后加0,使存贮器归0,加0个数为(L-1)*k0个
u=[zeros(size(1:
(L-1)*k0)),input,zeros(size(1:
(L-1)*k0))];
%得到uu矩阵,它的各列是编码器各个存贮器在各时钟周期的内容
u1=u(L*k0:
-1:
1);
%将加0后的输入序列按每组L*k0个分组,分组是按k0比特增加
%从1到L*k0比特为第一组,从1+k0到L*k0+k0为第二组,。
。
。
。
,
%并将分组按倒序排列。
fori=1:
n+L-2
u1=[u1,u((i+L)*k0:
-1:
i*k0+1)];
end
uu=reshape(u1,L*k0,n+L-1);
%得到输出,输出由生成矩阵G*uu得到
3.2.2QPSK技术
1QPSK原理
四相相移调制是利用载波的四种不同相位差来表征输入的数字信息,是四
进制移相键控。
QPSK是在M=4时的调相技术,它规定了四种载波相位,分别为45°,
135°,225°,315°,调制器输入的数据是二进制数字序列,为了能和四进制的载
波相位配合起来,则需要把二进制数据变换为四进制数据,这就是说需要把二进制数
字序列中每两个比特分成一组,共有四种组合,即00,01,10,11,其中每一组称
为双比特码元。
每一个双比特码元是由两位二进制信息比特组成,它们分别代表四进
制四个符号中的一个符号。
QPSK中每次调制可传输2个信息比特,这些信息比特是通过载波的四种相位来传递的。
解调器根据星座图及接收到的载波信号的相位来判断发送端发送的信息比特。
图2-1QPSK相位图
以π/4QPSK信号来分析
当输入的数字信息为“10”码元时,输出已调载波
(2-1)
当输入的数字信息为“00”码元时,输出已调载波
(2-2)
当输入的数字信息为“01”码元时,输出已调载波
(2-3)
当输入的数字信息为“11”码元时,输出已调载波
(2-4)
QPSK调制框图
QPSK调制规则
接收机收到某一码元的QPSK信号可表示为:
yi(t)=acos(2πfct+φn)其中(2-5)
QPSK解调原理分析
由QPSK的解调框图得到:
(2-6)
(2-7)
(2-8)
(2-9)
符号相位
的极性
的极性
判决器输出
A
B
+
+
1
1
-
+
0
1
-
-
0
0
+
-
1
0
QSK信号解调器的判决准则
3.2.3维特比译码原理
由于卷积码的编码输出序列一定对应着网格图(或码树)中的一条路径,因此卷积码的最大似然译码,就是根据收到的序列R,按照最大似然译码的准则,力图在网格图上找到原来编码器编码时所走过的路径,这个过程就是译码器计算、寻找最大似然函数的过程,即得到
(2一5)
对于BSC信道而言,就是寻找与R有最小汉明距离的路径,即得到
(2一6)
最大似然译码的性能固然很好,但它是以整个译码长度为(L+m)n作为整体考虑的,这就给实际应用带来了困难。
例如,若采用,L=50,k=2,可能的路径大于1030条,对于每一个接收序列R都要与大约1030条码序列进行比较,这在实际应用中几乎是不可能的。
因此,必须寻找一种新的最大似然译码算法,Viterbi译码方法正是为了解决这一困难提出来的。
它不是在网格图上一次比较所有可能的个序列(路径),而是接收一段,就比较、计算一段,选择一条最可能的路径,从而使整个码序列是一个有最大似然函数的序列。
用Viterbi译码的方法具体步骤如下:
(1)从S0状态开始,时间单位j=1,计算并存储进入每一个状态的部分路径及其度量值。
(2)j增加1,计算此时刻进入各状态的部分路径及其度量值,经过比较后,挑出并存储每个状态中一条有最大度量的那个部分路径及该部分路径对应的度量值,称此部分路径为幸存路径。
(3)如果j(2)步;否则停止;j从m到L,网格图的每个状态都有一条选留路径。
但当j>L以后,由于输入码元开始为0,故网格图的状态数减少,幸存路径也减少,到第(L+m)单位时间,网格图回到S0状态,最后只剩一条幸存路径,这条路径就是我们需要的有最大似然函数的路径
。
简单流程图如图2-7。
图2-7译码流程图
%viterbi.m
%viterbi解码程序
function[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output)
%[decoder_output,survivor_state,cumulated_metric]=viterbi(G,k,channel_output)
%其中G是一个n行L*k列矩阵,它的每一行决定了从移位寄存器到输入码字的连接方式.
%survivor_state是一个矩阵,它显示了通过网格的最优路径,这个矩阵通过一个单独
%的函数metric(x,y)给出。
n=size(G,1);
%检验G的维数
ifrem(size(G,2),k)~=0
error('SizeofGandkdonotagree')
end
ifrem(size(channel_output,2),n)~=0
error('channleoutputnotoftherightsize')
end
L=size(G,2)/k;
number_of_states=2^((L-1)*k);
%产生状态转移矩阵,输出矩阵和输入矩阵
forj=0:
number_of_states-1
fort=0:
2^k-1
[next_state,memory_contents]=nxt_stat(j,t,L,k);
input(j+1,next_state+1)=t;
branch_output=rem(memory_contents*G',2);
nextstate(j+1,t+1)=next_state;
output(j+1,t+1)=bin2deci(branch_output);
end
end
input;
state_metric=zeros(number_of_states,2);
depth_of_trellis=length(channel_output)/n;
channel_output_matrix=reshape(channel_output,n,depth_of_trellis);
survivor_state=zeros(number_of_states,depth_of_trellis+1);
[row_survivorcol_survivor]=size(survivor_state);
%开始非尾信道输出的解码
%i为段,j为每一阶段的状态,t为输入
fori=1:
depth_of_trellis-L+1
flag=zeros(1,number_of_states);
ifi<=L
step=2^((L-i)*k);
else
step=1;
end
forj=0:
step:
number_of_states-1
fort=0:
2^k-1
branch_metric=0;
binary_output=deci2bin(output(j+1,t+1),n);
fortt=1:
n
branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt));
end
if((state_metric(nextstate(j+1,t+1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,t+1)+1)==0)
state_metric(nextstate(j+1,t+1)+1,2)=state_metric(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,t+1)+1,i+1)=j;
flag(nextstate(j+1,t+1)+1)=1;
end
end
end
state_metric=state_metric(:
2:
-1:
1);
end
%开始尾信道输出的解码
fori=depth_of_trellis-L+2:
depth_of_trellis
flag=zeros(1,number_of_states);
last_stop=number_of_states/(2^((i-depth_of_trellis+L-2)*k));
forj=0:
last_stop-1
branch_metric=0;
binary_output=deci2bin(output(j+1,1),n);
fortt=1:
n
branch_metric=branch_metric+metric(channel_output_matrix(tt,i),binary_output(tt));
end
if((state_metric(nextstate(j+1,1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,1)+1)==0)
state_metric(nextstate(j+1,1)+1,2)=state_metric(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,1)+1,i+1)=j;
flag(nextstate(j+1,1)+1)=1;
end
end