clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
factor=0;
%设置仿真参数
Nt =16; % Tx 天线
Nr =16; % Rx 天线
%UserAntennaNum的累加和为H的行数
UserNum=4;
UserAntennaNum_old=[ 4 4 4 4];%对比不同天线数目下,BER性能
stream_num_old=[ 4 4 4 4];
%stream_num=[3 3 3;2 2 5;2 3 4;3 4 2;2 4 3; 5 2 2];
%stream_num=[3 3 4;2 2 6;2 3 4;4 4 2;2 4 4; 6 2 2];
[row_test col_test]=size(UserAntennaNum_old);
SymPerFrame = 1;
Frame_num = 50; % 仿真中帧的数目
M =16;% QAM调制
P_all=5;
% the sum power of all stream is P_all
%PowerScale= sqrt(2*(M-1)/3);
ModPeriod = 2*sqrt(M) ;% mod操作数,用于THP预编码
% 设置信噪比范围
SNR = [-5,-3:3:24];
%初始化误比特率
Len = length(SNR);
ber_bdgmd_noorder=zeros(row_test,Len);
ber_bdgmd_optimalorder=zeros(row_test,Len);
%PowerScale = 2*M/3;% 功率归一化
PowerScale_linear_GMD=2*M/3;
%由于星座点映射之后的功率时2(M-1)/3,再经过mod之后放大M/(M-1),所以mod后功率为PowerScale,而每个流上的最终功率为
%SigPowerDbw_of_each_stream,所以beta为功率控制系数,可为系数也可为对角矩阵
%-----------------循环过程开始-----------------
for index = 1:Len;%SNR取值变化循环
%--------------------- to send the program's progress-------------------
fprintf('%s %d %s \n', 'The progress of this program is ',SNR(index)/max(SNR)*100,'%');
snr = 10.^(SNR(index)/10);% 将SNR转为线性域的变化范围
% noise_power = Nt/snr;% 噪声功率
%-----------------帧的变化范围,在每一个帧内信道保持不变-----------------
for cnt = 1:Frame_num
H1 = sqrt(1/2)*(randn(UserAntennaNum_old(1),Nt)+j*randn(UserAntennaNum_old(1),Nt));%随机生成信道矩阵
H2 = sqrt(1/2)*(randn(UserAntennaNum_old(2),Nt)+j*randn(UserAntennaNum_old(2),Nt));%随机生成信道矩阵
H3 = sqrt(1/2)*(randn(UserAntennaNum_old(3),Nt)+j*randn(UserAntennaNum_old(3),Nt));%随机生成信道矩阵
H4 = sqrt(1/2)*(randn(UserAntennaNum_old(3),Nt)+j*randn(UserAntennaNum_old(3),Nt));%随机生成信道矩阵
%% no user order 均分功率
%用户排序
%
[H UserAntennaNum stream_num]=random_order(H1,H2,H3,H4,UserAntennaNum_old,stream_num_old);
%-----------------每一帧中包含2*100个符号,循环从1到100-----------------
for sym_index = 1:SymPerFrame;
H_est=H; %完美信道信息
for n=1:row_test
%n代表同时配置的几种天线接收方案
%--------------------产生信号源------------------------
Source = randint(sum(stream_num(n,:)),1,M);%生成2*1的符号,符号取值范围是0~15
Sym = qammod(Source,M,0,'gray'); %进行QAM调制和功率归一化
SigPower_of_each_stream=P_all/sum(stream_num(n,:));%按流均分功率时,将要发射时stream功率
SigPowerDbw_of_each_stream=10*log10(SigPower_of_each_stream);
%----------------非线性BD-GMD预编码----------------------------
% 功率分配
beta_nonlinear_GMD=sqrt(SigPower_of_each_stream/PowerScale_linear_GMD);
% 预编码
[d_thp,L,Q,G,PPP]= GMD_encoder(Sym,H_est,ModPeriod,UserNum,UserAntennaNum(n,:),stream_num(n,:),beta_nonlinear_GMD);
% @para Sym ,just is one MQAM symbol,it is a complex number.
% @para H_est ,the radnom channel which has been added the
% noise,here it is a 4*4 complex matrix.
% beta_water_BD_GMD功率分配矩阵求倒数
%[ beta_water_BDGMD_mine_inverse nonzero_stream_index]=water_inverse(diag(beta_water_BDGMD_mine));
% MIMO channel
HH=H*d_thp;
y_thp = awgn(HH,SNR(index),SigPowerDbw_of_each_stream);
% 注水定理只体现在噪声上
% Caculate channel capacity
G=diag(1./diag(G));
% receiver end
r_thp = G*Q'*y_thp/beta_nonlinear_GMD;
Rec_thp = mod_thp(r_thp,ModPeriod);% mod
% QAM demodulator
% Rec_thp = Rec_thp_1;% Scale the symbol to QAM symbol
Rec_Data_thp = qamdemod(Rec_thp,M,0,'gray');
% BER 只统计功率分配不为0 的流的误码率
[err ratio] = biterr(Rec_Data_thp,Source,log2(M));% ber
ber_bdgmd_noorder(n,index) = ber_bdgmd_noorder(n,index) + err;
% 计算总流数
%stream_num_BD_GMD_mine_total(n,index)=stream_num_BD_GMD_mine_total(n,index)+length(nonzero_stream_index);
end
end; % loop for num
%% 功率分配 遍历排序
[H,UserAntennaNum,stream_num]=optimal_order(H1,H2,H3,H4,UserNum,UserAntennaNum_old,stream_num_old);
for sym_index = 1:SymPerFrame;
H_est=H; %完美信道信息
for n=1:row_test
%n代表同时配置的几种天线接收方案
%--------------------产生信号源------------------------
Source = randint(sum(stream_num(n,:)),1,M);%生成2*1的符号,符号取值范围是0~15
Sym = qammod(Source,M,0,'gray'); %进行QAM调制和功率归一化
SigPower_of_each_stream=P_all/sum(stream_num(n,:));%按流均分功率时,将要发射时stream功率
SigPowerDbw_of_each_stream=10*log10(SigPower_of_each_stream);
% 功率分配
beta_nonlinear_GMD=sqrt(SigPower_of_each_stream/PowerScale_linear_GMD);
% 预编码
[d_thp,L,Q,G,PPP]=GMD_encoder(Sym,H_est,ModPeriod,UserNum,UserAntennaNum(n,:),stream_num(n,:),beta_nonlinear_GMD);
% @para Sym ,just is one MQAM symbol,it is a complex number.
% @para H_est ,the radnom channel which has been added the
% noise,here it is a 4*4 complex matrix.
% beta_water_BD_GMD功率分配矩阵求倒数
%[ beta_water_BDGMD_mine_inverse nonzero_stream_index]=water_inverse(diag(beta_water_BDGMD_mine));
% MIMO channel
HH=H*d_thp;
y_thp = awgn(HH,SNR(index),SigPowerDbw_of_each_stream);
% 注水定理只体现在噪声上
%noise=y_thp-HH;
%y_thp_wf=HH+diag(beta_water_BDGMD_mine_inverse)*noise;
% Caculate channel capacity
G=diag(1./diag(G));
% receiver end
r_thp = G*Q'*y_thp/beta_nonlinear_GMD;
Rec_thp = mod_thp(r_thp,ModPeriod);% mod
% QAM demodulator
% Rec_thp = Rec_thp_1;% Scale the symbol to QAM symbol
Rec_Data_thp = qamdemod(Rec_thp,M,0,'gray');
% BER 只统计功率分配不为0 的流的误码率
[err ratio] = biterr(Rec_Data_thp,Source,log2(M));% ber
ber_bdgmd_optimalorder(n,index) = ber_bdgmd_optimalorder(n,index) + err;
%err_rem((cnt-1)*SymPerFrame+sym_index)=err;
% 计算总流数
%stream_num_BD_GMD_mine_total(n,index)=stream_num_BD_GMD_mine_total(n,index)+length(nonzero_stream_index);
end
end
end; % loop for iteration
end % loop for snr
%----------------------------循环结束----------------------------
stream_num_of_per_loop=sum(stream_num);
ber_bdgmd_noorder=ber_bdgmd_noorder./(Frame_num*SymPerFrame*stream_num_of_per_loop*sqrt(M));%计算误比特率
ber_bdgmd_optimalorder=ber_bdgmd_optimalorder./(Frame_num*SymPerFrame*stream_num_of_per_loop*sqrt(M));
%[3 3 4;2 2 6;2 3 5;4 4 2;2 4 4; 6 2 2]
%----------------保存当前workspace中所有变量值到filename.mat文件中---------
filename='Linear-BD-GMD-SVD-THP-16QAM-4user-uesrodrder-streamreduced-40000';%-----需要改,根据程序不同改名
nowtime=clock;
filena
没有合适的资源?快使用搜索试试~ 我知道了~
非线性BD-GMD均分功率用户排序误码率matlab仿真,含仿真操作录像
共17个文件
m:11个
mat:4个
jpg:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 12 浏览量
2022-04-12
21:46:30
上传
评论
收藏 319KB RAR 举报
温馨提示
1.版本:matlab2021a,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:BD-GMD。 3.内容:非线性BD-GMD均分功率用户排序误码率matlab仿真。 %----------------非线性BD-GMD预编码---------------------------- % 功率分配beta_nonlinear_GMD=sqrt(SigPower_of_each_stream/PowerScale_linear_GMD); % 预编码 [d_thp,L,Q,G,PPP]= GMD_encoder(Sym,H_est,ModPeriod,UserNum,UserAntennaNum(n,:),stream_num(n,:),beta_nonlinear_GMD); 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
非线性BD-GMD均分功率用户排序误码率matlab仿真.rar (17个子文件)
untitled.jpg 52KB
clip0001.avi 15.6MB
code
Linear-BD-GMD-SVD-THP-16QAM-4user-uesrodrder-streamreduced-40000--2013.6.16.22.0.mat 23KB
Linear-BD-GMD-SVD-THP-16QAM-4user-uesrodrder-streamreduced-40000--2017.5.31.16.9.mat 23KB
Runme.m 8KB
Linear-BD-GMD-SVD-THP-16QAM-4user-uesrodrder-streamreduced-40000--2023.5.17.23.42.mat 23KB
Linear-BD-GMD-SVD-THP-16QAM-4user-uesrodrder-streamreduced-40000--2023.5.17.23.41.mat 23KB
func
random_order.m 335B
gmd_zcy.m 3KB
feedback.m 487B
BD_GMD_5_stream.m 2KB
gmd_zcy_streamreduce.m 1KB
water_inverse.m 184B
mod_thp.m 265B
BD_GMD_nonlinear_decomposition.m 359B
optimal_order.m 843B
GMD_encoder.m 1KB
共 17 条
- 1
资源评论
- 吃糖会上瘾2024-03-02内容与描述一致,超赞的资源,值得借鉴的内容很多,支持!
fpga和matlab
- 粉丝: 15w+
- 资源: 2548
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功