基于Matlab模拟MIMO+OFDM的基带仿真,画出误码率曲线

简介: 基于Matlab模拟MIMO+OFDM的基带仿真,画出误码率曲线

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

在数字传输系统中,其传输对象通常是二进制数字信息,设计数字传输系统的基本考虑是选择一组有限的离散的波形来表示数字信息.在某些有线信道中,特别是传输距离不太远的情况下,数字基带信号可以直接传送,称之为数字信号的基带传输.而在另外一些信道,特别是无线信道和光信道中,数字基带信号则必须经过调制,将信号频谱搬移到高频处才能在信道中传输.这种传输称为数字信号的调制传输(或载波传输).如果把调制与解调过程看作是广义信道的一部分,则任何数字传输系统均可等效为基带传输系统.通过Matlab提供的仿真环境对数字基带传输中的某些问题加以仿真,分析,能帮助我们进一步加深对这些抽象概念的理解,并加深理性认识.

⛄ 部分代码



%%%%%功能说明:MIMO+OFDM的基带仿真,画出误码率曲线


%%%%%%本次程序在基带仿真,并没有脉冲成型滤波+上载波这一步


%%%%%%***************** 发送端 ***************

%%%%%% 发送端采用Alamouti编码,有2根天线

%%%%%% 有4个用户,每个用户占用的子载波不一样,adpt_mod_para中有用户占用子载波的分配方式AllocMethod

%%%%%% 调制方式:每个用户所分配的子载波进行进行相同的调制方式,QPSK/8PSK/16QAM调制/64QAM

%%%%%%  信道编码:无


%%%%%% ***************** 信道 ***************

%%%%%% 采用高斯白噪声信道,未仿真多径信道


%%%%%% ***************** 接收端 ***************

%%%%%% 接收端有2根天线,需要解Alamouti编码

%%%%%% 接收端未考虑做频偏估计、定时估计、信道估计,因为信道比较理想

%%%%%% 与发送端数据比对,并画出误码率曲线


%%%%%% ***************** 程序步骤说明 ***************

%%%%%% (1)在每个信噪比下进行仿真,发送10帧信号,一帧为10个OFDM符号,一个OFDM符号的IFFT点数为1024

%%%%%% (2)4个用户共使用600个子载波,24个子载波发送导频,576个子载波发送数据

%%%%%%   因此导频周期是600/24=25,分配给每个用户144子载波

%%%%%% (3)每个用户想发送数据5760bit,因此576bit/OFDM符号,根据调制阶数换算成需要占据的子载波个数

%%%%%% (4)以16QAM为例,576bit = 144个复数符号,需要占144个子载波,与(2)刚好对应上

%%%%%  (5) Alamouti编码基础知识可以参考: https://zhuanlan.zhihu.com/p/363548635


clear all;

close all;

N_Tx_ant = 2;  %发送天线为2

N_Rx_ant = 2;  %接收天线为2

N_user = 4;    %用户数为4


N_sym = 10;     %  每帧中OFDM符号数,不包括两个前缀OFDM符号 LTE中一帧长度为6~7个OFDM符号

N_frame = 10;   %  仿真的帧个数

% 仿真循环开始的Eb_No,定义为每比特的能量Eb

% 和噪声的单边功率谱密度No的比值, dB值

Eb_NoStart = 0;

Eb_NoInterval = 2;      % 仿真Eb/No的间隔值(dB)

Eb_NoEnd = 20;          % 仿真Eb/No的终止值(dB)

%仿真参数选择的是LTE系统带宽为10MHz时参数


%%%%下面这几个变量貌似没有用到

fc = 5e9;                               %  载波频率(Hz)   5GHz

Bw = 20e6;                              %  基带系统带宽(Hz) 10MHz

fs = 15.36e6;                           %  基带抽样频率 1024*15KHz=15360000Hz

T_sample = 1/fs;                        %  基带时域样点间隔(s)



N_subc = 1024;                          %  OFDM 子载波总数,即FFT点数

Idx_used = [-300:-1 1:300];             %  使用的子载波编号,一共使用600个子载波

Idx_pilot = [-300:25:-25 25:25:300];    %  导频子载波编号,导频间隔为24,对应于坐标为0的子载波不映射数据或者导频,为非LTE标准

N_used = length(Idx_used);              % 使用的子载波数 600

N_pilot = length(Idx_pilot);            % 导频的子载波数

N_data = N_used - N_pilot;              % 一个OFDM符号内所有用户发送的数据的子载波数

