基于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.mzph.cn/web/32914.shtml

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

相关文章

matplotlib之savefig函数

savefig函数 Matplotlib中&#xff0c;savefig函数用于保存图形为文件。通过该函数&#xff0c;你可以将绘制的图形保存为常见的图像文件格式&#xff0c;如PNG、JPEG、SVG等。 matplotlib.pyplot.savefig(fname, dpiNone, bbox_inchestight, pad_inches0.1, formatNone, tra…

分类接口开发

文章目录 1.查询所有一级分类1.sun-club-application-controller 控制层1.SubjectCategoryController.java 定义基础的queryPrimaryCategory&#xff0c;调用领域层 2.sun-club-domain 领域层1.SubjectCategoryDomainService.java2.SubjectCategoryConverter.java3.SubjectCate…

Python 算法交易实验72 QTV200第一步: 获取原始数据并存入队列

说明 最近的数据流往前进了一步&#xff0c;我觉得基本可以开始同步的推进QTV200了。上次规划了整体的数据流&#xff0c;现在开始第一步。 内容 1 结构位置 这是上次的总体图&#xff1a; 以下是这次要实现的一小部分&#xff1a; 从结构上&#xff0c;这个是整体数据流的…

力扣-接雨水

文章目录 概要题解解释代码比较左右高度处理右侧为什么双指针法有效 概要 原题链接&#xff1a;接雨水 题解 思路&#xff1a;双指针 核心思想&#xff1a;对于任意位置 i&#xff0c;能够存储的雨水量取决于位置 i 左侧和右侧的最大高度中的较小值减去 height[i]。即 min(le…

使用MySQL WorkBbench 连接远程服务器上的mysql教程(包含踩过的坑)

最近在学习MySQL&#xff0c;想要装一个可视化程序&#xff0c;但是希望把脏活累活留给服务器&#xff0c;于是自己电脑上安装了一个MySQL Workbench作为Client。下面记录一下配置的过程。 服务器端MySQL配置 安装MySQL这里就不赘述啦&#xff0c;可以参考 https://segmentfa…

路经总和-二叉树题

112. 路径总和 - 力扣&#xff08;LeetCode&#xff09; 1、用队列 两个队列&#xff0c;先进先出 node队列存节点&#xff1b; sum队列存每条路径走到这个节点的val的总和&#xff1b; 节点和总和对应着同时存入队列&#xff0c;同时出队列&#xff1b; class Solution …

springboot+vue+mybatis旅游管理+PPT+论文+讲解+售后

随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.旅游管理系统将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本文以jsp…

压力测试Monkey命令参数和报告分析

目录 常用参数 -p <测试的包名列表> -v 显示日志详细程度 -s 伪随机数生成器的种子值 --throttle < 毫秒> --ignore-crashes 忽略崩溃 --ignore-timeouts 忽略超时 --monitor-native-crashes 监视本地崩溃代码 --ignore-security-exceptions 忽略安全异常 …

如何使用ig507金融数据库的股票接口,股票API来获取MACD指标

一、MACD指标简介 MACD&#xff08;Moving Average Convergence Divergence&#xff0c;移动平均收敛/发散&#xff09;是一种趋势跟踪动量指标&#xff0c;用于分析股票或其他金融产品的价格趋势。MACD由两部分组成&#xff1a;差离值&#xff08;DIF&#xff09;和信号线&am…

借助ChatGPT降低学术论文重复率,使用技巧全攻略,实用有效,快速上手

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。可以&#xff08;yida985&#xff09;交流学术写作或ChatGPT等AI领域相关问题&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步。 经常有学术同…

Python编程技巧:如何正确使用with语句(Python中with用法详解)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 基本语法📝 处理文件📝 处理网络连接📝 管理线程锁📝 管理数据库连接📝 管理临时目录和文件📝 使用上下文装饰器📝 自定义上下文管理器🎯 示例1🎯 示例2📝 使用多个上下文管理器📝 上下…

Visual Studio开发环境搭建

原文&#xff1a;https://blog.c12th.cn/archives/25.html Visual Studio开发环境搭建 测试&#xff1a;笔记本原装操作系统&#xff1a;Windows 10 家庭中文版 资源分享链接&#xff1a;提取码&#xff1a;qbt2 注意事项&#xff1a;注意查看本地硬盘是否够用&#xff0c;建议…

UE5开发游戏Tutorial

文章目录 PlayerStart 初始化设置默认 LevelBP_Character 初始化BP_Character 添加动画BP_Character 攻击BP_Enemy 初始化 以及 AI 运动Camera Collision 相机碰撞BP_Character 生命以及伤害Wave Spawner 波生成UI 初始化以及 Damage Screen指定位置随机生成添加声音环境 Envir…

茴香豆的使用

RAG RAG 模型的核心在于两大部分&#xff1a;检索器&#xff08;Retriever&#xff09;和生成器&#xff08;Generator&#xff09;。检索器的作用是从一个庞大的数据集中&#xff0c;根据输入的问题或者提示&#xff0c;快速有效地检索出最相关的信息或文档。这一步骤通常利用…

【算法专题--链表】两两交换链表中的节点 -- 高频面试题(图文详解,小白一看就懂!!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双指针 -- 采用哨兵位头节点 &#x1f95d; 什么是哨兵位头节点&#xff1f; &#x1f34d; 解题思路 &#x1f34d; 案例图解 四、总结与提炼 五、共勉 一、前言 两两交换链表中的节点 这道题&#xff0c;可以说…

【LLM之KG】CoK论文阅读笔记

研究背景 大规模语言模型&#xff08;LLMs&#xff09;在许多自然语言处理&#xff08;NLP&#xff09;任务中取得了显著进展&#xff0c;特别是在零样本/少样本学习&#xff08;In-Context Learning, ICL&#xff09;方面。ICL不需要更新模型参数&#xff0c;只需利用几个标注…

网站监控定时计划任务

网站监控是一种保护网站安全和稳定性的重要手段&#xff0c;而定时计划任务则是网站监控的一种常见方法。通过设置定时计划任务&#xff0c;可以定期对网站进行监测和检测&#xff0c;及时发现并解决潜在的问题&#xff0c;从而保障网站的正常运行。 首先&#xff0c;网站监控定…

卧槽,6。套死你猴子,Tomcat访问html页面显示源码?

卧槽&#xff0c;6。Tomcat访问html页面显示源码&#xff1f; 元凶text/explain //踩坑&#xff01;&#xff01;&#xff01;不能用 servletResponse.setContentType("text/explain&#xff0c;否则访问html会看到源码&#xff0c;而不是渲染页面; charsetUTF-8"…

通过ESP32读取I2C温湿度传感器项目:协议与代码实例

简介 在本项目中&#xff0c;我们将使用ESP32开发板读取I2C温湿度传感器的数据。我们将详细介绍I2C协议&#xff0c;并提供图文并茂的代码实例&#xff0c;帮助你快速上手。 项目流程 选择硬件&#xff1a;ESP32开发板、I2C温湿度传感器&#xff08;如DHT12、HTU21D、SHT30等&a…

硬盘数据恢复软件,推荐5种适合你的方法来恢复硬盘数据

硬盘数据恢复软件&#xff0c;作为解决数据丢失问题的关键工具&#xff0c;帮助用户在重要文件丢失时迅速找回数据。本教程介绍5种恢复实用硬盘数据方法&#xff0c;适应不同类型和严重程度的数据损坏情况。 文章摘要&#xff1a; 一. 硬盘数据恢复软件 二. 数据恢复原理 三. …