原理介绍
Chow算法是根据各个子信道的信道容量来分配比特的。它的优化准则是在维持目标误比特率的前提下,使系统的余量最大。该算法通过迭代过程,逐步分配比特,同时使系统的余量逐步增大,直到所有的比特都分配完毕。
比特分配
(1)计算各个子信道的信噪比,
S
N
R
(
i
)
,
∀
i
SNR\left( i \right),\forall i
SNR(i),∀i, 假设所有子信道上的信号能量都是归一化的,
ε
(
i
)
=
1
,
∀
i
\varepsilon \left( i \right)=1,\forall i
ε(i)=1,∀i
(2)令
γ
m
arg
i
n
=
0
dB
{{\gamma }_{m\arg in}}=0\text{dB}
γmargin=0dB ,迭代次数为
I
t
e
r
c
o
u
n
t
=
0
Itercount=0
Itercount=0 ,已使用的子信道数为
U
s
e
d
c
a
r
r
i
e
r
s
=
N
Usedcarriers=N
Usedcarriers=N,其中
N
N
N为可用的子信道数的最大数目
(3)依次计算
b
(
i
)
b(i)
b(i) ,
b
^
(
i
)
\hat{b}(i)
b^(i) ,
d
i
f
f
(
i
)
diff(i)
diff(i) 和
U
s
e
d
c
a
r
r
i
e
r
s
Usedcarriers
Usedcarriers
b
(
i
)
=
log
2
(
1
+
S
N
R
(
i
)
Γ
+
γ
m
arg
i
n
(
d
B
)
)
b(i)={{\log }_{2}}\left( 1+\frac{SNR(i)}{\Gamma +{{\gamma }_{m\arg in}}(dB)} \right)
b(i)=log2(1+Γ+γmargin(dB)SNR(i))
b
^
(
i
)
=
r
o
u
n
d
(
b
(
i
)
)
\hat{b}(i)=round(b(i))
b^(i)=round(b(i))
d
i
f
f
(
i
)
=
b
(
i
)
−
b
^
(
i
)
diff(i)=b(i)-\hat{b}(i)
diff(i)=b(i)−b^(i)
若
b
^
(
i
)
=
0
\hat{b}(i)\text{=}0
b^(i)=0,
U
s
e
d
c
a
r
r
i
e
r
s
=
N
−
1
Usedcarriers\text{=}N-1
Usedcarriers=N−1,
Γ
\Gamma
Γ 为
S
N
R
SNR
SNR间距,定义为系统达到传输容量C时的理想
S
N
R
SNR
SNR 和实际传输容量
R
R
R 的
S
N
R
SNR
SNR之比。
Γ
\Gamma
Γ是
B
E
R
BER
BER 和信道编码方式的函数,假设采用QAM调制,则
Γ
=
−
ln
(
5
B
E
R
t
arg
e
t
)
1.5
\Gamma \text{=}\frac{-\ln \left( 5BE{{R}_{t\arg et}} \right)}{1.5}
Γ=1.5−ln(5BERtarget)
(4)计算
R
=
s
u
m
(
{
b
^
(
i
)
}
)
R\text{=}sum\left( \left\{ \hat{b}\left( i \right) \right\} \right)
R=sum({b^(i)}),若
R
=
0
R=0
R=0 ,则信道太差,无法使用
(5)计算
γ
m
a
r
g
i
n
{{\gamma }_{margin}}
γmargin
γ
m
a
r
g
i
n
=
γ
m
a
r
g
i
n
+
10
log
10
(
2
R
−
R
T
U
S
e
d
C
a
r
r
i
e
r
s
)
{{\gamma }_{margin\text{ }}}={{\gamma }_{margin}}+10{{\log }_{10}}\left( {{2}^{\frac{R-{{R}_{T}}}{USedCarriers}}} \right)
γmargin =γmargin+10log10(2USedCarriersR−RT)
(6)迭代次数
I
t
e
r
c
o
u
n
t
=
I
t
e
r
c
o
u
n
t
+
1
Itercount=Itercount+1
Itercount=Itercount+1
(7)若
R
≠
R
T
R\ne {{R}_{T}}
R=RT且
I
t
e
r
c
o
u
n
t
<
M
a
x
c
o
u
n
t
Itercount<Maxcount
Itercount<Maxcount ,令
U
s
e
d
c
a
r
r
i
e
r
s
=
N
Usedcarriers=N
Usedcarriers=N ,转步骤(3),否则转步骤(8)
(8)若
R
>
R
T
R>{{R}_{T}}
R>RT ,找到最小的
d
i
f
f
(
i
)
diff\left( i \right)
diff(i) ,相应地
b
^
(
i
)
=
b
^
(
i
)
-
1
\hat{b}(i)\text{=}\hat{b}(i)\text{-}1
b^(i)=b^(i)-1,
d
i
f
f
(
i
)
=
d
i
f
f
(
i
)
+
1
diff\left( i \right)=diff\left( i \right)+1
diff(i)=diff(i)+1 ,重复此步骤直至
R
=
R
T
R\text{=}{{R}_{T}}
R=RT
(9)若
R
<
R
T
R<{{R}_{T}}
R<RT ,找到最大的
d
i
f
f
(
i
)
diff\left( i \right)
diff(i),相应地
b
^
(
i
)
=
b
^
(
i
)
+
1
\hat{b}(i)\text{=}\hat{b}(i)\text{+}1
b^(i)=b^(i)+1 ,
d
i
f
f
(
i
)
=
d
i
f
f
(
i
)
-
1
diff\left( i \right)=diff\left( i \right)\text{-}1
diff(i)=diff(i)-1 ,重复此步骤直至
R
=
R
T
R\text{=}{{R}_{T}}
R=RT
(10)调整每个子信道上的发射功率,使得相应于
b
(
i
)
b(i)
b(i)
P
e
(
i
)
=
P
e
,
t
arg
e
t
,
∀
i
{{P}_{e}}\left( i \right)={{P}_{e,t\arg et}},\ \forall i
Pe(i)=Pe,target, ∀i
(11)调整发射总功率。对所有已使用的子信道乘以相同的比例因子,
使总的信号功率
P
=
P
T
P={{P}_{T}}
P=PT
仿真参数设置
参数名称 | 参数值 |
---|---|
平均信噪比 | 20 |
误比特率 | 1 0 − 4 10^{-4} 10−4 |
子载波数目 | 32 |
平均发射功率 | 1 |
比特总数上限 | 128 |
实验结果如下
从上图中可以看出,通过逐步调整分配比特,从而使系统最终的比特数达到最大。同时,也可以看出,Chow算法分配的结果有一定的优势,它是将信道状况较差的子载波舍弃,也就是说系统最终传输的所用的子载波一定有信息的传输,从仿真的结果可能证实这一点。
代码如下:
主函数
clear ;
close all;
clc;
N_subc=32;
BER=1e-4;
gap=-log(5*BER)/1.5;
P_av=1;
Pt=P_av*N_subc;
SNR_av=20;
noise=P_av./10.^(SNR_av./10);
Rt=128;
subcar_gains=random('rayleigh',1,1,N_subc);
SNR=(subcar_gains.^2)./(noise*gap);
[bit_alloc,power_alloc,Iterate_count]=Chow(SNR,N_subc,gap,Rt);
power_alloc=Pt.*(power_alloc./sum(power_alloc));
figure(1);
subplot(2,1,1);
plot(subcar_gains,'-r');
legend('信道增益');
hold on;
stem(bit_alloc);
title('Chow比特功率分配');
ylabel('比特分配结果');
xlabel('子载波序号');
subplot(2,1,2);
stem(power_alloc);
ylabel('功率分配结果');
xlabel('子载波序号');
Chow.m
function [bits_alloc, power_alloc,iter_count] = Chow(SNR,N_subc,gap,Rt)
% ---------------------initialization-------------------------
margin=0; %初始化门限
Max_count=10; %最大迭代次数
iter_count=0; %初始化迭代
total_bits=0; %总比特殊
power_alloc=zeros(1,N_subc); %初始化功率分配结果
bits_alloc=zeros(1,N_subc); %初始化比特分配结果
temp_bits=zeros(1,N_subc); %初始化中间变量
bit_round=zeros(1,N_subc); %初始化取整比特
diff=zeros(1,N_subc); %初始化差分比特
%-----------------------------bits allocation-------------------------
while (total_bits~=Rt)&&(iter_count<Max_count)
iter_count=iter_count+1;
N_use=N_subc; %初始化啊可用子载波数目
temp_bits=log2(1+SNR./(1+margin/gap)); %分配比特的初始结果
bit_round=round(temp_bits); %取整后的比特数
diff=temp_bits-bit_round; %比特数差值
total_bits=sum(bit_round); %取整后的比特总数
if(total_bits==0)
disp('the channel is not be used'); %信道太差,无法使用
end
N_notuse=length(find(bit_round==0)); %未使用的子载波数目
N_use=N_subc-N_notuse; %使用的子载波数目
margin=margin+10*log10(2^((total_bits-Rt)/N_use)); %更新门限
end
%------------------------------bits alteration--------------------------
while(total_bits>Rt) %如果 bit_total>Rt,找到最小的bit_diff(i)
use_ind=find(bit_round>0); %相应地bit_round减1,bit_total=bit_total-1
bit_diff=diff(use_ind); %bit_diff(i)加1,直至bit_total=Rt
id=find(bit_diff==min(bit_diff),1);
ind_alter=use_ind(id);
bit_round(ind_alter)=bit_round(ind_alter)-1;
diff(ind_alter)=diff(ind_alter)+1;
total_bits=sum(bit_round);
end
while(total_bits<Rt) %如果 bit_total<Rt,找到最大的bit_diff(i)
use_ind=find(bit_round~=0); %相应地bit_round加1,bit_total=bit_total+1
bit_diff=diff(use_ind); %bit_diff(i)减1,直至bit_total=Rt
id=find(bit_diff==max(bit_diff),1);
ind_alter=use_ind(id);
bit_round(ind_alter)=bit_round(ind_alter)+1;
diff(ind_alter)=diff(ind_alter)-1;
total_bits=sum(bit_round);
end
bits_alloc=bit_round;
%--------------------------power allocation-----------------------------
power_alloc=(2.^bits_alloc-1)./SNR;
end