基于matlab的5g通信系统的建模与仿真

一、搭建5g异构蜂窝网络通信系统

        首先需要设置一个宏蜂窝基站,3 个小蜂窝基站。宏基站的位置设置在坐标 原点,设置小基站的分布半径为 r=200,小基站设置分布在一个半径为 200 的圆 周上,每个小基站的角度间隔 120 度,最后根据小基站的角度,利用极坐标与直角坐标的关系如下

       求得小基站在坐标系的直角坐标。求得宏基站和小基站的坐标后,此时需要设置在此系统中用户的数量为 50 个用户,用户的的坐标可以通过下面的公式求 出
 

其中 rand 是一个函数,生成一(0,1)的随机数,num 是设置的用户数量,r 是小基站的分布半径。求得宏基站、小基站与用户的坐标之后便可利用 MATLAB 构建出一个最基本的 5G 异构蜂窝网络系统
代码如下:
% 清空环境
clc;
clear;
% 设置宏基站的中心位置
macro_bs_center = [0, 0]; % 宏基站放在坐标原点
% 设定小基站的数量
num_small_cells = 3;
% 随机生成小基站的位置(在一定范围内围绕宏基站)
small_cell_radius = 200; % 小基站分布半径
theta = linspace(0, 2*pi, num_small_cells+1); % 均匀分布
small_bs_positions = small_cell_radius * [cos(theta(1:end-1))', sin(theta(1:end-1))'];
% 绘制宏基站
figure;
plot(macro_bs_center(1), macro_bs_center(2), 'rp', 'MarkerSize', 12,
'MarkerFaceColor', 'r');
hold on;
text(macro_bs_center(1)+10, macro_bs_center(2), 'Macro BS', 'FontSize', 10);
% 绘制小基站
plot(small_bs_positions(:,1), small_bs_positions(:,2), 'bo', 'MarkerSize', 10,
'MarkerFaceColor', 'b');
for i = 1:num_small_cells
11
text(small_bs_positions(i,1)+10, small_bs_positions(i,2), ['Small BS ', num2str(i)],
'FontSize', 10);
end
% 设定用户数量
num_users=30;
% num_users=30;
% 生成用户位置,用户分布范围覆盖整个场景
user_x = (rand(num_users, 1) - 0.5) * 2 * (small_cell_radius + 100); % 用户分布
在小基站和宏基站覆盖的区域
user_y = (rand(num_users, 1) - 0.5) .* 2 * (small_cell_radius + 100);
user_positions = [user_x, user_y];
% 绘制用户
plot(user_positions(:,1), user_positions(:,2), 'k.', 'MarkerSize', 8);
% 绘制覆盖区域的圆(假设每个基站的覆盖范围是圆形的)
coverage_radius_macro = 250; % 宏基站的覆盖半径
coverage_radius_small = 100; % 小基站的覆盖半径
% % 绘制宏基站的覆盖范围
% viscircles(macro_bs_center, coverage_radius_macro, 'LineStyle', '--', 'LineWidth', 0.5);
%
% % 绘制每个小基站的覆盖范围
% for i = 1:num_small_cells
% viscircles(small_bs_positions(i,:), coverage_radius_small, 'LineStyle', '--',
'LineWidth', 0.5);
% end
% 设置图形属性
axis equal;
xlabel('X Position (meters)');
ylabel('Y Position (meters)');
title('Macrocell and Small-Cell Base Station User Distribution');
grid on;
hold off;

二、计算基站与用户的SINR值以及用户的下载速率

本问需要在第一问构建 5G 通信系统继续求解,首先需要设置基站和用户的 用户参数。首先需要设置宏基站和小基站的发射功率,宏基站的发射功率 (P_T_mcro)为 43dbm,小基站的发射功率(P_T_small)为 33dbm,路径损耗指数 n 设为 3.5,参考路径损耗(PL_0)设置为 30dbm,噪声功率(No)设置为-104dbm, 信道带宽(B)设置为 10MHZ,基于以上设置的基本参数结合第一问建立的模型, 可以计算机出宏基站与用户的距离,其计算公式如下

