Chow比特功率分配算法及MATLAB实现

原理介绍

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=N1 Γ \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.5ln(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(2USedCarriersRRT)
(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} 104
子载波数目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 
  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值