原理介绍
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=∣Hi∣2f(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=∣Hi∣2f(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