本文首先介绍了基于CDMA的多用户UOWC系统模型,并给出了多用户收发信号的数学模型。然后介绍基于子空间的延时估计算法,该算法只需要已知所有用户的扩频码,然后根据扩频波形的循环移位在观测空间的信号子空间上的投影进行延时估计。
1、基于CDMA的多用户UOWC系统模型
首先介绍基于CDMA的多用户UOWC系统模型,系统框图如下图所示。
该系统包括发送端、UOWC信道和接收端。该系统包含
K
K
K个用户,每个用户配备一个LED光源,且为其分配了独一无二的m序列作为扩频码。与射频通信不同的是,LED属于非相干光源,因此发送端只能采用强度调制(调制LED发光的亮灭或者亮的程度),并且LED只能发送单极性的实信号,需要用Bias-T将双极性信号叠加上直流偏置以使LED工作在输出光功率和输入电压关系曲线的线性区间。在接收端采用隔直的雪崩光电二极管(Avalanche Photodiode,APD)作为接入点(Access Point,AP)的光电探测器。光信号被隔直APD转换为电信号并去除直流分量,交流电信号经ADC采样后获得离散数字信号。
假设这
K
K
K个用户有相同的比特周期
T
b
T_\text{b}
Tb和码片周期
T
c
T_\text{c}
Tc。比特周期与码片周期的关系为
T
c
=
T
b
L
,
T_\text{c} = \frac{T_\text{b}}{L},
Tc=LTb, 其中
L
L
L为扩频因子。第
k
k
k个用户发送的信号可以表示为
s
tx
,
k
(
t
)
=
∑
i
=
−
∞
∞
P
k
b
k
[
i
]
s
k
(
t
−
i
T
b
)
+
m
k
,
s_{\text{tx},k}(t) = \sum_{i=-\infty}^{\infty} { P_k b_k [i] s_k (t - i T_\text{b})} + m_k,
stx,k(t)=i=−∞∑∞Pkbk[i]sk(t−iTb)+mk,其中,
i
i
i是信息比特的索引,
P
k
P_k
Pk表示第
k
k
k个用户发送信号的幅度,
b
k
[
i
]
∈
{
+
1
,
−
1
}
b_k [i]\in\{+1,-1\}
bk[i]∈{+1,−1}表示第
k
k
k个用户发送的第
i
i
i个比特,
s
k
(
t
)
s_k (t)
sk(t)表示第
k
k
k个用户扩频波形,它在区间
[
0
,
T
b
]
[0,T_\text{b}]
[0,Tb]以外的值为
0
0
0,
m
k
m_k
mk是加在第
k
k
k个用户的LED上的直流偏置。
所有用户的光信号经过水下信道后在接收端叠加,叠加的光信号经过隔直APD的光电转换和去直后变成双极性电信号。ADC以
T
s
=
T
c
/
N
s
T_\text{s}= {T_\text{c}}/{N_\text{s}}
Ts=Tc/Ns为采样间隔对电信号采样获得离散数字信号,其中
N
s
N_\text{s}
Ns是上采样率。
n
T
s
nT_\text{s}
nTs时刻的采样信号表示为
s
rx
[
n
]
=
∑
k
=
1
K
∑
i
=
−
∞
∞
A
k
b
k
[
i
]
s
k
[
n
−
i
L
N
s
−
q
k
]
+
w
[
n
]
,
s_\text{rx}[n] = \sum\limits_{k = 1}^K{\sum\limits_{i=-\infty}^{\infty} {A_k b_k [i] s_k \left[n -iLN_\text{s} - q_k\right]}} + w[n],
srx[n]=k=1∑Ki=−∞∑∞Akbk[i]sk[n−iLNs−qk]+w[n], 其中,
A
k
=
P
k
h
k
A_k=P_k h_k
Ak=Pkhk表示电信号的幅值,
h
k
h_k
hk表示包括电光转换、水下信道功率损耗和光电转换的等效信道增益(不考虑多径传输),
s
k
[
n
]
=
s
k
(
n
T
s
)
s_k [n]=s_k (nT_\text{s})
sk[n]=sk(nTs)表示扩频波形的采样值,
q
k
q_k
qk表示延时对应的采样点数量,
w
[
n
]
w[n]
w[n]是均值为
0
0
0方差为
σ
2
\sigma^2
σ2的高斯白噪声。
2、延时估计
基于异步CDMA的多用户UOWC系统的信号如下图所示。
假设数据以连续比特进行传输,每个用户的扩频码已知。由于各个用户和接收机之间是异步的,每个用户的信号在不同时刻到达接收机,接收机一开始不知道每个用户的比特的确切位置。延时估计的目标是确定每个用户的信号解扩时积分区间的起始点,也可以视为位同步。以
n
0
T
s
n_0T_\text{s}
n0Ts为参考采样时刻,对于第
k
k
k个用户,第
n
0
n_0
n0个采样点所处的比特记为
b
k
[
0
]
b_k[0]
bk[0],待估计的延时就是从第
n
0
n_0
n0个采样点到
b
k
[
1
]
b_k[1]
bk[1]比特第一个采样点之间的时间间隔。从上图中容易看出,待估计的延时不超过一个比特周期。即使某个用户的延时
τ
k
\tau_k
τk超过了一个比特周期,也可以对
τ
k
\tau_k
τk按比特周期取模将其限制在一个比特周期以内,即
(
τ
k
mod
T
b
)
∈
[
0
,
T
b
)
(\tau_k~\text{mod}~T_\text{b}) \in [0, T_\text{b})
(τk mod Tb)∈[0,Tb)。因此,可以不失一般性的假设每个用户的延时不超过一个比特周期,即
τ
k
∈
[
0
,
T
b
)
\tau_k \in [0, T_\text{b})
τk∈[0,Tb)。由于采样间隔
T
s
T_\text{s}
Ts是系统中最小的时间单元,估计延时
τ
k
\tau_k
τk就是估计
τ
k
\tau_k
τk对应的采样点数量
q
k
q_k
qk:
q
k
=
⟨
τ
k
T
s
⟩
mod
(
L
N
s
)
,
q_k = \langle\frac{\tau_k}{T_\text{s}}\rangle~\text{mod}~(LN_\text{s}),
qk=⟨Tsτk⟩ mod (LNs),其中,
⟨
⋅
⟩
\langle \cdot\rangle
⟨⋅⟩表示四舍五入取整,
q
k
q_k
qk从集合
{
0
,
1
,
⋯
,
L
N
s
−
1
}
\{0,1,\cdots,LN_\text{s}-1\}
{0,1,⋯,LNs−1}中取值。
2.1 滑动相关法延时估计
常规的延时估计方法是滑动相关法,该方法用滑动相关器与接收信号做相关运算,通过最大化滑动窗口内的相关值来估计信号延时。滑动相关器是一个与待估计用户的扩频波形匹配的FIR结构滤波器,第
k
k
k个用户的滑动相关器的滤波器系数就是其扩频波形在区间
[
0
,
T
b
]
[0,T_\text{b}]
[0,Tb]内的采样值,用向量表示为
s
k
=
[
s
k
[
0
]
,
s
k
[
1
]
,
⋯
,
s
k
[
L
N
s
−
1
]
]
.
\boldsymbol{s}_k = \left[s_k[0],s_k[1],\cdots,s_k[LN_\text{s}-1]\right].
sk=[sk[0],sk[1],⋯,sk[LNs−1]]. 假设用持续
M
M
M个比特周期的接收信号估计第
k
k
k个用户的延时,滑动相关法的公式表示为
q
^
k
=
arg
max
q
∈
{
0
,
⋯
,
L
N
s
−
1
}
∑
i
=
0
M
−
1
∣
s
k
r
(
q
,
i
)
∣
,
\hat{q}_k = \mathop{\arg\max}\limits_{q \in \{0,\cdots,LN_\text{s}-1\}}\sum_{i=0}^{M-1}{\left|\boldsymbol{s}_k\boldsymbol{r}(q,i)\right|},
q^k=q∈{0,⋯,LNs−1}argmaxi=0∑M−1∣skr(q,i)∣, 其中,
r
(
q
,
i
)
=
[
s
rx
[
n
0
+
q
+
i
L
N
s
]
s
rx
[
n
0
+
q
+
i
L
N
s
+
1
]
⋮
s
rx
[
n
0
+
q
+
(
i
+
1
)
L
N
s
−
1
]
]
∈
R
L
N
s
×
1
.
\boldsymbol{r}(q,i) = \left[\begin{array}{c} s_\text{rx}[n_0+q+iLN_\text{s}] \\ s_\text{rx}[n_0+q+iLN_\text{s}+1] \\ \vdots \\ s_\text{rx}[n_0+q+(i+1)LN_\text{s}-1] \end{array}\right] \in \mathbb{R}^{LN_\text{s}\times 1}.
r(q,i)=
srx[n0+q+iLNs]srx[n0+q+iLNs+1]⋮srx[n0+q+(i+1)LNs−1]
∈RLNs×1.
滑动相关法将MAI视为噪声,它能够在单用户或者多用户扩频波形相互正交的情况下工作。然而,在有MAI,尤其是存在远近效应的情况下,互相关峰可能大于自相关峰,导致滑动相关法不能正常工作。不准确的延时估计结果将使多用户检测器的检测性能变差,因此有必要研究抗远近效应的延时估计算法。
function [delay,max_corr] = corr_channel_estimation(rec_data,ss_code,sf,M,L_bit,K,b,sps,isShape)
% rec_data 接收信号
% ss_code 扩频码
% sf 扩频因子
% M 快拍数
% L_bit 信息比特数
% K 用户数
% b 成型滤波抽头系数
% sps 上采样率
% isShape 发射信号是否成型滤波 1 滤波, 0 不滤波
if M >= L_bit
M = L_bit-1;
end
if isShape == 1
ss_code_upsample = upfirdn(ss_code',b,sps)';
ss_code_upsample = ss_code_upsample(:,round(length(b)/2)-round(sps/2)+1:round(length(b)/2)-round(sps/2)+sps*sf);
else
ss_code_upsample = rectpulse(ss_code,sps);
end
delay = zeros(K,1);
max_corr = zeros(K,1);
corr = zeros(1,M*sps*sf);
for k = 1:K
for n = 1:M*sps*sf
corr(n) = rec_data(n:n+sps*sf-1)*ss_code_upsample(k,:)';
end
corr_temp = reshape(abs(corr'),sps*sf,[]);
[max_corr(k),delay(k)] = max(mean(corr_temp,2));
end
delay = delay-1;
end
2.2 基于子空间的延时估计
这个方法和阵列信号处理中MUSIC算法很像,阵列信号处理中是用多个天线接获得正弦信号的不同相位,而这里是一个光电探测器长时间采样获得扩频序列的不同相位。
令一个观测窗口的宽度等于一个比特周期
T
b
T_\text{b}
Tb,有
L
N
s
LN_\text{s}
LNs个采样点。从第
n
0
n_0
n0个采样点开始,将每
L
N
s
LN_\text{s}
LNs个采样点写入一个观测向量
z
(
i
)
∈
R
L
N
s
×
1
\boldsymbol{z}(i) \in \mathbb{R}^{LN_\text{s}\times 1}
z(i)∈RLNs×1,
z
(
i
)
\boldsymbol{z}(i)
z(i)表示为
z
(
i
)
=
[
s
rx
[
n
0
+
i
L
N
s
]
s
rx
[
n
0
+
i
L
N
s
+
1
]
⋮
s
rx
[
n
0
+
(
i
+
1
)
L
N
s
−
1
]
]
,
\boldsymbol{z}(i) = \left[\begin{array}{c} s_\text{rx}[n_0+iLN_\text{s}] \\ s_\text{rx}[n_0+iLN_\text{s}+1] \\ \vdots \\ s_\text{rx}[n_0+(i+1)LN_\text{s}-1] \end{array}\right],
z(i)=
srx[n0+iLNs]srx[n0+iLNs+1]⋮srx[n0+(i+1)LNs−1]
, 其中,
i
i
i表示观测窗口起始位置在第
i
i
i个比特。虽然每个观测窗口对应一个比特周期,但是
z
(
i
)
\boldsymbol{z}(i)
z(i)是在不考虑比特同步的情况下获得的,每个观测窗口可能包含每个活跃用户的当前比特的末尾和下一个比特的开头。根据
s
k
\boldsymbol{s}_k
sk和延时采样点数量
q
k
q_k
qk可以定义两个向量
u
k
r
∈
R
L
N
s
×
1
\boldsymbol{u}_k^\text{r} \in \mathbb{R}^{LN_\text{s}\times 1}
ukr∈RLNs×1和
u
k
l
∈
R
L
N
s
×
1
\boldsymbol{u}_k^\text{l} \in \mathbb{R}^{LN_\text{s}\times 1}
ukl∈RLNs×1,其中
u
k
r
\boldsymbol{u}_k^\text{r}
ukr由
s
k
\boldsymbol{s}_k
sk的右半部分和补0组成,
u
k
r
\boldsymbol{u}_k^\text{r}
ukr表示为
u
k
r
=
{
0
L
N
s
×
1
,
q
k
=
0
[
s
[
L
N
s
−
q
k
]
,
⋯
,
s
[
L
N
s
−
1
]
,
0
,
⋯
,
0
]
T
,
1
≤
q
k
≤
L
N
s
−
1
,
\boldsymbol{u}_k^\text{r} = \left\{ \begin{array}{ll} \textbf{0}_{LN_\text{s}\times 1}, & q_k = 0 \\ \left[s[LN_\text{s}-q_k],\cdots,s[LN_\text{s}- 1],0,\cdots,0\right]^\text{T}, & 1\le q_k \le LN_\text{s} -1 \\ \end{array} \right. ,
ukr={0LNs×1,[s[LNs−qk],⋯,s[LNs−1],0,⋯,0]T,qk=01≤qk≤LNs−1,
u
k
l
\boldsymbol{u}_k^\text{l}
ukl由补0和
s
k
\boldsymbol{s}_k
sk的左半部分组成,
u
k
l
\boldsymbol{u}_k^\text{l}
ukl表示为
u
k
l
=
{
s
k
T
,
q
k
=
0
[
0
,
⋯
,
0
,
s
[
0
]
,
⋯
,
s
[
L
N
s
−
1
−
q
k
]
]
T
,
1
≤
q
k
≤
L
N
s
−
1
.
\boldsymbol{u}_k^\text{l} = \left\{ \begin{array}{ll} \boldsymbol{s}_k^\text{T},& q_k = 0 \\ \left[0,\cdots,0,s[0],\cdots,s[LN_\text{s}-1-q_k]\right]^\text{T}, & 1\le q_k \le LN_\text{s}-1 \\ \end{array} \right. .
ukl={skT,[0,⋯,0,s[0],⋯,s[LNs−1−qk]]T,qk=01≤qk≤LNs−1. 将观测向量
z
(
i
)
\boldsymbol{z}(i)
z(i)进一步表示为
z
(
i
)
=
∑
k
=
1
K
[
u
k
r
A
k
b
k
[
i
]
+
u
k
l
A
k
b
k
[
i
+
1
]
]
+
w
(
i
)
=
U
A
d
(
i
)
+
w
(
i
)
,
\begin{aligned} \boldsymbol{z}(i) & = \sum_{k=1}^{K}{\left[\boldsymbol{u}_k^\text{r}A_kb_k[i]+\boldsymbol{u}_k^\text{l}A_kb_k[i+1]\right]}+\boldsymbol{w}(i) \\ & = \boldsymbol{U}\!\boldsymbol{A}\boldsymbol{d}(i)+\boldsymbol{w}(i), \end{aligned}
z(i)=k=1∑K[ukrAkbk[i]+uklAkbk[i+1]]+w(i)=UAd(i)+w(i), 其中,
U
=
[
u
1
r
,
u
1
l
,
⋯
,
u
K
r
,
u
K
l
]
∈
R
L
N
s
×
2
K
\boldsymbol{U} = [\boldsymbol{u}_{1}^\text{r} , \boldsymbol{u}_{1}^\text{l} ,\cdots,\boldsymbol{u}_{K}^\text{r},\boldsymbol{u}_{K}^\text{l}] \in \mathbb{R}^{LN_\text{s}\times 2K}
U=[u1r,u1l,⋯,uKr,uKl]∈RLNs×2K,
A
=
diag
(
A
1
,
A
1
,
⋯
,
A
K
,
A
K
)
∈
R
2
K
×
2
K
\boldsymbol{A} = \text{diag}(A_1,A_1,\cdots,A_{K},A_{K}) \in \mathbb{R}^{2K\times 2K}
A=diag(A1,A1,⋯,AK,AK)∈R2K×2K,
d
(
i
)
=
[
b
1
[
i
]
,
b
1
[
i
+
1
]
,
⋯
,
b
K
[
i
]
,
b
K
[
i
+
1
]
]
T
∈
{
+
1
,
−
1
}
2
K
×
1
\boldsymbol{d}(i) = \left[b_1[i] , b_1[i+1], \cdots , b_{K}[i] , b_{K}[i+1] \right]^\text{T} \in \{+1,-1\}^{2K\times 1}
d(i)=[b1[i],b1[i+1],⋯,bK[i],bK[i+1]]T∈{+1,−1}2K×1,
w
(
i
)
=
[
w
[
n
0
+
i
L
N
s
]
,
⋯
,
w
[
n
0
+
(
i
+
1
)
L
N
s
−
1
]
]
T
∈
R
L
N
s
×
1
\boldsymbol{w}(i) = \left[w[n_0+iLN_\text{s}],\cdots,w[n_0+(i+1)LN_\text{s}-1]\right]^\text{T} \in \mathbb{R}^{LN_\text{s}\times 1}
w(i)=[w[n0+iLNs],⋯,w[n0+(i+1)LNs−1]]T∈RLNs×1是高斯白噪声向量。延时估计是利用观测向量
z
(
i
)
\boldsymbol{z}(i)
z(i)识别出发送信号的用户的扩频码并估计信号延时
q
k
q_k
qk。
假设每个用户发送独立同分布的信息比特,噪声与发送的信息无关,并且待估计参数在估计阶段保持不变。首先用多组观测向量
z
(
i
)
\boldsymbol{z}(i)
z(i)估计自相关矩阵
R
^
z
=
1
M
∑
i
=
0
M
−
1
z
(
i
)
z
T
(
i
)
,
\hat{\boldsymbol{R}}_\text{z} = \frac{1}{M}\sum_{i=0}^{M-1}{\boldsymbol{z}(i)\boldsymbol{z}^\text{T}(i)},
R^z=M1i=0∑M−1z(i)zT(i), 其中,
M
M
M是观测窗口数量,即快拍数。下一步对
R
^
z
\hat{\boldsymbol{R}}_\text{z}
R^z做特征值分解,并根据特征值大小将特征向量分成信号子空间和噪声子空间,表示为
R
^
z
=
[
V
^
s
,
V
^
n
]
[
Λ
^
s
0
0
Λ
^
n
]
[
V
^
s
T
V
^
n
T
]
=
V
^
s
Λ
^
s
V
^
s
T
+
V
^
n
Λ
^
n
V
^
n
T
.
\begin{aligned} \hat{\boldsymbol{R}}_\text{z} & = [\hat{\boldsymbol{V}}_\text{s},\hat{\boldsymbol{V}}_\text{n}] \left[\begin{array}{cc} {\hat{\boldsymbol{\Lambda}}}_\text{s} & \textbf{0} \\ \textbf{0} & {\hat{\boldsymbol{\Lambda}}}_\text{n} \end{array}\right] \left[\begin{array}{c} \hat{\boldsymbol{V}}_\text{s}^\text{T} \\ \hat{\boldsymbol{V}}_\text{n}^\text{T} \end{array}\right] \notag \\ & = \hat{\boldsymbol{V}}_\text{s}\hat{\boldsymbol{\Lambda}}_\text{s}\hat{\boldsymbol{V}}_\text{s}^\text{T}+\hat{\boldsymbol{V}}_\text{n}\hat{\boldsymbol{\Lambda}}_\text{n}\hat{\boldsymbol{V}}_\text{n}^\text{T}. \end{aligned}
R^z=[V^s,V^n][Λ^s00Λ^n][V^sTV^nT]=V^sΛ^sV^sT+V^nΛ^nV^nT. 由于信号是异步传输的,相当于每个用户的信号给相关矩阵
R
^
z
\hat{\boldsymbol{R}}_\text{z}
R^z贡献两个大特征值,因此
Λ
^
s
\hat{\boldsymbol{\Lambda}}_\text{s}
Λ^s的对角线元素包含
R
^
z
\hat{\boldsymbol{R}}_\text{z}
R^z的前
2
K
2K
2K个大特征值,
V
^
s
\hat{\boldsymbol{V}}_\text{s}
V^s的列向量张成信号子空间,记为
Span
(
V
^
s
)
\text{Span}(\hat{\boldsymbol{V}}_\text{s})
Span(V^s)。
第
k
k
k个用户的
u
k
r
\boldsymbol{u}_k^\text{r}
ukr和
u
k
l
\boldsymbol{u}_k^\text{l}
ukl都位于信号子空间
Span
(
V
^
s
)
\text{Span}(\hat{\boldsymbol{V}}_\text{s})
Span(V^s)中,那么
u
k
=
u
k
r
+
u
k
l
\boldsymbol{u}_k = \boldsymbol{u}_k^\text{r}+\boldsymbol{u}_k^\text{l}
uk=ukr+ukl也位于
Span
(
V
^
s
)
\text{Span}(\hat{\boldsymbol{V}}_\text{s})
Span(V^s)中。
u
k
\boldsymbol{u}_k
uk在
Span
(
V
^
s
)
\text{Span}(\hat{\boldsymbol{V}}_\text{s})
Span(V^s)上的投影表示为
f
(
u
k
)
=
(
u
k
T
V
^
s
)
(
u
k
T
V
^
s
)
T
=
∥
u
k
T
V
^
s
∥
2
.
f(\boldsymbol{u}_k)=(\boldsymbol{u}_k^\text{T}\hat{\boldsymbol{V}}_\text{s})(\boldsymbol{u}_k^\text{T}\hat{\boldsymbol{V}}_\text{s})^\text{T} = \|\boldsymbol{u}_k^\text{T}\hat{\boldsymbol{V}}_\text{s}\|^2.
f(uk)=(ukTV^s)(ukTV^s)T=∥ukTV^s∥2. 第
k
k
k个用户的延时的采样点数量
q
k
q_k
qk可以由下式获得
q
^
k
=
arg
max
q
k
∈
{
0
,
⋯
,
L
N
s
−
1
}
f
(
u
k
)
.
\hat{q}_k = \mathop{\arg\max}\limits_{q_k \in \{0,\cdots,LN_\text{s}-1\}}f(\boldsymbol{u}_k).
q^k=qk∈{0,⋯,LNs−1}argmaxf(uk). 上述最小化问题可以通过遍历
q
k
q_k
qk的所有可能值来找到最优值
q
^
k
\hat{q}_k
q^k来解决。 对于每个用户,上述方法需要
L
N
s
LN_\text{s}
LNs次搜索。第
k
k
k个用户的延时为
τ
^
k
=
q
^
k
T
s
\hat{\tau}_k = \hat{q}_kT_\text{s}
τ^k=q^kTs。
function [delay,sigma] = subspace_geo_channel_estimation(rec_data,ss_code,sf,M,L_bit,K,b,sps,isShape)
% Subspace-based channel estimation, geometric approach
% rec_data 接收信号
% ss_code 扩频码
% sf 扩频因子
% M 快拍数
% L_bit 信息比特数
% K 用户数
% b 成型滤波抽头系数
% sps 上采样率
% isShape 发射信号是否成型滤波 1 滤波, 0 不滤波
if M >= L_bit
M = L_bit-1;
end
y = zeros(sf*sps,M);
for m = 1:M
for l = 1:sf*sps
y(l,m) = rec_data(l+sf*sps*(m-1));
end
end
Ry = (y*y')./M;
[V,D] = eig(Ry);
[D,ind] = sort(diag(D),'descend'); % 特征值按由大到小排
V = V(:,ind);
V_S = V(:,1:2*K); % signal subspace
if isShape == 1 % 成型滤波
ss_code_upsample = upfirdn(ss_code',b,sps)';
ss_code_upsample = ss_code_upsample(:,round(length(b)/2)-round(sps/2)+1:round(length(b)/2)-round(sps/2)+sps*sf);
else
ss_code_upsample = rectpulse(ss_code',sps)';% 矩形成型
end
J = zeros(K,sf*sps);
for k = 1:K
for v = 0:sf*sps-1
a_r_0 = [ss_code_upsample(k,sf*sps+1-v:end),zeros(1,sf*sps-v)]';
a_l_0 = [zeros(1,v),ss_code_upsample(k,1:sf*sps-v)]';
a_r = a_r_0;
a_l = a_l_0;
J(k,v+1) = norm((a_r+a_l)'*V_S)^2;
end
end
[~,ind] = max(J,[],2);
v = ind-1;
delay = mod(v,sf*sps);
sigma = mean(D(2*K+1:end)); % 噪声方差
end
3、算法仿真
下面给一个仿真的顶层代码,遍历参数有快拍数、信噪比和信干比,感兴趣的读者可以试一下看看效果。
%% 仿真参数
date = '5_28';
if(~exist(['.\',date,'sim_dadta'],'dir'))
mkdir(['.\',date,'sim_data']);
end
K = 3; % 用户数
P = 10 ; % 上采样率 samples/chip
isShape = 1; %是否成型滤波 1 滤波, 0 不滤波
isDC = 0; % 接收机直流耦合 1 直流耦合, 0 交流耦合, 可以直流耦合接收,后面在代码里去直
Target_User = 1; % 目标用户
noise_power = 22:-2:8; % noise power dBW
target_user_power = 0; % AC power (variance) dBW
interference_user_power = [0,5,10,20]; % AC power (variance) dBW
Times = 20;
win_size = [20,25,30,35,40,50:25:200]; %快拍数
% 扩频码的PN序列多项式和初始值
ss_polynomial = [1 0 1 0 0 1; % z^5+z^3+1
1 1 1 1 0 1; % z^5+z^4+z^3+z^2+1
1 1 0 1 1 1]; % z^5+z^4+z^2+z^1+1
ss_init_state = [1 0 1 0 1;
1 0 1 0 1;
1 0 1 0 1];
if isShape == 1
shape = 'rcos_';
else
shape = [];
end
% 用户发送数据bit的PN序列多项式和初始值
bit_polynomial = [1,zeros(1,16),1,0,0,1; % z^20+z^3+1
1,zeros(1,10),1,zeros(1,3),1,0,1,0,0,1; % z^20+z^9+z^5+z^3+1
1,1,zeros(1,14),1,1,0,0,1];% z^20+z^19+z^4+z^3+1
bit_init_state = [repmat([1,0],1,10);
repmat([1,0],1,10);
repmat([1,0],1,10)];
L_ss = 2^(length(ss_polynomial)-1)-1; % length of spread spectrum pn sequence, spreading factor
L_bits = 300;
delay_array = 0:8:L_ss*P-1;
%% 生成发送数据
ss_code = zeros(K,L_ss);
user_bits = zeros(K,L_bits);
user_ss_data = zeros(K,L_bits*L_ss);
for k = 1:K
% 扩频码
ss_code(k,:) = 2*PnCode(ss_polynomial(k,:),ss_init_state(k,:))-1;
% 用户数据bit
user_bits_temp = 2*PnCode(bit_polynomial(k,:),bit_init_state(k,:))-1;
user_bits(k,:) = user_bits_temp(1:L_bits);
user_bits_upsample = rectpulse(user_bits(k,:),L_ss);
user_ss_data(k,:) = user_bits_upsample.*repmat(ss_code(k,:),1,L_bits);
end
% 上采样,成型滤波
if isShape == 1
sps = P; % upsample rate
span = 6;
rolloff = 0.5;
b = rcosdesign(rolloff,span,sps,'sqrt');% 设计根升余弦滤波器
user_ss_data = upfirdn(user_ss_data',b,sps)';% 成型滤波
else
b = 1;
sps = P;
user_ss_data = rectpulse(user_ss_data',sps)';% 矩形成型
end
if isDC == 1 % 光信号为正的实信号
user_ss_data = user_ss_data-min(user_ss_data,[],2);
end
user_ss_data = user_ss_data./vecnorm(user_ss_data,2,2); %能量归一化
user_ss_data = user_ss_data.*sqrt(length(user_ss_data));%功率归一化
clear user_bits_temp;
clear user_bits_upsample;
%% 接收
user_ss_data(Target_User,:) = user_ss_data(Target_User,:)*sqrt(10^(target_user_power/10));
L_data = length(user_ss_data);
L_sample = L_data+P*L_ss;
% 每行先固定一个snapshots遍历interference_user_power,再遍历snapshots
% 成功捕获时才计算rmse
acquisition_pro_corr = zeros(length(win_size)*length(interference_user_power),length(noise_power));
acquisition_rmse_corr = zeros(length(win_size)*length(interference_user_power),length(noise_power));
acquisition_pro_geo = zeros(length(win_size)*length(interference_user_power),length(noise_power));
acquisition_rmse_geo = zeros(length(win_size)*length(interference_user_power),length(noise_power));
for t = 1:Times
for n = 1:length(noise_power)
for d = 1:length(delay_array)
if isShape == 1 % 延时参考
delay_ref = round(length(b)/2)-round(sps/2)+[delay_array(d),0,0];
delay_ref = mod(delay_ref,sps*L_ss);
else
delay_ref = [delay_array(d),0,0];
end
send_data = zeros(K,L_sample);
send_data(Target_User,delay_array(d)+1:delay_array(d)+L_data) = user_ss_data(Target_User,:);
for p = 1:length(interference_user_power)
for k = 1:K
%模拟发送信号延时
if k~=Target_User
send_data(k,1:L_data) = user_ss_data(k,:).*sqrt(10^(interference_user_power(p)/10));
end
end
background_noise = wgn(1,L_sample,noise_power(n));% background noise
rec_data = sum(send_data,1)+background_noise;
if isDC == 1
rec_data = rec_data-mean(rec_data); % DC block
end
for m = 1:length(win_size)
M = win_size(m);
% sliding correlator
delay = corr_channel_estimation(rec_data,ss_code,L_ss,M,L_bits,K,b,sps,isShape);
if abs(delay(Target_User)-delay_ref(Target_User)) < P/2
acquisition_pro_corr((m-1)*length(interference_user_power)+p,n) = acquisition_pro_corr((m-1)*length(interference_user_power)+p,n)+1;
acquisition_rmse_corr((m-1)*length(interference_user_power)+p,n) = acquisition_rmse_corr((m-1)*length(interference_user_power)+p,n)+(delay(Target_User)-delay_ref(Target_User))^2;
end
% subspace-based geometric approach
[delay,~] = subspace_geo_channel_estimation(rec_data,ss_code,L_ss,M,L_bits,K,b,P,isShape);
if abs(delay(Target_User)-delay_ref(Target_User)) < P/2
acquisition_pro_geo((m-1)*length(interference_user_power)+p,n) = acquisition_pro_geo((m-1)*length(interference_user_power)+p,n)+1;
acquisition_rmse_geo((m-1)*length(interference_user_power)+p,n) = acquisition_rmse_geo((m-1)*length(interference_user_power)+p,n)+(delay(Target_User)-delay_ref(Target_User))^2;
end
end
end
end
end
end
acquisition_rmse_corr = sqrt(acquisition_rmse_corr./acquisition_pro_corr)./P;
acquisition_pro_corr = acquisition_pro_corr./(t*d);
acquisition_rmse_geo = sqrt(acquisition_rmse_geo1./acquisition_pro_geo1)./P;
acquisition_pro_geo = acquisition_pro_geo1./(t*d);
SNR = target_user_power-noise_power;
EbN0 = SNR-10*log10(1/L_ss)+10*log10(P/2);
MAI = interference_user_power-target_user_power; % near far ratio
save(['.\',date,'sim_data\',date,'sim_estimation_pro_rmse_avr'],'acquisition_pro_corr','acquisition_rmse_corr',...
'acquisition_pro_geo','acquisition_rmse_geo','SNR','EbN0','MAI','win_size');
function p=PnCode(polynomial,reg)
% PN码产生器函数
% polynomial的长度=reg的长度+1,polynomial的值不能为全0
% polynomial为本原多项式,从左到右依次为高位到低位,且最高位与最低位必须为1;低位表示延时一个周期,高位依次顺延
% reg为置寄存器初始值,也相当于PN码的初始相位,左边为高位,如[1 0 0 1 0]表示延时5个周期的寄器和2个周期的寄存器初值为1
% 如产生5级31位的PN码,则多项式形式为[1 * * * * 1]
% 例:5级PN码45E,参数为[1 0 0 1 0 1],左边为高位
% PN:0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0
grade=length(polynomial)-1;%根据多项式计算延时级数
PN_Length=(2^grade-1); %计算PN码一个周期的长度
%找出本原多项式中除最低位外为1的位,并依次存放在寄存器c中
%例如对于ploynomial=[1 0 0 1 0 1],则c(1)=2,c(2)=5
n=0;
c=zeros(1,grade);
for i=grade:-1:1
if polynomial(i)==1
n=n+1;
c(n)=grade+1-i;
end
end
p = zeros(1,PN_Length);
for i=1:PN_Length %从最高延时的寄存器中输出PN码
p(i)=reg(1);
m = mod(reg*polynomial(1:grade)',2);%完成各抽头寄存器取值的模2加
reg(1:(grade-1)) = reg(2:grade);%寄存器的值依次移位
reg(grade)=m;
end
代码有点多,可能有的函数没贴上来,缺代码的话请留言、私信或者点此下载未删减的全套代码。
捕获概率定义为估计的延时与实际延时的误差小于半个码片周期的概率
P
(
∣
τ
k
−
τ
^
k
∣
<
T
c
2
)
,
P\left(\left|\tau_k-\hat{\tau}_k\right|<\frac{T_\text{c}}{2}\right),
P(∣τk−τ^k∣<2Tc), 其中,
τ
k
\tau_k
τk表示实际延时,
τ
^
k
\hat{\tau}_k
τ^k表示估计的延时。这里给一个信噪比为
−
4
-4
−4 dB,用户2与用户1的功率比为
20
20
20 dB时,用户1的捕获概率随快拍数变化的仿真结果,如下图所示。
滑动相关法的捕获概率一直很差。这是因为受MAI和远近效应的影响,滑动相关法极有可能将互相关峰出现的位置作为延时位置。基于子空间的延时估计算法能克服MAI带来的负面影响,它的捕获概率随快拍数的增加而增大,并且在快拍数为
75
75
75时达到
100
%
100\%
100%的捕获概率。