基于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:30be1=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信道endAdd_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);
endend%  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的原理比如保护间隔以及插入循环前缀的原因等等已上传。链接地址:代码仿真

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

  1. m基于matlab的光通信的信道估计,均衡,抑制papr误码率仿真,对比ZF,RLS,MMSE三种算法

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 可见光通信的信道估计,均衡,抑制papr. 不考虑光信道,用传统的无线通信的OFDM的信道估计,均衡 ...

  2. 基于MATLAB的OFDM系统实现

    基于MATLAB的OFDM系统实现 OFDM(正交频分复用)的基本原理是将高速的数据流通过串并转换分解成若干低速的数据流,利用多个正交的子载波并行传输.本文借鉴了IEEE802.11a标准并进行简化, ...

  3. 【Simulink教程案例20】基于simulink的OFDM通信系统信道估计建模与仿真

    欢迎订阅<FPGA/MATLAB/SIMULINK系列教程> Simulink教程目录 本课程学习成果预览: 目录 1.软件版本 2.OFDM通信系统信道估计理论简介

  4. 【盲信道估计】基于matlab的LMS盲信道估计QPSK仿真

    目录 1.软件版本 2.核心代码 3.操作步骤与仿真结论 4.参考文献 5.完整源码获得方式 1.软件版本 MATLAB2021a 2.核心代码 % CHANNEL EQUALIZATION USIN ...

  5. 基于MATLAB的MIMO系统ZF破零均衡仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 MIMO的空分复用技术可以使得系统在系统带宽和发射带宽不变的情况下容易地获得空间分集增益和信道的容量 ...

  6. 第7章:OFDM 信道估计与均衡(4)

    第7章(4)内容如下: 一.导频结构与图案 二.基于导频的信道估计算法和插值方法 本文所有可运行代码下载地址是:123kevin456/OFDM- 一.导频结构与图案 前三讲介绍了OFDM经过AWGN ...

  7. 【学习笔记】OFDM中信道估计技术分析与实现

    目录 一.信道估计概念 二.信道估计作用 三.相干检测与非相干检测 (一)非相干检测 (二)相干检测 (三)注意 四.影响信道估计算法性能的重要因素 五.信道估计方法的划分 (一)根据处理域的不同, ...

  8. 第7章:OFDM 信道估计与均衡(2)

    第7章(2)内容如下: 一.瑞利衰落信道介绍 二.OFDM经过多径衰落信道的误码率分析 三.总结 本文对应的完整可运行代码下载地址:123kevin456/OFDM-. 一.瑞利衰落信道介绍 第(1) ...

  9. matlab实现ofdm调制解调,基于MATLAB的OFDM调制解调仿真

    基于MATLAB的OFDM调制解调仿真 题目:基于 MATLAB的 OFDM调制解调仿真2009年 6 月 13 日目 录摘要 .IIAbstract IV第 1章 正交频分复用的来源 - 1 -1. ...

最新文章

  1. 【POCO】POCO学习总结(三)——交叉编译
  2. NeurIPS 2019最佳论文出炉,今年增设“新方向奖”,微软华人学者获经典论文奖...
  3. 在Ubuntu 18.04中安装JDK 8
  4. 【图文详解】IDEA控制台运行时出现乱码:淇℃伅...
  5. MySQL服务迁移到opt_mysql文件*.opt *.frm *.MYI *.MYD的迁移
  6. Linux的实际操作:用户管理(查ls -ahl,chown改文件所属者,chgrp改文件所属组,usermod改用户所属组)
  7. Visual Studio 2008 简体中文正式版下载及序列号(无使用期限限制,正式版)
  8. PHP 实现爱查快递接口
  9. Relative Ranks问题的两种实现
  10. Android Studio第六课:模仿QQ登录跳转
  11. win32Day06:控件
  12. 毕业设计-基于大数据的电影爬取与可视化分析系统-python
  13. 美国队长的工资 python代码-详解用Python练习画个美队盾牌
  14. ipad分屏功能怎么开启_iPad 重大更新!14个新功能,每个都很实用
  15. 计算机科学 在职双证,计算机专业在职研究生有双证的吗?
  16. 华硕N55SF 折腾记
  17. Flutter学习之入门和体验
  18. swift 和 oc混编 找不到头文件等问题
  19. Gamma 分布和Beta 分布简介
  20. 速写画面如何画出生动感?眼睛和嘴巴是重要部分~

热门文章

  1. 【记录我的作业1】工业机器人职业技能训练——week2RobotStudio七巧板工作台仿真。
  2. 轻量应用服务器VS云服务器ECS:一图看完它们的区别
  3. 有问题的里程表(2)
  4. [附源码]计算机毕业设计springboot本地助农产品销售系统
  5. react中数据状态管理的四种方案
  6. 在CentOS6上编译安装实现LAMP(php-modules)+phpMyAdmin安装过程全记录
  7. 8月2日 5只最具上涨潜力股
  8. HP C6602A墨盒驱动
  9. 温州大学计算机学硕考研难度,温州大学研究生院,温州大学考研难度?
  10. 农场游戏开发记录十九