【MIMO通信】基于matlab MIMO_OFDM通信系统仿真【含Matlab源码 314期】
一、获取代码方式
获取代码方式1:
完整代码已上传我的资源:【MIMO通信】基于matlab MIMO_OFDM通信系统仿真【含Matlab源码 314期】
获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。
备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);
二、MIMO_OFDM简介
MIMO-OFDM系统的接收信号是多个发射天线发送信号的衰落与加性噪声的线性叠加,若采用通常SISO-OFDM系统或MIMO系统的估计算法估计信道,将会带来很大的估计误差。出于设计实现的考虑,本文主要研究理论相对比较成熟的慢变环境下基于训练序列的MIMO-OFDM系统的信道估计算法。本章将主要讨论MIMO-OFDM系统特殊训练序列的设计和信道估计算法的选择。
多天线系统的信道估计算法同单天线系统的相比具有更大的复杂性,因为接收信号是多个发射信号的叠加信号,这些发射信号同时从多个发射天线上发射出来,几乎同步到达任一接收天线。因此要从一个叠加信号中正确的识别出多个发射信号,需要信道估计算法能估计出各发射天线到同一接收天线之间多个并行信道的信道特性。而任一发射天线到任一接收天线之间的信道估计可参考单天线系统的算法。
信道估计算法主要可以分为两种:盲估计算法和非盲估计算法。盲信道估计算法不需要在发送信息中插入训练序列,节约了带宽。盲估计算法的实现需要利用发送信息内包含的统计信息。这通常需要在接收端对接收信号进行复杂的数学运算,算法的运算量一般都很大,不适合应用于对时延要求比较高的实时系统。非盲估计算法是在发送信号中插入收发两端都事先己知的信息,接收端在接收到该已知信息之后,由该信息的幅度、载频或相位变化来估计信道对发送信息所造成的衰落影响。算法应用广泛,几乎可以应用于所有的无线通信系统。
输入信号经复用器分解成n个长度相同的数据流,然后进行独立地编码和调制,因此它不是基于发射分集的。这些编码器可以是二进制的卷积编码器,也可以是不经过任何编码直接输出。
三、部分源代码
N_Tx_ant = 2; % 发送天线数
N_Rx_ant = 2; % 接收天线数
N_ant_pair = N_Tx_ant*N_Rx_ant;
N_user = 1; % 用户数
N_sym = 10; % 每帧中OFDM符号数,不包括两个前缀OFDM符号,LTE中一帧长度为6~7个OFDM符号
N_frame = 10; % 仿真的帧个数
Eb_NoStart = 0; % 仿真循环开始的Eb_No,定义为每比特的能量Eb和噪声的单边功率谱密度No的比值, dB值
Eb_NoInterval = 2; % 仿真Eb/No的间隔值(dB)
Eb_NoEnd = 20; % 仿真Eb/No的终止值(dB)
fs = 15.36e6; % 基带抽样频率(Hz) 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
N_used = length(Idx_used); % 使用的子载波数600
N_pilot = length(Idx_pilot); % 导频的子载波数
N_data = N_used-N_pilot; % 一个OFDM符号内所有用户发送的数据的子载波数
Idx_data = zeros(1,N_data); % 得到数据子载波的编号
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;
elseif m ~= N_pilot
m = m + 1;
end
end % 为编程使用方便,调整子载波编号为从1开始,到子载波总数
Idx_used = Idx_used + N_subc/2 +1; % 使用的子载波坐标
Idx_pilot = Idx_pilot + N_subc/2 +1; % 导频子载波坐标
Idx_data = Idx_data + N_subc/2 +1; % 数据子载波坐标,坐标0+1024/2+1=513子载波为空,既不是数据,也不是导频
PilotValue = ones(N_pilot,1); % 导频值为全1
PrefixRatio = 1/4; % 循环前缀所占比例
T_sym = T_sample*((1+PrefixRatio)*N_subc); % 一个OFDM符号(包含循环前缀)的持续时间
Modulation = 2; % 调制方式选择QPSK调制
Es = 1; % 在QPSK调制方式下,符号能量都被归一化
Eb = Es/Modulation; % 每比特能量
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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; % 无信道编码
[user_subc_alloc, mod_subc ,pwr_subc, pad_bit_cnt] = adpt_mod_para...
(coded_user_bit, N_sym, Idx_data); % 子载波分配
mod_sym = modulator(coded_user_bit, user_subc_alloc, mod_subc,...
pwr_subc, pad_bit_cnt, N_subc, N_sym); % 按照给定的每用户,每子载波的调制方式,进行调制
st_coded = st_coding(mod_sym, N_Tx_ant); % 发送分集,使用空时分组码编码
pilot_added = pilot_insert(st_coded, Idx_pilot, PilotValue); % 加导频
transmit_signal = ofdm_mod(pilot_added, PrefixRatio, N_subc, N_sym, N_Tx_ant); % OFDM调制,加循环前缀.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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 % 多个用户接收机的循环
data_sym = ofdm_demod(recv_signal, PrefixRatio, N_subc, N_sym, N_Rx_ant); % OFDM解调,去循环前缀.
channel_ls = channel_est(data_sym, Idx_pilot, N_pilot, N_sym, N_Tx_ant,N_Rx_ant, N_subc); % 信道估计
st_decoded = st_decoding(data_sym, channel_ls, N_Tx_ant, N_Rx_ant, Idx_data); % 接收机分集处理和空时解码
demod_user_bit = demodulator(st_decoded, user_subc_alloc{u}, mod_subc{u},...
pad_bit_cnt(u), N_sym); % 根据发射端的调制方式进行解调
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 % 多个用户接收机的循环结束
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 沈再阳.精通MATLAB信号处理[M].清华大学出版社,2015.
[2]高宝建,彭进业,王琳,潘建寿.信号与系统——使用MATLAB分析与实现[M].清华大学出版社,2020.
[3]王文光,魏少明,任欣.信号处理与系统分析的MATLAB实现[M].电子工业出版社,2018.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/113837600
- 点赞
- 收藏
- 关注作者
评论(0)