无线通信——基于MATLAB实现OFDM系统(信道估计与均衡)

基于MATLAB实现OFDM系统基带信号在频率选择性衰落信道条件下的发送与接收

题目及要求:

仿真系统构成:信号输入(为随机比特流)、OFDM调制、仿真信道传输、OFDM解调、信号输出(可能存在误码的比特率);
仿真分析内容:根据输入、输出比特流计算不同信噪比条件下的误码率,并绘制曲线。
对调制的要求:OFDM调制的子载波间隔为15KHz,循环前缀长度及子载波数目可调,各子载波使用QPSK调制。
其它要求

  1. 信道采用3GPP TS36.101给出的ETU300Hz多径信道,并在其上叠加一个信噪比可调的白噪声。表2.1-1~表2.1-4和表2.2-1给出的ETU300Hz多径信道的参数。
  2. 设计梳妆或者块状导频并在接收端完成信道估计与补偿,并与没有信道估计情况下的性能进行分析比较。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

正文

1. OFDM系统的组成

由于是基带信号,所以系统中没有调制与解调的部分。若需对频带信号进行传输,只需要在进入信道前对基带信号进行调制,接收后进行解调即可。程序代码也可以在我写的这个上面进行稍微的改进即可。因此大家可以参考最下面程序的整体架构。下面为我根据系统组成画的系统框图。
在这里插入图片描述
① OFDM调制基本原理
   正交频分复用(OFDM)是多载波调制(MCM)技术的一种。MCM的基本思想是把数据流串并变换为N路速率较低的子数据流,用它们分别去调制N路子载波后再并行传输。因子数据流的速率是原来的1/N,即符号周期扩大为原来的N倍,远大于信道的最大延迟扩展,这样MCM就把一个宽带频率选择性信道划分成N个窄带平坦衰落信道,从而“先天”具有很强的抗多径衰落和抗脉冲干扰的能力,特别适合于高速无线数据传输。OFDM是一种子载波相互混叠的MCM,因此它除了具有上述毗M的优势外,还具有更高的频谱利用率。OFDM选择时域相互正交的子载波,它们虽然在频域相互混叠,却仍能在接收端被分离出来。
② OFDM系统的实现模型
  利用离散反傅里叶变换( IDFT) 或快速反傅里叶变换( IFFT) 实现的OFDM系统如图所示。输入已经过调制(符号匹配) 的复信号经过串P并变换后,进行IDFT 或IFFT 和并/串变换,插入保护间隔后的信号s (t) 。该信号经过信道后,接收到的信号r ( t ) 经过去掉保护间隔以恢复子载波之间的正交性,再经过串/并变换和DFT 或FFT 后,恢复出OFDM的调制信号,再经过并串变换后还原出输入的符号。离散傅里叶变换是它的核心,它使各子载波相互正交。

2. 仿真过程

① 根据OFDM系统框图,首先由信源产生随机0,1序列,然后经过QPSK调制后进行串并转换,再对串并转换后的序列进行IFFT变换得到时域信号,添加循环前缀后并串变换并通过ETU300HZ信道,对得到的信号在进行串并变换,去循环前缀,FFT变换,QPSK解调,并串转换后得到接收的信息序列,再将其与发送序列比较后得到没有信道估计下的误码率。
②对于有信道估计的误码率,可以在IFFT变换之前加入插导频,在FFT之后进行信道估计,最终可以得到有信道估计下的误码率曲线。其中信道估计算法采用了LS算法。其中块状导频适用于频率选择性衰落,梳状导频适用于快衰落,格状导频结合了两者的优点。

3. 仿真程序

整体代码如下所示:

