Hughes-Hartogs 比特功率分配算法及MATLAB实现

原理介绍

Hughes-Hartogs 算法是经典的贪婪算法。它的主要思想是利用每步调整比特时,总是选择所需要功率最小的子信道,这样就能达到最优的比特和功率分配结果,是典型的贪心算法。

比特分配:

(1)初始化:每个子信道的初始比特和功率分配均为 0,即
b i = 0 ,    P i = 0 ,     i = 1 , 2 , ⋯   , N {{b}_{i}}=0,\ \ {{P}_{i}}=0,\ \ \ i=1,2,\cdots ,N bi=0,  Pi=0,   i=1,2,,N
(2)计算每个子信道增加 1 比特信息所需要的功率,即功率增量
Δ P i = f ( b i + 1 ) − f ( b i ) ∣ H i ∣ 2      i = 1 , 2 , ⋯   , N \Delta {{P}_{i}}=\frac{f\left( {{b}_{i}}+1 \right)-f\left( {{b}_{i}} \right)}{{{\left| {{H}_{i}} \right|}^{2}}}\ \ \ \ i=1,2,\cdots ,N ΔPi=Hi2f(bi+1)f(bi)    i=1,2,,N
(3)求得 { Δ P i } \left\{ \Delta {{P}_{i}} \right\} {ΔPi}中的最小值,及其对应的子信道编号,即
min ⁡ _ P = min ⁡ i = 1 , 2 , ⋯   , N   Δ P i i n d e x _ min ⁡ _ P = arg ⁡    min ⁡ i = 1 , 2 , ⋯   , N   Δ P i \begin{aligned} & \min \_P=\underset{i=1,2,\cdots ,N}{\mathop{\min }}\,\Delta {{P}_{i}} \\ & index\_\min \_P=\arg \ \ \underset{i=1,2,\cdots ,N}{\mathop{\min }}\,\Delta {{P}_{i}} \\ \end{aligned} min_P=i=1,2,,NminΔPiindex_min_P=arg  i=1,2,,NminΔPi
(4)给编号为 i n d e x _ min ⁡ _ P index\_\min \_P index_min_P 的子信道分配 1 比特的信息,即
b i n d e x _ min ⁡ _ P = b i n d e x _ min ⁡ _ P + 1 {{b}_{index\_\min \_P}}={{b}_{index\_\min \_P}}+1 bindex_min_P=bindex_min_P+1
并计算当前已分配的比特总数,即
R = s u m ( { b i } ) R=sum\left( \left\{ {{b}_{i}} \right\} \right) R=sum({bi})
R < R T R<{{R}_{T}} R<RT ,判断 b i n d e x _ min ⁡ _ P = M {{b}_{index\_\min \_P}}\text{=}M bindex_min_P=M ;若是转至(5),否则转至(2);若 R = R T R\text{=}{{R}_{T}} R=RT,比特分配完毕,进行功率分配
(5)置 Δ P i n d e x _ min ⁡ _ P = ∞ \Delta {{P}_{index\_\min \_P}}\text{=}\infty ΔPindex_min_P= ,转至(3)

功率分配

P i = f ( b i ) ∣ H i ∣ 2       i = 1 , 2 , ⋯   , N {{P}_{i}}=\frac{f\left( {{b}_{i}} \right)}{{{\left| {{H}_{i}} \right|}^{2}}}\ \ \ \ \ i=1,2,\cdots ,N Pi=Hi2f(bi)     i=1,2,,N

其中 f ( b i ) {f\left( {{b}_{i}} \right)} f(bi)是在满足一定的误比特率(BER),信道增益为1的条件下,传输 b i {b}_{i} bi比特信息所需要的最小接收功率。

仿真参数设置

参数名称参数值
平均信噪比10
子载波数目32
平均发射功率1
比特总数上限128

仿真结果如下:
在这里插入图片描述

从图中可以看出,在信道状况比较好的地方分配较多的比特和功率,信道状况比较差的地方分配比较少的比特和功率,甚至不分配功率,从而达到最终的分配结果。同时,从上面的介绍可以看出,每次分配的结果都是选择功率增量最小的子信道增加1比特,从而在上述的约束条件下是一种最优的分配,但是由于每次需要找到最小的功率增量的子信道,因此该方法的复杂度比较大。
代码如下:
主函数:

clear;
close all;
clc;
N_subc=32;   %子载波数目
P_av=1;      %平均发射功率
Pt=P_av*N_subc;  %系统发射总功率
SNR_av=10;        %平均信噪比
noise=P_av./10.^(SNR_av./10);   %平均噪声功率
B=1e6;           %系统带宽
N_psd=noise./(B/N_subc);   %噪声的功率谱密度
BER=1e-4;       %系统误比特率
M=8;            %调制方式上限
Rt=128;         %系统发射比特数上限
H=random('rayleigh',1,1,N_subc);
[bit_alloc, power_alloc]=Hughes_Hartogs(N_subc,Rt,M,BER,N_psd,H);
power_alloc=Pt.*(power_alloc./sum(power_alloc));
figure(1);
subplot(2,1,1);
plot(H,'-r');
legend('信道增益')
hold on;
stem(bit_alloc);
ylabel('比特分配结果');
xlabel('子载波序号');
title('Hughes-Hartogs分配结果');
subplot(2,1,2);
stem(power_alloc);
ylabel('功率分配结果');
xlabel('子载波序号');

Hughes_Hartogs.m

function [bit_alloc,power_alloc]=Hughes_Hartogs(N_subc,Rt,M,BER,noise,H)
% ---------------------initialization-------------------
bit_alloc=zeros(1,N_subc);
power_alloc=zeros(1,N_subc);
bit_total=0;
for i=1:N_subc
    power_add(i)=(power_compute(bit_alloc(i)+1,BER,noise)-...
        power_compute(bit_alloc(i),BER,noise))/H(i)^2;
end
%----------------------找到最小的功率增量的索引-------------------
min_add=min(power_add);
index_min=find(power_add==min_add,1);
%---------------------分配比特-------------------
bit_alloc(index_min)=bit_alloc(index_min)+1;
bit_total=sum(bit_alloc);
while(bit_total<Rt)        %达到系统容量最大分配
    if(bit_alloc(index_min)<=M)       %未达到系统的最大调制方式
        for i=1:N_subc
            power_add(i)=(power_compute(bit_alloc(i)+1,BER,noise)-...
                power_compute(bit_alloc(i),BER,noise))/H(i)^2;
        end
        min_add=min(power_add);     %找到功率增量最小的子信道增加1比特
        index_min=find(power_add==min_add,1);
        bit_alloc(index_min)=bit_alloc(index_min)+1;
        bit_total=sum(bit_alloc);
    else
        power_add(index_min)=inf;     %达到最大调制方式,不再对其分配比特
        min_add=min(power_add);
        index_min=find(power_add==min_add,1);
        bit_alloc(index_min)=bit_alloc(index_min)+1;
        bit_total=sum(bit_alloc);
    end
end
%---------------------power allocation--------------------------
for i=1:N_subc
    power_alloc(i)=power_compute(bit_alloc(i),BER,noise)/H(i)^2;
end
end


function power_add=power_compute(bit,BER,noise)
bit_num=2^bit-1;
Gamma=sqrt(2)*erfcinv(2*BER/4);
power_add=noise/3*(Gamma^2)*bit_num;
end


  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值