Idx_data = zeros(1,N_data);

N_tran_sym = 0;                         %前导序列的长度 此处为不添加前导序列

% 得到数据子载波的编号

m = 1;

n = 1;

for k  = 1:length(Idx_used)

   if Idx_used(k) ~= Idx_pilot(m)

       Idx_data(n) = Idx_used(k);

       n = n + 1;

   else

       if m ~= N_pilot

           m = m + 1;

       end

   end

end

%  为编程使用方便,调整子载波编号为从1开始,到子载波总数 length(Idx_used) = length(Idx_pilot) + length(Idx_data)

Idx_used = Idx_used + N_subc/2 +1;    %使用的子载波坐标

Idx_pilot = Idx_pilot + N_subc/2 +1;  %导频子载波坐标

Idx_data = Idx_data + N_subc/2 +1;    %数据子载波坐标


PilotValue = ones(N_pilot,1);%导频值为全1

PrefixRatio = 1/4;           %循环前缀所占比例,即256个采样点

T_sym = T_sample*( (1 + PrefixRatio)*N_subc );%一个OFDM符号(包含循环前缀)的持续时间

Modulation = 4; %调制方式选择,2--QPSK调制, 3--8PSK,4--16QAM调制,6--64QAM

Es = 1;                 % 在QPSK, 16QAM调制方式下,符号能量都被归一化

Eb = Es/Modulation;     % 每比特能量

N_ant_pair = N_Tx_ant * N_Rx_ant;   % 收发天线对的数目

ST_Code = 1;   % 空时编码: , 1--空时分组码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


snr_idx = 1;

for Eb_No_dB = Eb_NoStart:Eb_NoInterval:Eb_NoEnd

   Eb_No = 10^(Eb_No_dB/10);       %线性信噪比

   var_noise = Eb/(2*Eb_No);       % 噪声样点的功率   No为单边功率 No=2*var_noise

   for frame = 1:N_frame          %逐帧循环计算

       %%%%%*********************  发送端  **************%%%

       %不添加多径信道,不添加自适应编码,无信道估计等

       %%%% 比特产生

       [user_bit,user_bit_cnt]  = user_bit_gen( N_user, N_data ,N_sym , Modulation );% 多用户数据生成模块,每个用户一帧的数据

       %%%% 信道编码,无

       coded_user_bit=user_bit;%无信道编码,RS码,卷积码等

       

       %%%% 子载波分配

       AllocMethod=1;%相邻分配

       [user_subc_alloc,mod_subc,pwr_subc,pad_bit_cnt]=adpt_mod_para(coded_user_bit,N_sym,Idx_data,AllocMethod);

       TurnOn.AdptMod=0;%无自适应调制

       

       %%%% 按照给定的每用户,每子载波的调制方式,进行调制

       mod_sym =  modulator(coded_user_bit,user_subc_alloc,mod_subc,pwr_subc,pad_bit_cnt,N_subc,N_sym,TurnOn.AdptMod);

       

       %%%% 发送分集, 使用空时编码

       st_coded = st_coding( mod_sym,N_Tx_ant,ST_Code);

       

       % 加导频

       pilot_added = pilot_insert(st_coded,Idx_pilot,PilotValue);

       

       % OFDM调制,加循环前缀,加前导序列. 如果使用发送分集,则输出多条天线的信号

       %%%%%实际函数中不添加前导序列

       [transmit_signal] = ofdm_mod(pilot_added,PrefixRatio,N_subc,N_sym,N_used,Idx_used,N_Tx_ant,N_tran_sym);

       

       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 信道  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

       transmit_signal_power = var(transmit_signal);%发送信号功率

       length_noise=size(transmit_signal,2);

       noise=gausnoise(Eb_No_dB,transmit_signal_power,length_noise);%产生复噪声序列

       recv_signal =  transmit_signal+noise;%接收到的信号加噪声

       

       %%%%%%%%%%%%%%%%%%%*********************  接收端  **************%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

       for u = 1:N_user        % 多个用户接收机的循环

           %无信道估计,同步等

           

           % OFDM解调

           data_sym = ofdm_demod(recv_signal,PrefixRatio,N_subc,N_sym,N_tran_sym,N_Rx_ant);

           

           % 接收机分集处理和空时解码

           channel_est = ones(N_subc,1,N_ant_pair);%假设为理想信道,信道估计为全1矩阵

           st_decoded = st_decoding( data_sym,channel_est,N_Tx_ant, N_Rx_ant ,ST_Code ,Idx_data);%2X2MIMO

           

           % 根据每用户,每子载波的调制方式,进行解调

           demod_user_bit = demodulator(st_decoded,user_subc_alloc{u},mod_subc{u},pad_bit_cnt(u),N_sym,TurnOn.AdptMod);

           

           %无信道解码, 包括RS解码, 卷积码Viterbi编码等

           decoded_user_bit{u}= demod_user_bit;

           

           % 本帧,本信噪比下,本用户的性能统计

           bit_err = sum(abs(decoded_user_bit{u} - user_bit{u}));%误码率计算

           user_bit_err{u}(frame,snr_idx) = bit_err ;

       end  % 多个用户接收机的循环结束

       % 实时显示仿真性能