% ==================================================
% 作者: Allen
% 时间:4/27 2020
% =================OFDM仿真参数说明:================
% f_delta=15e3;                 ---子载波间隔
% 子载波数 carrier_count        ---128 也就是FFT点数,通常为2的次幂
% 子载波间隔 f_delta             ---15e3
% 总符号数 symbol_count          ---1000
% IFFT长度 ifft_length           ---128
% 循环前缀 cp_length             ---16
% 调制方式                       ---QPSK 
% 信道估计算法 ce_method         ---1:采用最小二乘法LS;0:采用mse算法
% 插入导频间隔 pilot_interval    ---5
% 每星座符号比特数 M             ---2
% 信道模型选择参数 awgn_en       ---0:表示ETU信道;1:AWGN信道
% 最大多普勒扩展 fd              ---300;通常可配置0-300hz之间的数据
% 仿真统计次数 sta_num           ---10
% 信噪比大小SNR                  ---可设置
% ====================仿真过程=======================
% 产生0-1随机序列 => 串并转换 => 映射 => 取共轭
% => IFFT => 加循环前缀和后缀 => 并串转换 => 
% 多径信道即ETU信道 =>  加AWGN => 串并转换 => 去前缀
%  => FFT =>解映射 => 求误码率 
% ==================================================
clear all;
close all;
carrier_count = 128;         % 子载波数
f_delta=15e3;                %子载波间隔
symbol_count = 1000;         %一次发送的总符号数
ifft_length = carrier_count; %ifft点数为子载波数目
cp_length = 16;              %循环前缀
ce_method=1                  %信道估计算法参数1:采用最小二乘法LS;0:采用mse算法
pilot_interval=5;            %导频间隔
awgn_en=0;                   %信道选择参数 0:表示ETU信道;1:AWGN信道
M=2;                         %每星座符号比特数
fd=300;                      %最大多普勒扩展
sta_num=20;                  % 仿真统计次数
num_bit=carrier_count*symbol_count*M;      %对应比特数据个数,即128*1000*2
pilot_bit_l=randi([0 1],1,M*carrier_count);%生成导频序列,长度为M*carrier_count
OFDM_SNR_BER=zeros(1,31);                  %存储直接解调OFDM误码率
OFDM_LS_SNR_BER=zeros(1,31);               %存储基于信道估计后OFDM误码率
i=1;                                       
% ================多径信道参数=======================
fs=(carrier_count)*f_delta;                %信道带宽,为子载波间隔乘以子载波个数
ts=1/fs;                                   %每个bit符号持续的时间
tau=[0,50,120,200,230,500,1600,2300,5000]/(10^9); 
pdb=[-1.0,-1.0,-1.0,0,0,0,-3.0,-5.0,-7.0];
chan=rayleighchan(ts,fd,tau,pdb);
chan.ResetBeforefiltering=0;
% ================产生随机序列=======================
OFDM_sigbits =sourcebits(num_bit) ;        % 1*256000,发送的OFDM数据
[moddata_outI,moddata_outQ]=qpsk_modulation(OFDM_sigbits);   %进行映射
OFDMmoddata_in_temp=moddata_outI+1i*moddata_outQ; 
OFDMmoddata_in=reshape(OFDMmoddata_in_temp,carrier_count,length(OFDMmoddata_in_temp)/carrier_count); %串并变换
% ================加导频========================

[Insertpilot_out,count,pilot_seq]=insert_pilot_f(OFDMmoddata_in,pilot_bit_l,pilot_interval);  %加入导频后的矩阵为Insertpilot_out,大小为128*1200

% ===================IFFT===========================

OFDMmoddata_out=ifft(Insertpilot_out,ifft_length)*sqrt(ifft_length);

% ==================加循环前缀==================

InsertCPdata_out=Insert_CP(OFDMmoddata_out,cp_length);

% =================并串转换==========================
[m,n] = size(InsertCPdata_out)
Channel_data=reshape(InsertCPdata_out,1,m*n);

% ===================发送信号,多径信道====================
for SNR=0:1:30
    be1=0;
    be2=0;
    
    frm_cnt=0;
    while(frm_cnt<sta_num)
        frm_cnt=frm_cnt+1;
        %经过多径信道
        if(awgn_en==1)
             Add_Multipath_data=Channel_data;                    %awgn信道
        elseif(fd~=0)
             Add_Multipath_data=filter(chan,Channel_data);       %ETU信道
        end
        
        Add_noise_data=awgn(Add_Multipath_data,SNR,'measured'); %添加高斯白噪声
