基于CDMA的多用户水下无线光通信(2)——系统模型和基于子空间的延时估计

  本文首先介绍了基于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(tiTb)+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=1Ki=Akbk[i]sk[niLNsqk]+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,,LNs1}中取值。

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[LNs1]]. 假设用持续 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,,LNs1}argmaxi=0M1skr(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)LNs1] 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_bitM = L_bit-1;
end
if isShape == 1ss_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);
elsess_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:Kfor n = 1:M*sps*sfcorr(n) = rec_data(n:n+sps*sf-1)*ss_code_upsample(k,:)';endcorr_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)LNs1] , 其中, 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} ukrRLNs×1 u k l ∈ R L N s × 1 \boldsymbol{u}_k^\text{l} \in \mathbb{R}^{LN_\text{s}\times 1} uklRLNs×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[LNsqk],,s[LNs1],0,,0]T,qk=01qkLNs1, 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[LNs1qk]]T,qk=01qkLNs1. 将观测向量 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=1K[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)LNs1]]TRLNs×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=0M1z(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^s2. 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,,LNs1}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_bitM = L_bit-1;
end
y = zeros(sf*sps,M);
for m = 1:Mfor l = 1:sf*spsy(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);
elsess_code_upsample = rectpulse(ss_code',sps)';% 矩形成型
end
J = zeros(K,sf*sps);
for k = 1:K  for v = 0:sf*sps-1a_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+11 1 1 1 0 1;    % z^5+z^4+z^3+z^2+11 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 == 1shape = 'rcos_';
elseshape = [];
end
% 用户发送数据bit的PN序列多项式和初始值
bit_polynomial = [1,zeros(1,16),1,0,0,1; % z^20+z^3+11,zeros(1,10),1,zeros(1,3),1,0,1,0,0,1; % z^20+z^9+z^5+z^3+11,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;% 用户数据bituser_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 == 1sps = P; % upsample ratespan = 6;rolloff = 0.5;b = rcosdesign(rolloff,span,sps,'sqrt');% 设计根升余弦滤波器user_ss_data = upfirdn(user_ss_data',b,sps)';% 成型滤波
elseb = 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:Timesfor 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);elsedelay_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_Usersend_data(k,1:L_data) = user_ss_data(k,:).*sqrt(10^(interference_user_power(p)/10));endendbackground_noise = wgn(1,L_sample,noise_power(n));% background noiserec_data = sum(send_data,1)+background_noise;if isDC == 1rec_data = rec_data-mean(rec_data); % DC blockendfor m = 1:length(win_size)M = win_size(m);% sliding correlatordelay = 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/2acquisition_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/2acquisition_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;endendendendend
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:1if polynomial(i)==1n=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%的捕获概率。

参考文献

[1] PICKHOLTZ R, SCHILLING D, MILSTEIN L. Theory of spread-spectrum communications-a tutorial[J]. IEEE Transactions on Communications, 1982, 30(5): 855-884.
[2] BENSLEY S E, AAZHANG B. Subspace-based channel estimation for code division multiple access communication systems[J]. IEEE Transactions on Communications, 1996, 44(8):1009-1020.
[3] STROM E G, PARKVALL S, MILLER S L, et al. Propagation delay estimation in asynchronous direct-sequence code-division multiple access systems[J]. IEEE Transactions on Communications, 1996, 44(1):84-93.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/357850.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux进程】进程的 切换 与 调度(图形化解析,小白一看就懂!!!)

目录 &#x1f525;前言&#x1f525; &#x1f4a7;进程切换&#x1f4a7; &#x1f4a7;进程调度&#x1f4a7; &#x1f525;总结与提炼&#x1f525; &#x1f525;共勉&#x1f525; &#x1f525;前言&#x1f525; 在 Linux 操作系统中&#xff0c;进程的 调度 与 …

【STM32-新建工程-寄存器版本】

STM32-新建工程-寄存器版本 ■ 下载相关STM32Cube官方固件包&#xff08;F1&#xff0c;F4&#xff0c;F7&#xff0c;H7&#xff09;■ 1. ST官方搜索STM32Cube■ 2. 搜索 STM32Cube■ 3. 点击获取软件■ 4. 选择对应的版本下载■ 5. 输入账号信息■ 6. 出现下载弹框&#xff…

React@16.x(34)动画(中)

目录 3&#xff0c;SwitchTransition3.1&#xff0c;原理3.1.2&#xff0c;key3.1.2&#xff0c;mode 3.2&#xff0c;举例3.3&#xff0c;结合 animate.css 4&#xff0c;TransitionGroup4.1&#xff0c;其他属性4.1.2&#xff0c;appear4.1.2&#xff0c;component4.1.3&…

MFC学习--CListCtrl复选框以及选择

如何展示复选框 //LVS_EX_CHECKBOXES每一行的最前面带个复选框//LVS_EX_FULLROWSELECT整行选中//LVS_EX_GRIDLINES网格线//LVS_EX_HEADERDRAGDROP列表头可以拖动m_listctl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES); 全选&#xff0c;全…

如何获得一个Oracle 23ai数据库(vagrant box)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 前面我博客介绍了3种方法&#xff1a; Virtual ApplianceRPM安装Docker 今天介绍最近新出的一种方法&#xff0c;也是我最为推荐的…

探索CSS clip-path: polygon():塑造元素的无限可能

在CSS的世界里&#xff0c;clip-path 属性赋予了开发者前所未有的能力&#xff0c;让他们能够以非传统的方式裁剪页面元素&#xff0c;创造出独特的视觉效果。其中&#xff0c;polygon() 函数尤其强大&#xff0c;它允许你使用多边形来定义裁剪区域的形状&#xff0c;从而实现各…

定时器-前端使用定时器3s轮询状态接口,2min为接口超时

背景 众所周知&#xff0c;后端是处理不了复杂的任务的&#xff0c;所以经过人家的技术讨论之后&#xff0c;把业务放在前端来实现。记录一下这次的离大谱需求吧。 如图所示&#xff0c;这个页面有5个列表&#xff0c;默认加载计划列表。但是由于后端的种种原因&#xff0c;这…

【C#】使用数字和时间方法ToString()格式化输出字符串显示

在C#编程项目开发中&#xff0c;几乎所有对象都有格式化字符串方法&#xff0c;其中常见的是数字和时间的格式化输出多少不一样&#xff0c;按实际需要而定吧&#xff0c;现记录如下&#xff0c;以后会用得上。 文章目录 数字格式化时间格式化 数字格式化 例如&#xff0c;保留…

WPF三方UI库全局应用MessageBox样式(.NET6版本)

一、问题场景 使用HandyControl简写HC 作为基础UI组件库时&#xff0c;希望系统中所有的MessageBox 样式都使用HC的MessageBox&#xff0c;常规操作如下&#xff1a; 在对应的xxxx.cs 顶部使用using 指定特定类的命名空间。 using MessageBox HandyControl.Controls.Message…

快去复习吧+++常用算法及参考算法 递推法++穷举法++排序(冒泡、选择)++查找(顺序、折半)++字符串处理++方程求根++无穷级数求和

接上&#xff1a;常用算法及参考算法 &#xff08;1&#xff09;累加 &#xff08;2&#xff09;累乘 &#xff08;3&#xff09;素数 &#xff08;4&#xff09;最大公约数 &#xff08;5&#xff09;最值问题 &#xff08;6&#xff09;迭代法 常用算法及参考算法 7. 递推法…

【LocalAI】(13):LocalAI最新版本支持Stable diffusion 3,20亿参数图像更加细腻了,可以继续研究下

最新版本v2.17.1 https://github.com/mudler/LocalAI/releases Stable diffusion 3 You can use Stable diffusion 3 by installing the model in the gallery (stable-diffusion-3-medium) or by placing this YAML file in the model folder: Stable Diffusion 3 Medium 正…

Git使用过程中涉及的几个区域

一. 简介 Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理&#xff0c;也是 Linus Torvalds 为了帮助管理 Linux内核开发而开发的一个开放源码的版本控制软件。 本文简单了解一下 git涉及的几个部分&#xff0c;以及git 常…

Django 模版过滤器

Django模版过滤器是一个非常有用的功能&#xff0c;它允许我们在模版中处理数据。过滤器看起来像这样&#xff1a;{{ name|lower }}&#xff0c;这将把变量name的值转换为小写。 1&#xff0c;创建应用 python manage.py startapp app5 2&#xff0c;注册应用 Test/Test/sett…

安卓中使用ttf字体文件

官方文档中提供的方法要设备能访问google&#xff1f; 官方方法 直接下载字体的fft文件 我要使用的是lexend 需要的格式可以在里面搜索 使用下载的ttf文件 解压出来 可以单独使用static里面的&#xff0c;里面是直接的lexend的各种格式 但是我这里直接使用Lexend-Vari…

IDEA Plugins中搜索不到插件解决办法

IDEA中搜不到插件有三种解决方案&#xff1a; 设置HTTP选项&#xff0c;可以通过File->Settings->Plugins->⚙->HTTP Proxy Settings进行设置 具体可参考这篇博文&#xff1a;IDEA Plugins中搜索不到插件解决办法本地安装&#xff0c;ile->Settings->Plugin…

【python】python股票量化交易策略分析可视化(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【Leetcode】520. 检测大写字母

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517;我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; 全部字母都是大写&#xff0c;比如 “USA” 。单词中所有字母都不是大写&#xff0c;比如 “le…

【科普】半导体制造过程的步骤、技术、流程

在这篇文章中&#xff0c;我们将学习基本的半导体制造过程。为了将晶圆转化为半导体芯片&#xff0c;它需要经历一系列复杂的制造过程&#xff0c;包括氧化、光刻、刻蚀、沉积、离子注入、金属布线、电气检测和封装等。 基本的半导体制造过程 1.晶圆&#xff08;Wafer&#xf…

LabVIEW电池管理系统测试平台

随着混合动力汽车技术的快速发展&#xff0c;对电池管理系统&#xff08;BMS&#xff09;的测试需求显著增加。利用LabVIEW软件开发了一款电池管理系统测试平台&#xff0c;通过模拟电池行为验证BMS的控制策略&#xff0c;从而降低成本、缩短开发周期&#xff0c;并提高整车的能…