当前位置:首页 > 技术 > 正文内容

NOMA下行多用户系统功率分配策略及其MATLAB仿真分析

访客 技术 2026年7月15日 1

非正交多址接入(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. 进一步研究方向

  1. 动态用户分组与排序: 在实际动态信道环境下,需要结合信道质量、用户QoS需求及干扰情况,设计自适应的用户分组和SIC解码顺序调整机制。
  2. 深度强化学习(DRL): 面对复杂的、时变的无线环境,利用DQN、Actor-Critic等DRL算法,可以训练智能体在无需显式信道信息或完整系统模型的情况下,学习最优的功率分配策略。
  3. 多目标联合优化: 除了最大化系统吞吐量,还可以考虑能量效率、用户公平性等多个目标。采用NSGA-II等多目标优化算法,能够得到一组Pareto最优解,为系统设计提供权衡选择。

相关文章

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。