其中 dmro u 代表宏基站与用户的距离, x1为第一问设置的宏基站的横坐标, y1为第一问设置的宏基站的纵坐标, x2为用户的横坐标, y2 为用户的纵坐标。类似的用户与小基站的距离计算公式如下:

上式中, dsmall u 小基站与用户的距离, x3 是小基站的横坐标, y3 是小基站的纵坐标。计算出每个基站与用户的距离之后,利用路径损耗公式算出每个基站的发射功率经过路径传播损耗之后到达用户的功率,其宏基站的路径损耗如下:

小基站的路径损耗如下:

在用户接收端,用户接收到宏基站的功率计算公式如下:

在用户接收端,用户接收到小基站的功率计算公式如下:

计算出每个用户接收到基站的功率之后。需要找到每个用户接收到信号最强的基 站,在此模型中,通过比较每个用户与小基站的距离和宏基站的距离,设置用户 与离他最近的基站匹配。如果用户与宏基站连接则设置一个标志位,此外在求解 过程中,不仅需要考虑到噪声的影响,还需要考虑到了其他基站的干扰。 如果用户连接到宏基站,这需要考虑小基站的干扰,其小基站的干扰的计算公式 如下:

式中 P _ r _ small1P _ r _ small2 P _ r _ small3 分别表示每个小基站对宏基站的 影响,其次还要考虑到噪声的影响,最终用户连接到宏基站所受到总的干扰的计 算公式如下:

则用户连接到宏基站的信噪比计算公式如下:

利用下面公式转换为 DB 的形式:

再利用香农公式求解出用户的下载速率

如果用户连接到小基站求解方法也类似,基站干扰需要考虑到其他小基站与宏基 站的干扰,其余的求解步骤类似,最后通过 MTALB 求得每个用户的信噪比和下载速率下图所示

求解代码如下:

P_tx_macro = 43; % 宏基站发射功率,dBm
P_tx_small = 33; % 小基站发射功率,dBm
n = 3.5; % 路径损耗指数
PL_0 = 30; % 参考路径损耗,dB
% 噪声功率
noise_power = -104; % 噪声功率,dBm
% 信道带宽
B = 10e6; % 带宽,Hz (10 MHz)
% 计算基站到用户的距离
distances_macro = sqrt((user_positions(:,1) - macro_bs_center(1)).^2 + ... (user_positions(:,2) - macro_bs_center(2)).^2);
distances_small = zeros(num_users, num_small_cells);
for i = 1:num_small_cells
distances_small(:,i) = sqrt((user_positions(:,1) - small_bs_positions(i,1)).^2 + ... (user_positions(:,2) - small_bs_positions(i,2)).^2);
end
% 计算路径损耗 (宏基站与小基站)
PL_macro = PL_0 + 10 * n * log10(distances_macro); % 宏基站到用户的路径损
耗
PL_small = PL_0 + 10 * n * log10(distances_small); % 小基站到用户的路径损
耗
% 计算接收到的信号功率
P_rx_macro = P_tx_macro - PL_macro; % 宏基站到用户的接收功率
P_rx_small = P_tx_small - PL_small; % 小基站到用户的接收功率
% 对每个用户,找到接收到信号最强的基站
[best_P_rx, best_bs_idx] = max([P_rx_macro, P_rx_small], [], 2);
% 计算 SINR
SINR = zeros(num_users, 1);
for i = 1:num_users
if best_bs_idx(i) == 1 % 该用户连接宏基站
signal_power = P_rx_macro(i);
interference_power = sum(10^(P_rx_small(i,:) / 10)); % 小基站产生的干扰
else %该用户连接小基站
13
14
signal_power = P_rx_small(i, best_bs_idx(i)-1);
interference_power = 10^(P_rx_macro(i) / 10) + sum(10.^(P_rx_small(i, [1:best_bs_idx(i)-1, best_bs_idx(i):num_small_cells]) / 10));
end
% 计算总干扰加噪声
SINR(i) = 10^(signal_power / 10) / (interference_power + 10^(noise_power / 10));
end
% 将 SINR 转换为 dB
SINR_dB = 10 * log10(SINR);
% 计算每个用户的下载速率
R = B * log2(1 + SINR);
% 显示用户的 SINR 和下载速率结果
for i=1:30
fprintf('USER%d SINR=%.2fdB R=%.2fMbps\n', i, SINR_dB(i), R(i)/1e6);
end

