一、注水原理
在OFDM 系统中,信道的带宽为
W
W
WHz,
H
(
f
)
H\left( f \right)
H(f) 表示该信道的传输函数,信道内存在加性高斯白噪声,噪声功率谱密度为
N
(
f
)
N\left( f \right)
N(f) 。该系统有
N
N
N个子信道,每个子信道的带宽为
Δ
f
=
B
/
N
\Delta f=B/N
Δf=B/N,而且
∣
H
(
f
)
∣
2
/
N
(
f
)
{{\left| H\left( f \right) \right|}^{2}}/N\left( f \right)
∣H(f)∣2/N(f)的值在子信道频带内近似为常量。信号的总发射功率为
P
T
{{P}_{T}}
PT ,发送信号的功率谱密度为
S
x
(
f
)
{{S}_{x}}\left( f \right)
Sx(f) ,即:
P
T
=
∫
f
0
f
0
+
B
S
x
(
f
)
d
f
{{P}_{T}}=\int_{{{f}_{0}}}^{{{f}_{0}}+B}{{{S}_{x}}\left( f \right)df}
PT=∫f0f0+BSx(f)df
其中,
f
0
{{f}_{0}}
f0 为第一个子信道的起始频率。
由香农定理可以知道信道的容量为
C
=
∫
f
0
f
0
+
B
log
2
[
1
+
S
x
(
f
)
∣
H
(
f
)
∣
2
N
(
f
)
]
d
f
C=\int_{{{f}_{0}}}^{{{f}_{0}}+B}{{{\log }_{2}}\left[ 1+\frac{{{S}_{x}}\left( f \right){{\left| H\left( f \right) \right|}^{2}}}{N\left( f \right)} \right]}df
C=∫f0f0+Blog2[1+N(f)Sx(f)∣H(f)∣2]df
在发射功率的约束下,实现信道容量的最大化,可以利用变分法将其变换为
∫
f
0
f
0
+
B
{
log
2
[
1
+
S
x
(
f
)
∣
H
(
f
)
∣
2
N
(
f
)
]
+
λ
S
x
(
f
)
}
d
f
→
max
\int_{{{f}_{0}}}^{{{f}_{0}}+B}{\left\{ {{\log }_{2}}\left[ 1+\frac{{{S}_{x}}\left( f \right){{\left| H\left( f \right) \right|}^{2}}}{N\left( f \right)} \right]\text{+}\lambda {{S}_{x}}\left( f \right) \right\}}df\to \max
∫f0f0+B{log2[1+N(f)Sx(f)∣H(f)∣2]+λSx(f)}df→max
其中
λ
\lambda
λ为拉格朗日算子,经过变分法求解得到
S
x
(
f
)
=
{
K
−
N
(
f
)
∣
H
(
f
)
∣
2
f
∈
B
0
f
∉
B
{{S}_{x}}\left( f \right)=\left\{ \begin{aligned} & K-\frac{N\left( f \right)}{{{\left| H\left( f \right) \right|}^{2}}}\ \ \ \ \ \ \ f\in B \\ & 0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f\notin B \\ \end{aligned} \right.
Sx(f)=⎩⎪⎨⎪⎧K−∣H(f)∣2N(f) f∈B0 f∈/B
其中
K
=
P
T
B
+
1
B
∫
B
N
(
f
)
∣
H
(
f
)
∣
2
d
f
K=\frac{{{P}_{T}}}{B}+\frac{1}{B}\int_{B}^{{}}{\frac{N\left( f \right)}{{{\left| H\left( f \right) \right|}^{2}}}df}
K=BPT+B1∫B∣H(f)∣2N(f)df
上式的物理意义是:当信噪比
∣
H
(
f
)
∣
2
/
N
(
f
)
{{\left| H\left( f \right) \right|}^{2}}/N\left( f \right)
∣H(f)∣2/N(f)较大时,信道对应的分配功率应该较大,反之,信道对应的分配功率也应该较小,或者关闭部分信噪比极低的信道
下面是注水算法的简单示意图
从上图中也可以看出,当信道情况比较好的时候分配的功率比较多,信道情况比较差的时候分配的功率比较少,下面我们也可以给出一个仿真的例子。参数设置如下:
参数名称 | 参数值 |
---|---|
信道个数 | 8 |
总发射功率 | 10 |
噪声功率 | 2,3,4,1,3,4,3,2 |
也可以看出上述的情况和给出的示例图的结果是一致的。
那么在具体的例子中应该如何去使用呢?下面给出一个关于比特和功率分配的注水算法的例子。
首先介绍一下算法的原理。
比特功率分配的理想注水算法的原理
对于单用户的功率分配,注水算法的求解的目标为
min
p
n
∑
n
=
1
N
log
2
(
1
+
p
n
g
n
Γ
)
s
.
t
.
∑
n
=
1
N
p
n
≤
P
T
,
p
n
≥
0
,
n
=
1
,
⋯
,
N
\underset{{{p}_{n}}}{\mathop{\min }}\,\ \sum\limits_{n=1}^{N}{{{\log }_{2}}}\left( 1+\frac{{{p}_{n}}{{g}_{n}}}{\Gamma } \right)\ \ s.t.\ \ \sum\limits_{n=1}^{N}{{{p}_{n}}}\le {{P}_{T}},\quad {{p}_{n}}\ge 0,n=1,\cdots ,N
pnmin n=1∑Nlog2(1+Γpngn) s.t. n=1∑Npn≤PT,pn≥0,n=1,⋯,N
其中
g
n
=
∣
h
n
∣
2
/
σ
n
2
g_{n}=\left|h_{n}\right|^{2} / \sigma_{n}^{2}
gn=∣hn∣2/σn2表示第
n
n
n个子信道的信道增益噪声比。
Γ
{\Gamma}
Γ为信噪比间隙,采用QAM调制时,其表达式为
Γ
=
1
3
[
Q
−
1
(
B
E
R
4
)
2
]
\Gamma =\frac{1}{3}\left[ {{Q}^{-1}}{{\left( \frac{BER}{4} \right)}^{2}} \right]
Γ=31[Q−1(4BER)2]
其中,
Q
(
x
)
=
1
2
π
∫
x
+
∞
e
−
t
2
/
2
d
t
Q\left( x \right)=\frac{1}{\sqrt{2\pi }}\int_{x}^{+\infty }{{{e}^{-{{t}^{2}}/2}}}dt
Q(x)=2π1∫x+∞e−t2/2dt,但是一般不用此公式计算,而是采取其近似公式
Γ
=
−
ln
(
5
B
E
R
)
1.5
\Gamma =-\frac{\ln \left( 5BER \right)}{1.5}
Γ=−1.5ln(5BER)
若不考虑
p
n
{{p}_{n}}
pn的正负性的限制,那么对于上式,利用拉格朗日乘数法进行求解,可以得到
L
=
∑
n
=
1
N
log
2
(
1
+
p
n
g
n
Γ
)
+
λ
(
P
T
−
∑
n
=
1
N
p
n
)
L=\sum\limits_{n=1}^{N}{{{\log }_{2}}\left( 1+\frac{{{p}_{n}}{{g}_{n}}}{\Gamma } \right)}+\lambda \left( {{P}_{T}}-\sum\limits_{n=1}^{N}{{{p}_{n}}} \right)
L=n=1∑Nlog2(1+Γpngn)+λ(PT−n=1∑Npn)
由于
p
n
{{p}_{n}}
pn 相当于变量,那么关于
L
L
L 对
p
n
{{p}_{n}}
pn求导可以得到
∂
L
n
∂
p
n
=
1
ln
2
g
n
Γ
1
1
+
p
n
g
n
Γ
−
λ
=
0
\frac{\partial {{L}_{n}}}{\partial {{p}_{n}}}=\frac{1}{\ln 2}\frac{{{g}_{n}}}{\Gamma }\frac{1}{1+\frac{{{p}_{n}}{{g}_{n}}}{\Gamma }}-\lambda =0
∂pn∂Ln=ln21Γgn1+Γpngn1−λ=0
对其进行化简可以得到
p
n
+
Γ
g
n
=
1
λ
ln
2
=
k
{{p}_{n}}+\frac{\Gamma }{{{g}_{n}}}=\frac{1}{\lambda \ln 2}=k
pn+gnΓ=λln21=k
对上式两边进行求和可以得到注水的常量
K
=
1
N
(
P
T
+
Γ
∑
n
=
1
N
1
g
n
)
K=\frac{1}{N}\left( {{P}_{T}}+\Gamma \sum\limits_{n=1}^{N}{\frac{1}{{{g}_{n}}}} \right)
K=N1(PT+Γn=1∑Ngn1)
那么每个子载波的功率为
p
n
=
K
−
Γ
g
n
,
n
=
1
,
2
,
⋯
,
N
{{p}_{n}}=K-\frac{\Gamma }{{{g}_{n}}},n=1,2,\cdots ,N
pn=K−gnΓ,n=1,2,⋯,N
上述求解过程并没有考虑
p
n
{{p}_{n}}
pn出现负值的情况,在某些信道具有严重的频率选择性衰落时,那么
p
n
{{p}_{n}}
pn是可能出现负值的。若
p
n
<
0
{{p}_{n}}<0
pn<0,那么其对应的一定是
g
n
{{g}_{n}}
gn最小的子信道,此时系统的总功率不能满足所有子信道的分配,应该放弃信道状况最差的信道,不给其分配功率,那么此时需要重新计算注水线,直至所有的信道分配的功率非负,其具体步骤可以总结为:
1)将子信道增益进行排序,
g
1
>
g
2
>
⋯
>
g
N
{{g}_{1}}>{{g}_{2}}>\cdots >{{g}_{N}}
g1>g2>⋯>gN
2)初始化可用的子信道数目,
N
∗
=
N
{{N}^{*}}=N
N∗=N
3)计算注水常量,
K
=
(
P
T
+
Γ
G
)
/
N
K=\left( {{P}_{T}}+\Gamma G \right)/N
K=(PT+ΓG)/N ,
G
=
∑
n
=
1
N
1
g
n
G=\sum\limits_{n=1}^{N}{\frac{1}{{{g}_{n}}}}
G=n=1∑Ngn1
4)计算第
N
∗
{{N}^{*}}
N∗个子信道分配的功率,
p
N
∗
=
K
−
Γ
/
g
N
∗
{{p}_{{{N}^{*}}}}=K-\Gamma /{{g}_{{{N}^{*}}}}
pN∗=K−Γ/gN∗
5)若
p
N
∗
≤
0
{{p}_{{{N}^{*}}}}\le 0
pN∗≤0,则
G
=
G
−
1
/
g
N
∗
G=G-1/{{g}_{{{N}^{*}}}}
G=G−1/gN∗ ,
N
∗
=
N
∗
−
1
{{N}^{*}}={{N}^{*}}-1
N∗=N∗−1 ,
K
=
(
P
T
+
Γ
G
)
/
N
∗
K=\left( {{P}_{T}}+\Gamma G \right)/{{N}^{*}}
K=(PT+ΓG)/N∗
6)计算最终的功率分配和比特分配
p
n
=
{
K
−
Γ
/
g
n
n
=
1
,
2
,
⋯
,
N
∗
0
n
=
N
∗
+
1
⋯
,
N
{{p}_{n}}=\left\{ \begin{aligned} & K-\Gamma /{{g}_{n}}\ \ \ n=1,2,\cdots ,{{N}^{*}} \\ & 0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ n={{N}^{*}}\text{+}1\cdots ,N \\ \end{aligned} \right.
pn={K−Γ/gn n=1,2,⋯,N∗0 n=N∗+1⋯,N,
b
n
=
log
2
(
1
+
p
n
g
n
Γ
)
{{b}_{n}}={{\log }_{2}}\left( 1+\frac{{{p}_{n}}{{g}_{n}}}{\Gamma } \right)
bn=log2(1+Γpngn)
接下来,可以对上述过程进行仿真,这里给出仿真的条件
参数名称 | 参数值 |
---|---|
信道个数 | 64 |
误比特率(BER) | 10 − 3 {{10}^{-3}} 10−3 |
总发射功率 | 1 |
信道类型 | 瑞利衰落信道 |
平均信噪比 | 20dB |
实验的结果如下:
可以看出信道质量好的子信道分配较多的功率和比特,信道差的子信道分配较少的功率和比特,这也和注水的原理相一致。
实验一代码:
clc;
close all;
clear;
%% 初始化
Ptsum=10; %总传输功率
noise=[2 3 4 1 3 4 3 2]; %噪声功率
N= length(noise) ; %信道个数
[noise_sorted,index]=sort(noise);
for p=length(noise_sorted):-1:1
T_P=(Ptsum+sum(noise_sorted(1:p)))/p;
Input_Power=T_P-noise_sorted;
Pt=Input_Power(1:p);
if(Pt(:)>=0)
break
end
end
power_alloc=zeros(1,N);
power_alloc(index(1:p))=Pt; %分配的功率
capacity=sum(log2(1+power_alloc./noise)); %信道容量
for ii =1:length(noise)
g(ii,:)=[noise(ii),power_alloc(ii)];
end
bar(g,'stack');
legend ('Noise Level','Power Level')
ylabel('Noise & Power Level','fontsize',12)
xlabel('Number of Channels (N)','fontsize',12)
title('Power Allocation for Waterfilling Alogorithm','fontsize',12)
实验二代码:
clear;
close all;
clc;
%% 初始化参数
N_subc=64; %子载波数目
BER=1e-3; %目标误比特率
gap=-log(5*BER)/1.5; %信噪比间隙(dB)常量,采用QAM调制时的近似表达式
P_av=1/N_subc; %每个子载波的平均功率
Ptsum=P_av*N_subc; %总发射功率
SNR_sub=20+20*(rand(1,N_subc)-0.5); %平均信噪比20dB
noise=P_av./10.^(SNR_sub./10); %每个子信道的噪声功率
%% 仿真瑞利衰落
hn=random('rayleigh',1,1,N_subc); %子载波增益
gn=hn.^2./noise;
%% 初始化可用子载波数
N=length(N_subc);
%% 初始化分配的功率
[gain_sorted,dt]=sort(gap./gn); %对增益进行排序
for p=length(gain_sorted):-1:1
T_P=(Ptsum+sum(gain_sorted(1:p)))/p; %计算注水线
Input_Power=T_P-gain_sorted; %进行功率分配
Pt=Input_Power(1:p);
if(Pt(:)>=0) %所有子信道的功率都大于0,分配完毕
break
end
end
power_alloc=zeros(1,N);
power_alloc(dt(1:p))=Pt; %注水法分配的功率
bit_alloc=log2(1+power_alloc./noise); %注水法分配的比特
%% 绘图
figure(1);
subplot(311)
stem(SNR_sub);
ylabel('SNR average(dB)')
set(gca,'ytick',[-10:10:30])
subplot(312);
stem(power_alloc);
ylabel('Power allocation(W)')
ylim([0 0.03])
subplot(313);
stem(bit_alloc);
ylabel('Bit allocation(bit)')
ylim([0 12])
参考文献:
[1]蒋留兵,杨昌昱,李卓伟,韦洪浪,许腾飞.基于注水原理的快速功率和比特分配算法[J].微电子学与计算机,2014,31(03):86-88+93.
[2]赵新凤. OFDM系统动态资源分配算法研究[D].山东大学,2011.
[3]张冬梅,徐友云,蔡跃明.OFDMA系统中的功率与比特高效分配算法[J].通信学报,2008(04):108-113.
[4]张莉. OFDM自适应资源分配算法研究[D].南京航空航天大学,2006.