移动通信系统课设OFDM系统仿真设计.docx
- 文档编号:15238528
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:23
- 大小:155.49KB
移动通信系统课设OFDM系统仿真设计.docx
《移动通信系统课设OFDM系统仿真设计.docx》由会员分享,可在线阅读,更多相关《移动通信系统课设OFDM系统仿真设计.docx(23页珍藏版)》请在冰点文库上搜索。
移动通信系统课设OFDM系统仿真设计
移动通信系统课程设计报告
OFDM系统仿真
——
(一)题目要求:
1)OFDM128路传输;
2)QPSK调制
3)AWGN信道
4)3径或4径瑞利衰落信道
(二)相关原理:
1)OFDM:
将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。
正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI)。
每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。
2)QPSK调制:
将每两个相连比特组在一起形成双比特码元,它的四种状态用4个不同的相位表示;
3)导频与均衡:
在OFDM信息序列中插入已知的导频序列
,通过信道后将其提取得
,做频域除法得传输函数
,再通过线性插值后得到每个信道频率响应,均衡滤波传输函数
;
4)循环前缀:
循环前缀(CyclicPrefix,CP)是将OFDM符号尾部的信号搬移到头部构成的。
用来消去码间干扰,通常取长度
(
为信道冲激响应持续时间)
5)分组交织:
为了解决成串的比特差错问题,采用了交织技术:
把一条消息中的相继比特分散开的方法,即一条信息中的相继比特以非相继方式发送,这样即使在传输过程中发生了成串差错,恢复成一条相继比特串的消息时,差错也就变成单个(或者长度很短)的错误比特,这时再用信道纠正随机差错的编码技术(FEC)消除随机差错。
纠错数
(三)基本思路:
说明:
1)编码:
使用216卷积码;
相关代码:
%卷积编码%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ori_data_t_1=reshape(ori_data_t,num_inf,2*channell);%58*192
ori_data_t_2=zeros(num,2*channell);%128*192
fori=1:
2*channell
seq=ori_data_t_1(:
i)';
seq_code=encode216(seq)';
ori_data_t_2(:
i)=seq_code;
end
ori_data=reshape(ori_data_t_2,1,2*num*channell);%1*24576
编码函数:
functioncode=encode216(m)%输入信息序列
%g1=[1,0,0,0,0,0];g2=[1,1,0,0,1,1];
trel=poly2trellis(6,[4063]);%定义网格
m1=[m,0,0,0,0,0,0];
code=convenc(m1,trel);%卷积码编码
2)交织:
交织深度为32;
相关代码:
%编码交织%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ori_data1=reshape(ori_data,deep,(2*num*channell)/deep)';%768*32
ori_data2=reshape(ori_data1,1,2*num*channell);%1*24576
3)QPSK调制:
转换为96路相位信号(复数);
代码:
%QPSK调制%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ori_data_0=reshape(ori_data2,2,channell*num);%拆分成两行12288列
ori_data_1=bi2de(ori_data_0','left-msb')';%QPSK的未调制数据12288列M=4的数据
de_OFDM_1=modem.pskmod(4);%生成调制器对象,设置qpsk调制
QPSK_data=modulate(de_OFDM_1,ori_data_1);%1*12288复数形式
%channel_data=reshape(QPSK_data,channell,num);%拆分成128行,每行10个复数128*10
channel_data=reshape(QPSK_data,num,channell);%拆分成128行,每行96个复数128*96
4)插入导频:
32路已知序列;
代码:
%插入导频信号%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pliot_1=2*rand(128,32);
pliot_2=2*rand(128,32);%插入的导频信号,实数
pliot=pliot_1+pliot_2*1i;%插入的导频信号,复数
channel_data_1=zeros(128,128);
fori=0:
31
channel_data_1(:
4*i+1)=pliot(:
i+1);
channel_data_1(:
4*i+2)=channel_data(:
3*i+1);
channel_data_1(:
4*i+3)=channel_data(:
3*i+2);
channel_data_1(:
4*i+4)=channel_data(:
3*i+3);
end
5)OFDM调制:
使用IFFT;
相关代码:
%OFDM信号产生%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
IFFT_data=zeros(128,128);
fori=1:
128
IFFT_data(:
i)=ifft(channel_data_1(:
i),128);%128*128ifft数据
end
r_ifft_data=real(IFFT_data);%实部128*128
i_ifft_data=imag(IFFT_data);%虚部128*128
6)插入循环前缀:
这里选取长度为32;
相关代码:
%加入循环前缀%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r_data=[r_ifft_data(num-num/4+1:
num,:
);r_ifft_data];%保护间隔取传送数据的四分之一
i_data=[i_ifft_data(num-num/4+1:
num,:
);i_ifft_data];%160*128
7)并串转换:
转换成1路;
代码:
%并串转换%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r_out=reshape(r_data,1,(num+num/4)*channel);%1*1600
i_out=reshape(i_data,1,(num+num/4)*channel);%1*1600
data=r_out+i_out.*1i;
8)AWGN:
加入信噪比-10~20dB的噪声;
代码:
%AWGN信道%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data_AWGN=awgn(data,SNR,'measured');%加入噪声
9)串并转换:
转换成128路;
代码:
%串并转换%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r_rcv_data1=reshape(r_rcv_data,num+num/4,channel);
i_rcv_data1=reshape(i_rcv_data,num+num/4,channel);
10)OFDM解调:
FFT快速算法;
代码:
%OFDM解调FFT%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
de_OFDM_data=zeros(128,128);
fori=1:
128
de_OFDM_data(:
i)=fft(rcv_data(:
i),128);%128*128矩阵
end
11)去导频:
取出过信道后导频序列
;
12)信道估计:
计算收到每一路导频序列的
,已知导频序列的
,得到信道
,利用线性插值得到每一路信息序列的
;
13)均衡:
将每一路信号
,
,得到均衡后的信号频域
,然后得到
;
代码:
%信道估计与均衡(新的)
depliot=zeros(128,32);
fori=0:
31
depliot(:
i+1)=de_OFDM_data(:
4*i+1);
end
depliot_1=zeros(128,32);
depliot_2=zeros(32,128);
de_OFDM_0=zeros(128,32);
fori=1:
32
depliot_1(:
i)=pliot(:
i)./depliot(:
i);
%depliot_2(i,:
)=reshape(depliot_1(:
i),1,128);
%x=1:
128;
%hx=1:
128;
%de_OFDM_0(:
i)=interp1(x,depliot_2(i,:
),hx,'pchip');%线性插值
end
de_OFDM_1=zeros(128,128);
fori=0:
30
de_OFDM_1(:
4*i+1)=depliot_1(:
i+1);
de_OFDM_1(:
4*i+2)=depliot_1(:
i+1)+(depliot_1(:
i+2)-depliot_1(:
i+1))/4;
de_OFDM_1(:
4*i+3)=depliot_1(:
i+1)+(depliot_1(:
i+2)-depliot_1(:
i+1))/2;
de_OFDM_1(:
4*i+4)=depliot_1(:
i+1)+(depliot_1(:
i+2)-depliot_1(:
i+1))/4*3;
end
de_OFDM_1(:
125)=depliot_1(:
32);de_OFDM_1(:
126)=depliot_1(:
32);
de_OFDM_1(:
127)=depliot_1(:
32);de_OFDM_1(:
128)=depliot_1(:
32);
de_OFDM_2=de_OFDM_data.*de_OFDM_1;%还原数据
de_OFDM_3=[];
fori=2:
4:
126
de_OFDM_3=[de_OFDM_3,de_OFDM_2(:
i:
i+2)];%提取出128*96数据部分
end
14)并串转换:
变为96路信息序列;
代码:
%并串转换%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
de_OFDM_data3=reshape(de_OFDM_3,1,channell*num);%128*96
15)QPSK解调:
还原调制前的数据;
代码:
%QPSK解调%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
de_OFDM_data3_real=real(de_OFDM_data3);
de_OFDM_data3_imag=imag(de_OFDM_data3);
de_OFDM_4=zeros(1,2*length(de_OFDM_data3_real));
%求方差%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sigma=sum(abs(real(de_OFDM_data3)-real(QPSK_data))+abs(imag(de_OFDM_data3)-imag(QPSK_data)))/(2*length(de_OFDM_data3_real));fori=1:
length(de_OFDM_data3_real)
%求判决到各个位置的概率%%%%%%%%%%%%%%%%
re_f1=normpdf(de_OFDM_data3_real(i),-1,sigma);
re_0=normpdf(de_OFDM_data3_real(i),0,sigma);
re_1=normpdf(de_OFDM_data3_real(i),1,sigma);
im_f1=normpdf(de_OFDM_data3_imag(i),-1,sigma);
im_0=normpdf(de_OFDM_data3_imag(i),0,sigma);
im_1=normpdf(de_OFDM_data3_imag(i),1,sigma);
de_OFDM_4(2*i-1)=(re_f1+re_0*im_f1/(im_f1+im_1))/(re_f1+re_1+re_0);
de_OFDM_4(2*i)=(im_f1+im_1)/(im_f1+im_1+im_0);
end
data_last_0=de_OFDM_4;%1*24576
16)解交织;
代码:
%解交织%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data_last_0_0=reshape(data_last_0,(2*num*channell)/deep,deep)';
data_last_0_1=reshape(data_last_0_0,1,2*num*channell);
17)卷积译码:
分别使用维特比译码,软解码,硬解码方法,得到译码结果;
代码:
%卷积码译码%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data_last_1=reshape(data_last_0_1,num,channell*2);%128*256
data_last_2=zeros(num_inf,channell*2);%58*256
fork=1:
2*channell
seq0=data_last_1(:
k)';
seq0=1-2.*seq0;
seq0_code=decode216(seq0,1)';
data_last_2(:
k)=seq0_code;
end
data_last=reshape(data_last_2,1,2*num_inf*channell);%1*14848
译码函数:
functiondecode=decode216(m,k)%m为码字序列,硬判决译码输入k为1,软判决译码输入k为0
trel=poly2trellis(6,[4063]);%定义网格
tblen=35;%回朔长度,为约束长度的5倍
if(k==1)%硬判决译码
hcode=m<0;
decode1=vitdec(hcode,trel,tblen,'term','hard');
else%软判决量化译码(3比特量化)
[index,hcode]=quantiz(m,[-0.75,-0.5,-0.25,0,0.25,0.5,0.75],[7,6,5,4,3,2,1,0]);
decode1=vitdec(hcode,trel,tblen,'term','soft',3);
end
decode=decode1(1:
length(decode1)-6);
18)误码率统计;
代码:
%误码率统计%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
error_num=sum(abs(data_last-ori_data_t));
bit_error_rate(1,((SNR-SNR_min)/2+1))=error_num/N;%误码率
snr(1,((SNR-SNR_min)/2+1))=SNR;
end
stem(snr,-10*log10(bit_error_rate),'-*','LineStyle','none');
xlabel('SNR');
ylabel('BER');
title('PerformanceofOFDMunderthechannelAWGN')
(四)结果:
1)软解码与硬解码情况下不同信噪比的误码率:
由上图可以看出,信号误码性能随着信噪比增加而增加,当信噪比达到10dB的时候误码率已经低于0.01,信噪比达到16dB时误码率已经达到-5量级,再之后出现相关波动;
另外,由于此次用于测试的数据只有24576个,所以误码率更高的时候误码率已经变为0。
同时,在低信噪比时,软解码与硬解码性能差别不大;在信噪比达到8dB之后,软解码性能明显比硬解码好;
2)不同信噪比下译码相位图:
3)
SNR=12(dB)
SNR=6(dB)
由上图可以看出,在不同信噪比下,相位图译码结果不一样;信噪比越大,相位译码越清晰;
(五)总结体会:
1)这次课设时间周期较长,一边学习一边编写,前后花了好几周;最开始搭建基本框架比较顺利,通过对课程的理解,成功地理清了思路;
2)编写导频和均衡部分时,由于书上讲得不是很透彻,网上查阅资料也纷繁复杂,几乎陷入了瓶颈;后来慢慢摸索,询问老师,小组讨论,同学交流;慢慢知道了自己的问题所在,混淆了频域和时域;
3)小组讨论后将程序分工,成员各自负责不同部分,有问题时一起交流讨论,这次团队协作非常愉快,并且高效;
4)从最开始做的无从下手到现在基本理解吃透,经历了一段时间。
中间也询问了很多人,查阅了许多资料;非常感谢老师的指导,也希望李老师以后讲解可以再耐心一些;
(六)分工合作:
我们小组成员有倪鸿志,王旭,周裔欢;这次我(倪鸿志)负责的是OFDM系统,信道的编写,王旭负责了编码译码部分,周裔欢写了QPSK调制,剩下的均衡,导频,软译码是大家一起商量完成的。
(七)程序代码:
1)主程序:
clc;
clearall;
%参数设置%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
p=0.5;%设定p值
channel=128;num=128;channell=96;
deep=32;%交织深度
num_inf=num/2-6;%每一组信息位bit,注意复数包含两组,58
N=channell*2*num_inf;
SNR_min=6;
SNR_max=20;
echo_num=8;
ts=1e-5;fd=0;tau=[ts3*ts8*ts];pdb=[0-3-8];%采样时间为1us,无多普勒频移
bit_error_rate=zeros(echo_num,(SNR_max-SNR_min)/2+1);
snr=zeros(1,(SNR_max-SNR_min)/2+1);%信噪比矩阵初始化
forSNR=SNR_min:
2:
SNR_max
forecho=1:
echo_num;
%初始信号产生%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ori_data=rand(1,N);
ori_data_t=ori_data
%卷积编码%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ori_data_t_1=reshape(ori_data_t,num_inf,2*channell);%58*192
ori_data_t_2=zeros(num,2*channell);%128*192
fori=1:
2*channell
seq=ori_data_t_1(:
i)';
seq_code=encode216(seq)';
ori_data_t_2(:
i)=seq_code;
end
ori_data=reshape(ori_data_t_2,1,2*num*channell);%1*24576
%编码交织%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ori_data1=reshape(ori_data,deep,(2*num*channell)/deep)';%768*32
ori_data2=reshape(ori_data1,1,2*num*channell);%1*24576
%QPSK调制%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ori_data_0=reshape(ori_data2,2,channell*num);%拆分成两行12288列
ori_data_1=bi2de(ori_data_0','left-msb')';%QPSK的未调制数据12288列M=4的数据
de_OFDM_1=modem.pskmod(4);%生成调制器对象,设置qpsk调制
QPSK_data=modulate(de_OFDM_1,ori_data_1);%1*12288复数形式
%channel_data=reshape(QPSK_data,channell,num);%拆分成128行,每行10个复数128*10
channel_data=reshape(QPSK_data,num,channell);%拆分成128行,每行96个复数128*96
%插入导频信号%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pliot_1=2*rand(128,32);
pliot_2=2*rand(128,32);%插入的导频信号,实数
pliot=pliot_1+pliot_2*1i;%插入的导频信号,复数
channel_data_1=zeros(128,128);
fori=0:
31
channel_data_1(:
4*i+1)=pliot(:
i+1);
channel_data_1(:
4*i+2)=channel_data(:
3*i+1);
channel_data_1(:
4*i+3)=channel_data(:
3*i+2);
channel_data_1(:
4*i+4)=channel_data(:
3*i+3);
end
%OFDM信号产生%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%IFFT_data=ifft(channel_data);%128*10ifft数据
IFFT_data=zeros(128,128);
fori=1:
128
IFFT_data(:
i)=ifft(channel_data_1(:
i),128);%128*128ifft数据
end
r_ifft_data=real(IFFT_data);%实部128*128
i_ifft_data=imag(IFFT_data);%虚部128*128
%加入循环前缀%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r_data=[r_ifft_data(num-num/4+1:
num,:
);r_ifft_data];%保护间隔取传送数据的四分之一
i_data=[i_ifft_data(num-num/4+1:
num,:
);i_ifft_data];%160*128
%并串转换%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r_out=reshape(r_data,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 移动 通信 系统 OFDM 仿真 设计