三、网络资源的分配

在本问中利用最大信噪比关联基站,求得不同用户数量下,求得时延随着迭代次数的变化。
求得结果如下图:

代码由于权限问题,第三问只放部分代码的截图:

声明:作者水平有限,若有错误请在评论区或者私信作者指出。 

这是一个比较复杂的问题,需要分步骤来实现。我可以给你提供一些思路和代码实现,但是由于篇幅限制,可能无法完全覆盖所有细节。同时,由于涉及到图形化展示,需要使用 MATLAB 的可视化工具箱。 首先,我们可以将所有的基站坐标放入一个数组中,例如: ``` macro_stations = [x1, y1; x2, y2; ...]; micro_stations = [x1, y1; x2, y2; ...]; ``` 其中,`macro_stations` 和 `micro_stations` 分别表示已经存在的宏基站和微基站的坐标。接下来,我们可以定义一个函数来计算某个点是否被基站覆盖: ``` function [covered, cost] = is_covered(x, y, macro_stations, micro_stations, grid_data) % 计算点 (x, y) 距离所有基站的距离 distances = sqrt((x - macro_stations(:,1)).^2 + (y - macro_stations(:,2)).^2); distances = [distances; sqrt((x - micro_stations(:,1)).^2 + (y - micro_stations(:,2)).^2)]; % 如果距离小于等于基站的半径,则认为被覆盖 if any(distances <= 5) covered = true; cost = 30; return elseif any(distances <= 2) covered = true; cost = 6; return end % 计算点 (x, y) 距离所有格栅中心点的距离 distances = sqrt((x - (1:100)).^2 + (y - (1:100)).^2); % 如果距离小于等于基站的覆盖范围,则认为被覆盖 if any(distances <= 5) covered = true; cost = 0; return end % 计算该点的业务量 data = grid_data(round(y), round(x)); % 如果业务量为0,则不需要建站 if data == 0 covered = true; cost = 0; return end % 否则需要建站 covered = false; cost = data; end ``` 接下来,我们可以编写一个贪心算法来确定基站的位置。具体实现方法如下: ``` % 初始化基站的位置 macro_stations = [10, 10]; micro_stations = []; % 初始化覆盖率和总成本 coverage = 0; cost = 0; % 遍历所有的格栅中心点 for x = 1:100 for y = 1:100 % 判断该点是否已经被覆盖 [covered, c] = is_covered(x, y, macro_stations, micro_stations, grid_data); cost = cost + c; if covered coverage = coverage + 1; else % 如果该点没有被覆盖,则需要建站 % 枚举所有可能的基站位置,并选择成本最小的位置 best_cost = Inf; best_x = 0; best_y = 0; for i = x-2:1:x+2 for j = y-2:1:y+2 [covered, c] = is_covered(i, j, macro_stations, micro_stations, grid_data); if ~covered && c < best_cost best_cost = c; best_x = i; best_y = j; end end end % 如果找到了一个成本最小的基站位置,则建站 if best_cost ~= Inf if best_cost == 30 macro_stations = [macro_stations; best_x, best_y]; else micro_stations = [micro_stations; best_x, best_y]; end cost = cost + best_cost; end end % 如果已经覆盖了85%的区域,则停止建站 if coverage >= 85*100 break end end if coverage >= 85*100 break end end ``` 最后,我们可以使用 MATLAB 的可视化工具箱来绘制基站在区域内的分布图和信号覆盖图。这里给出一个简单的示例代码: ``` % 绘制基站的分布图 figure hold on scatter(macro_stations(:,1), macro_stations(:,2), 'r', 'filled') scatter(micro_stations(:,1), micro_stations(:,2), 'b', 'filled') hold off xlim([0, 100]) ylim([0, 100]) % 绘制信号覆盖图 coverage_map = zeros(100, 100); for x = 1:100 for y = 1:100 [covered, ~] = is_covered(x, y, macro_stations, micro_stations, grid_data); if covered coverage_map(y, x) = 1; end end end figure imshow(coverage_map, 'InitialMagnification', 'fit') ``` 以上代码仅供参考,具体实现还需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值