NOMA下行多用户系统功率分配策略及其MATLAB仿真分析
非正交多址接入(NOMA)技术在提升无线通信系统容量和连接数方面展现出巨大潜力。在NOMA下行链路中,有效的功率分配至关重要,它需要协同考虑用户分组、波束赋形以及功率域复用等特性,以实现系统吞吐量或能量效率的最大化。本文将深入探讨NOMA下行链路的功率分配优化问题,并提供基于MATLAB的实现框架,对比不同算法的性能。
1. 系统模型与优化问题描述
1.1. 系统架构设定
- 基站配置: 配备 \\(N_t\\) 根天线,为 \\(K\\) 个单天线用户提供服务。
- 信道模型: 用户 \\(k\\) 的信道向量表示为 \\(\\mathbf{h}_k \\in \\mathbb{C}^{N_t \\times 1}\\)。所有用户的信道矩阵聚合为 \\(\\mathbf{H} = [\\mathbf{h}_1, \\mathbf{h}_2, \\dots, \\mathbf{h}_K] \\in \\mathbb{C}^{N_t \\times K}\\)。
- NOMA操作原理: 多个用户在同一时频资源块上进行叠加传输。接收端通常采用连续干扰消除(SIC)技术。为简化问题,我们假设用户根据其有效信道增益进行排序(通常是信道增益从强到弱),强用户首先解码并消除弱用户信号,然后解码自身信号。
1.2. 优化目标:总吞吐量最大化
NOMA下行链路的功率分配优化目标通常是最大化系统总速率,同时满足总发射功率预算和SIC解码顺序要求。对于用户 \\(k\\),假设其波束赋形向量为 \\(\\mathbf{w}_k \\in \\mathbb{C}^{N_t \\times 1}\\),分配的功率为 \\(p_k\\)。如果用户按信道增益降序排列(索引 \\(1\\) 为最强用户,\\(K\\) 为最弱用户),则用户 \\(k\\) 的信干噪比(SINR)可以表示为:
$$\\text{SINR}_k = \\frac{|\\mathbf{h}_k^H \\mathbf{w}_k|^2 p_k}{\\sigma^2 + \\sum_{j=k+1}^K |\\mathbf{h}_k^H \\mathbf{w}_j|^2 p_j}$$
其中,\\(\\sigma^2\\) 是接收端噪声功率,\\(\\sum_{j=k+1}^K |\\mathbf{h}_k^H \\mathbf{w}_j|^2 p_j\\) 表示来自未被用户 \\(k\\) 消除的较弱用户(索引 \\(j > k\\))的干扰。
因此,优化问题可以表述为:
$$\\underset{\\mathbf{p}}{\\text{maximize}} \\sum_{k=1}^K \\log_2(1 + \\text{SINR}_k)$$
约束条件:
- 总功率限制: \\(\\sum_{k=1}^K p_k \\leq P_{\\text{max}}\\),其中 \\(P_{\\text{max}}\\) 是基站的最大总发射功率。
- 功率非负性: \\(p_k \\geq 0, \\forall k\\)。
2. MATLAB实现框架与算法
2.1. 用户排序(基于信道增益)
在NOMA系统中,用户排序是SIC解码的基础。这里我们根据用户的有效信道增益(例如,经过波束赋形后的信道增益)进行降序排序。
% 系统参数设定
num_users = 10; % 用户总数 K
num_bs_antennas = 4; % 基站天线数 Nt
total_max_power = 1; % 最大发射功率 P_max (W)
noise_power_dbm = -100; % 噪声功率 (dBm)
noise_power_watt = 10^(noise_power_dbm/10) * 1e-3; % 转换为瓦特
% 随机生成信道矩阵 H (Nt x K)
% 假设采用瑞利衰落信道
channel_matrix = (randn(num_bs_antennas, num_users) + 1j*randn(num_bs_antennas, num_users)) / sqrt(2);
% 假设初始波束赋形为最大比传输(MRT)预编码
% 这里为简化,先假设波束赋形向量与信道向量对齐并归一化
precoding_vectors = zeros(num_bs_antennas, num_users);
effective_channel_gains = zeros(1, num_users);
for k_idx = 1:num_users
precoding_vectors(:, k_idx) = channel_matrix(:, k_idx) / norm(channel_matrix(:, k_idx)); % 归一化
% 计算用户k自身信号的有效信道增益
effective_channel_gains(k_idx) = abs(channel_matrix(:, k_idx)' * precoding_vectors(:, k_idx))^2;
end
% 根据有效信道增益进行降序排序(强用户优先)
[~, sorted_indices] = sort(effective_channel_gains, 'descend');
% 重新排序信道矩阵和波束赋形向量,以便后续功率分配
sorted_channel_matrix = channel_matrix(:, sorted_indices);
sorted_precoding_vectors = precoding_vectors(:, sorted_indices);
disp('用户排序完成。');
2.2. NOMA功率分配优化(基于CVX工具包)
NOMA的功率分配问题通常是非凸的。然而,在某些简化或特殊条件下,可以通过凸优化方法求解。这里我们使用CVX工具包来求解上述总速率最大化问题。需要注意的是,SINR的对数函数是凹函数,因此总速率最大化是一个凸优化问题。
% CVX优化求解NOMA功率分配
cvx_begin
variables allocated_powers(num_users) % 功率分配变量
total_rate_objective = 0;
for k_idx = 1:num_users
% 用户k的自身信号功率项
signal_gain_k = abs(sorted_channel_matrix(:, k_idx)' * sorted_precoding_vectors(:, k_idx))^2;
signal_term = signal_gain_k * allocated_powers(k_idx);
% 用户k受到的来自较弱用户(j > k)的干扰项
interference_from_weaker = 0;
for j_idx = (k_idx + 1):num_users
interference_gain_kj = abs(sorted_channel_matrix(:, k_idx)' * sorted_precoding_vectors(:, j_idx))^2;
interference_from_weaker = interference_from_weaker + interference_gain_kj * allocated_powers(j_idx);
end
% 用户k的SINR (SIC假设强用户信号已被消除)
current_sinr_k = signal_term / (noise_power_watt + interference_from_weaker);
total_rate_objective = total_rate_objective + log(1 + current_sinr_k) / log(2); % 转换为bps/Hz
end
maximize total_rate_objective
subject to
sum(allocated_powers) <= total_max_power; % 总功率约束
allocated_powers >= 0; % 功率非负约束
cvx_end
disp('最优功率分配 (CVX):');
disp(allocated_powers');
disp(['最大总速率 (CVX): ', num2str(cvx_optval), ' bps/Hz']);
2.3. 启发式功率分配:注水算法
注水算法是一种经典的功率分配启发式方法,它在多并行信道场景下能最大化和速率。虽然NOMA信道间存在干扰,但可以通过将其视为一系列具有不同有效增益的信道,或在每次SIC步骤后应用注水法来作为一种近似或基准。这里我们实现一个针对独立并行信道的注水算法作为对比。
% 注水算法函数
function p_wf = water_filling_allocation(channel_gains_array, P_max, sigma_sq)
K_wf = length(channel_gains_array);
% 将信道增益从小到大排序
[sorted_gains, original_indices] = sort(channel_gains_array, 'ascend');
% 二分法搜索注水水位(lambda)
lambda_low = sigma_sq / max(sorted_gains); % 理论最小值
lambda_high = P_max + sigma_sq / min(sorted_gains); % 理论最大值
p_wf_sorted = zeros(K_wf, 1);
for iter_wf = 1:100 % 固定迭代次数进行近似
current_lambda = (lambda_low + lambda_high) / 2;
current_sum_p = 0;
for k_idx_wf = 1:K_wf
p_k_temp = max(0, current_lambda - sigma_sq / sorted_gains(k_idx_wf));
current_sum_p = current_sum_p + p_k_temp;
end
if current_sum_p > P_max
lambda_low = current_lambda; % 水位太高,需降低
else
lambda_high = current_lambda; % 水位太低,需升高
end
end
% 根据最终水位分配功率
final_lambda = (lambda_low + lambda_high) / 2;
for k_idx_wf = 1:K_wf
p_wf_sorted(k_idx_wf) = max(0, final_lambda - sigma_sq / sorted_gains(k_idx_wf));
end
% 将功率分配结果映射回原始用户顺序
p_wf = zeros(K_wf, 1);
p_wf(original_indices) = p_wf_sorted;
% 归一化以确保总功率不超过P_max (微小误差处理)
if sum(p_wf) > P_max
p_wf = p_wf * (P_max / sum(p_wf));
end
end
% 计算注水算法的功率分配(这里针对排序后的有效信道增益进行)
% 注意:此处注水算法应用于每个用户独立的有效信道,未考虑NOMA的层间干扰
water_filling_powers = water_filling_allocation(effective_channel_gains(sorted_indices)', total_max_power, noise_power_watt);
% 计算注水算法下的总速率
water_filling_total_rate = 0;
for k_idx = 1:num_users
signal_gain_k = abs(sorted_channel_matrix(:, k_idx)' * sorted_precoding_vectors(:, k_idx))^2;
signal_term = signal_gain_k * water_filling_powers(k_idx);
interference_from_weaker = 0;
for j_idx = (k_idx + 1):num_users
interference_gain_kj = abs(sorted_channel_matrix(:, k_idx)' * sorted_precoding_vectors(:, j_idx))^2;
interference_from_weaker = interference_from_weaker + interference_gain_kj * water_filling_powers(j_idx);
end
current_sinr_k = signal_term / (noise_power_watt + interference_from_weaker);
water_filling_total_rate = water_filling_total_rate + log(1 + current_sinr_k) / log(2);
end
disp('注水算法功率分配:');
disp(water_filling_powers');
disp(['注水算法总速率: ', num2str(water_filling_total_rate), ' bps/Hz']);
3. 性能对比与仿真结果
3.1. 仿真场景参数
为了对比不同功率分配算法的性能,我们进行多轮仿真,参数设置如下:
| 参数 | 值 |
|---|---|
| 用户数 K | 10 |
| 基站天线数 Nt | 4 |
| 总功率 Pmax | 1 W |
| 噪声功率 \\(\\sigma^2\\) | 1e-13 W (对应-100 dBm) |
3.2. 性能指标
- 总吞吐量: 系统所有用户速率之和 (bps/Hz)。
- 计算复杂度: CVX方法通常较高,而注水算法作为启发式方法复杂度较低。
3.3. 仿真代码与可视化
% 仿真循环设置
num_trials = 100; % 仿真迭代次数
cvx_throughput_results = zeros(1, num_trials);
water_filling_throughput_results = zeros(1, num_trials);
for trial_idx = 1:num_trials
% 为每次仿真生成新的随机信道
current_channel_matrix = (randn(num_bs_antennas, num_users) + 1j*randn(num_bs_antennas, num_users)) / sqrt(2);
% 假设初始波束赋形为最大比传输(MRT)预编码
current_precoding_vectors = zeros(num_bs_antennas, num_users);
current_effective_channel_gains = zeros(1, num_users);
for k_idx = 1:num_users
current_precoding_vectors(:, k_idx) = current_channel_matrix(:, k_idx) / norm(current_channel_matrix(:, k_idx));
current_effective_channel_gains(k_idx) = abs(current_channel_matrix(:, k_idx)' * current_precoding_vectors(:, k_idx))^2;
end
% 根据有效信道增益进行降序排序
[~, current_sorted_indices] = sort(current_effective_channel_gains, 'descend');
sorted_channel_matrix_trial = current_channel_matrix(:, current_sorted_indices);
sorted_precoding_vectors_trial = current_precoding_vectors(:, current_sorted_indices);
% --- CVX 优化 ---
cvx_begin quiet % 'quiet' suppresses CVX output for cleaner simulation
variables p_cvx_trial(num_users)
total_rate_cvx_trial = 0;
for k_idx = 1:num_users
signal_gain_k = abs(sorted_channel_matrix_trial(:, k_idx)' * sorted_precoding_vectors_trial(:, k_idx))^2;
signal_term = signal_gain_k * p_cvx_trial(k_idx);
interference_from_weaker = 0;
for j_idx = (k_idx + 1):num_users
interference_gain_kj = abs(sorted_channel_matrix_trial(:, k_idx)' * sorted_precoding_vectors_trial(:, j_idx))^2;
interference_from_weaker = interference_from_weaker + interference_gain_kj * p_cvx_trial(j_idx);
end
current_sinr_k = signal_term / (noise_power_watt + interference_from_weaker);
total_rate_cvx_trial = total_rate_cvx_trial + log(1 + current_sinr_k) / log(2);
end
maximize total_rate_cvx_trial
subject to
sum(p_cvx_trial) <= total_max_power;
p_cvx_trial >= 0;
cvx_end
cvx_throughput_results(trial_idx) = cvx_optval;
% --- 注水算法 ---
% 将有效信道增益传递给注水算法
channel_gains_for_wf = current_effective_channel_gains(current_sorted_indices);
p_water_filling_trial = water_filling_allocation(channel_gains_for_wf', total_max_power, noise_power_watt);
water_filling_rate_trial = 0;
for k_idx = 1:num_users
signal_gain_k = abs(sorted_channel_matrix_trial(:, k_idx)' * sorted_precoding_vectors_trial(:, k_idx))^2;
signal_term = signal_gain_k * p_water_filling_trial(k_idx);
interference_from_weaker = 0;
for j_idx = (k_idx + 1):num_users
interference_gain_kj = abs(sorted_channel_matrix_trial(:, k_idx)' * sorted_precoding_vectors_trial(:, j_idx))^2;
interference_from_weaker = interference_from_weaker + interference_gain_kj * p_water_filling_trial(j_idx);
end
current_sinr_k = signal_term / (noise_power_watt + interference_from_weaker);
water_filling_rate_trial = water_filling_rate_trial + log(1 + current_sinr_k) / log(2);
end
water_filling_throughput_results(trial_idx) = water_filling_rate_trial;
end
% 绘制仿真结果
figure;
plot(1:num_trials, cvx_throughput_results, 'r-', 'LineWidth', 1.5);
hold on;
plot(1:num_trials, water_filling_throughput_results, 'b--', 'LineWidth', 1.5);
xlabel('仿真轮次');
ylabel('系统总吞吐量 (bps/Hz)');
legend('NOMA功率优化 (CVX)', '注水算法 (启发式)');
title('NOMA下行链路总吞吐量性能对比');
grid on;
disp(['CVX优化平均总吞吐量: ', num2str(mean(cvx_throughput_results)), ' bps/Hz']);
disp(['注水算法平均总吞吐量: ', num2str(mean(water_filling_throughput_results)), ' bps/Hz']);
通过仿真,我们可以观察到CVX凸优化通常能获得更高的系统总吞吐量,因为它能找到最优的功率分配方案。而注水算法作为一种启发式方法,虽然计算复杂度较低,但在NOMA场景下由于未直接优化层间干扰,其性能可能略低于CVX优化结果。
4. 进一步研究方向
- 动态用户分组与排序: 在实际动态信道环境下,需要结合信道质量、用户QoS需求及干扰情况,设计自适应的用户分组和SIC解码顺序调整机制。
- 深度强化学习(DRL): 面对复杂的、时变的无线环境,利用DQN、Actor-Critic等DRL算法,可以训练智能体在无需显式信道信息或完整系统模型的情况下,学习最优的功率分配策略。
- 多目标联合优化: 除了最大化系统吞吐量,还可以考虑能量效率、用户公平性等多个目标。采用NSGA-II等多目标优化算法,能够得到一组Pareto最优解,为系统设计提供权衡选择。