基于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电子书和数学建模资料


目录
打赏
0
0
0
0
834
分享
相关文章
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
101 68
基于遗传优化的Sugeno型模糊控制器设计matlab仿真
本课题基于遗传优化的Sugeno型模糊控制器设计,利用MATLAB2022a进行仿真。通过遗传算法优化模糊控制器的隶属函数参数,提升控制效果。系统原理结合了模糊逻辑与进化计算,旨在增强系统的稳定性、响应速度和鲁棒性。核心程序实现了遗传算法的选择、交叉、变异等步骤,优化Sugeno型模糊系统的参数,适用于工业控制领域。
基于遗传优化的货柜货物摆放优化问题求解matlab仿真
本项目采用MATLAB2022A实现基于遗传算法的货柜货物摆放优化,初始随机放置货物后通过适应度选择、交叉、变异及逆转操作迭代求解,最终输出优化后的货物分布图与目标函数变化曲线,展示进化过程中的最优解和平均解的变化趋势。该方法模仿生物进化,适用于复杂空间利用问题,有效提高货柜装载效率。
基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面
本项目基于YOLOv4深度学习网络,利用MATLAB 2022a实现排队人数统计的算法仿真。通过先进的计算机视觉技术,系统能自动、准确地检测和统计监控画面中的人数,适用于银行、车站等场景,优化资源分配和服务管理。核心程序包含多个回调函数,用于处理用户输入及界面交互,确保系统的高效运行。仿真结果无水印,操作步骤详见配套视频。
41 18
|
5月前
|
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
259 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
154 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
127 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等