%         fprintf('Eb/No:%d dB\tFrame No.:%d  Err Bits:%d\n',Eb_No_dB, frame, bit_err);

   end     % OFDM帧/数据包循环结束

   snr_idx = snr_idx + 1;

end      % Eb/No信噪比循环结束

performance_eval;% 画图

%%%%实验结果

%%%本次实验没有信道编码,接收端没有频偏估计、定时同步、信道估计、信道均衡等步骤

%%%误码率无线保存在BER-SNR.fig中

⛄ 运行结果

⛄ 参考文献

[1] 曲中水, 王建卫, 朱泳. 基于MATLAB的数字信号基带传输系统仿真[J]. 森林工程, 2004, 20(4):3.

[2] 李蕾,杜岩. 基于MATLAB的数字基带传输系统仿真实验设计[J]. 山东工业大学学报(1):85-90.

[3] 柴宝玉. 基于最佳基带传输系统的matlab仿真研究分析[J]. 中国新技术新产品, 2012(12):1.

[4] 李乐. MATLAB仿真在基带传输教学中的应用[J]. 电脑知识与技术:学术版, 2011, 7(5):3.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
5天前
|
算法 5G 数据安全/隐私保护
3D-MIMO信道模型的MATLAB模拟与仿真
该研究利用MATLAB 2022a进行了3D-MIMO技术的仿真,结果显示了不同场景下的LOS概率曲线。3D-MIMO作为5G关键技术之一,通过三维天线阵列增强了系统容量和覆盖范围。其信道模型涵盖UMa、UMi、RMa等场景,并分析了LOS/NLOS传播条件下的路径损耗、多径效应及空间相关性。仿真代码展示了三种典型场景下的LOS概率分布。
16 1
|
3天前
|
算法 5G 数据安全/隐私保护
SCM信道模型和SCME信道模型的matlab特性仿真,对比空间相关性,时间相关性,频率相关性
该简介展示了使用MATLAB 2022a进行无线通信信道仿真的结果,仿真表明信道的时间、频率和空间相关性随间隔增加而减弱,并且宏小区与微小区间的相关性相似。文中介绍了SCM和SCME模型,分别用于WCDMA和LTE/5G系统仿真,重点在于其空间、时间和频率相关性的建模。SCME模型在SCM的基础上进行了扩展,提供了更精细的参数化,增强了模型的真实性和复杂度。最后附上了MATLAB核心程序,用于计算不同天线间距下的空间互相关性。
9 0
|
3天前
|
算法
基于极大似然算法的系统参数辨识matlab仿真
本程序基于极大似然算法实现系统参数辨识,对参数a1、b1、a2、b2进行估计,并计算估计误差及收敛曲线,对比不同信噪比下的误差表现。在MATLAB2022a版本中运行,展示了参数估计值及其误差曲线。极大似然估计方法通过最大化观测数据的似然函数来估计未知参数,适用于多种系统模型。
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于NSCT非采样轮廓波变换和CNN网络人脸识别matlab仿真
本项目展示了一种结合非采样轮廓波变换(NSCT)与卷积神经网络(CNN)的人脸识别系统。通过NSCT提取多尺度、多方向特征,并利用CNN的强大分类能力实现高效识别。项目包括ORL人脸库的训练结果对比,提供Matlab 2022a版本下的完整代码及详细中文注释,另有操作步骤视频指导。
|
5天前
|
机器学习/深度学习 算法
基于小波神经网络的数据分类算法matlab仿真
该程序基于小波神经网络实现数据分类,输入为5个特征值,输出为“是”或“否”。使用MATLAB 2022a版本,50组数据训练,30组数据验证。通过小波函数捕捉数据局部特征,提高分类性能。训练误差和识别结果通过图表展示。
|
1月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
105 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
1月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
76 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
1月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
60 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
4月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)