% =======================串并变换===========================

Add_noise_data_temp=reshape(Add_noise_data,m,n);

% =======================去循环前缀==========================

DeleteCPdata_out=Delete_CP(Add_noise_data_temp,cp_length);

% =======================取出导频H==========================

[Deletepilot_Data,H]=Get_pilot(DeleteCPdata_out,pilot_interval);

% =========================FFT==============================

OFDM_Demodulationdata_out_iter1=fft(Deletepilot_Data,ifft_length)/sqrt(ifft_length);

% ===============无信道估计下并串转换以及逆映射===============
OFDMdemodulationdata_out_1=reshape(OFDM_Demodulationdata_out_iter1,1,num_bit/2);
[demodulationdata_outI_1,demodulationdata_outQ_1]=qpsk_demodulation(OFDMdemodulationdata_out_1);%星座的逆映射
P2Sdata_out_1=P2SConverter(demodulationdata_outI_1,demodulationdata_outQ_1);
% =====================有信道估计下==========================
estimation_output=Channel_estimation(ce_method,Deletepilot_Data,pilot_seq,H);
OFDMdemodulationdata_out_2=reshape(estimation_output,1,num_bit/2);
[demodulationdata_outI_2,demodulationdata_outQ_2]=qpsk_demodulation(OFDMdemodulationdata_out_2);%星座的逆映射
P2Sdata_out_2=P2SConverter(demodulationdata_outI_2,demodulationdata_outQ_2);
% =========================误比特率==========================
be1=be1+length(find(P2Sdata_out_1~=OFDM_sigbits));
be2=be2+length(find(P2Sdata_out_2~=OFDM_sigbits));
ber1=be1/(frm_cnt*num_bit);
ber2=be2/(frm_cnt*num_bit);
if(mod(frm_cnt,20)==0)
    fprintf('SNR=%.1f,frm_cnt=%d,ber_de=%.8f,ber_ls=%.8f\n',SNR,frm_cnt,ber1,ber2);
end
    end
  %  fprintf('SNR=%.1f,frm_cnt=%d,ber_de=%.8f,ber_ls=%.8f\n',SNR,frm_cnt,ber1,ber2);
% =========================误码率==========================
OFDM_SNR_BER(i)=ber1;
OFDM_LS_SNR_BER(i)=ber2;
i=i+1;
end

4.仿真结果

一、AWGN信道下的误码率曲线以及前五十个数据值 :
在这里插入图片描述
在这里插入图片描述
二、ETU300HZ多径信道下的误码率曲线(fd=300HZ即最大多普勒频移为300HZ)以及前五十个数据值:
在这里插入图片描述
在这里插入图片描述
三、ETU300HZ多径信道下的误码率曲线(fd=10HZ即最大多普勒频移为10HZ)以及前五十个数据值:
在这里插入图片描述
在这里插入图片描述

5.仿真结果分析以及结论

一、 从OFDM系统的原理和仿真过程可以看出,OFDM系统频带利用率高,因为OFDM允许重叠的正交子载波作为子信道,而不是传统的利用保护频带分离子信道。同时高速数据流通过串并转换,能使得每个子载波上的信号时间比相应同速率的单载波系统上的信号时间长,采用循环前缀的方法,有效减少了ISI。
二、AWGN信道下采用LS算法进行信道估计后的误码率大于直接解调的误码率,但是差别不是特别大。对于ETU300HZ且多普勒频移为300HZ或者10HZ的情况下,可以看出基于信道估计的结果明显优于无信道估计的结果;而且横向对比发现当多普勒频移为10HZ时的误码率低于多普勒频移为300HZ的误码率。

6.写在最后

代码为整体架构,其中里面的一些具体的子函数以及OFDM的原理比如保护间隔以及插入循环前缀的原因等等已上传。链接地址:代码仿真

  • 66
    点赞
  • 447
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值