第10章(1)内容如下:
最近搞懂了Gardner环路的一些知识,于是更新第10章——位同步。
如果你稍不留意的话,这可能是你在网上能看到的介绍Gardner环路及其MATLAB仿真最详细的一篇文章了。
一、位同步与载波同步的区别
在第4章,我介绍了载波同步与锁相环的概念,里面关于锁相环的知识也是本篇文章的基础。
载波同步是相干解调的基础,不管对于模拟通信还是数字通信来说,只要是相干解调,接收端都必须提供同频同相的载波。
当然,若采用基带传输,此时便没有载波同步的问题,因为没有频带调制,即没有乘以载波进行频谱搬移的过程。
位同步,也叫符号同步、定时同步、码元同步,只有数字通信才需要,数字通信中不管是基带传输还是频带传输都需要。
这是因为数字通信中,是用波形中的几个采样点去代替一个符号,在接收端只需要对这些采样点中的一个进行判决,便可以恢复出这个符号。
实际通信中,由于信道的传输时延,接收两端的时钟偏移,接收端无法找到符号的最佳时刻来对其进行采样判决,这便使得接收端恢复出的数据与发送端的数据有误差。
接收端若想在最佳采样时刻恢复发送端的数据,便要使得接收时钟与发送时钟同步,因此接收端要采取措施来调整接收端的采样时钟,这个同步的过程便定义为位同步。
那么载波同步偏差与位同步偏差,对通信性能有什么样的影响呢?
看到《数字通信理论与系统》第6章中载波同步偏差与位同步偏差的影响。(《数字通信与系统的》的PPT链接是:孙永军 | 课程教学 | 西安电子科技大学个人主页
《MIMO-OFDM无线通信技术及其MATLAB实现》第5章《OFDM同步技术》中介绍:采样时钟的偏差包括相位偏差和频率偏差。
1、采样时钟相位偏差的影响
当发射机和接收机的采样速率或频率完全一致时,会发生相位误差。即接收机知道隔多长采一个点,但是接收机不知道从什么时候开始采。(这句话好好理解一下)
换句话说,接收机的采样时刻与最佳的采样时刻一直有固定的相位差,相位偏差导致频域的相位旋转,且相位旋转的多少与子载波编号k成正比。
(在《第8章:OFDM同步技术(1)——符号定时偏差》中介绍过STO的影响,如下图:
采样时钟对相位偏差的影响通常较小,所以仅把它当做STO的一部分,不需要额外的补偿器。
2、采样时钟频率偏差的影响
其中多普勒偏差对采样的影响,可以参考:《问答交流4:多普勒效应对通信的影响》
二、Gardner环路算法与插值方法
上面的介绍,你明白了位同步是什么,以及未完成位同步会对通信带去什么影响,那我们通过什么样的技术去达到位同步呢?
位同步技术主要分为两种:
(1)传统锁相环技术:利用反馈控制原理改变时钟的频率和相位去是实现符号同步的调整。原理简单,但存在本地时钟频率要求较高、不适合宽速率范围的基带码元同步等不足。
这个技术,我还没试验过,之后若有机会搞懂再写文章介绍。
(2)插值算法位同步技术:不需要改变本地时钟便可实现位同步时刻的调整,直接内插出最佳采样点的相位与值。
讲到插值插值算法位同步技术,便忍不住要提到Gardner的三篇论文:
1、《Interpolation in Digital Modems-Part I: Fundamentals 》
2、《Interpolation in Digital Modems-Part II: Implementation and Performance 》
3、《A BPSK/QPSK Timing-Error Detector for Sampled Receivers 》
图1:来自IEEE论文《Interpolation in Digital Modems-Part I: Fundamentals》
图2:来自杜勇的《数字通信同步技术的MATLAB与FPGA实现》第8.1节
图3:来自知网论文付永明、朱江的《Gardner 定时同步环路参数设计及性能分析 》
同时列出三张图,是帮助你互相对照着看,也方便接下来对各个模块的功能与设计进行分别介绍。
1、插值滤波器
图4:来自IEEE论文《Interpolation in Digital Modems-Part I: Fundamentals》
内插器就是根据定时控制器的输出来对数据速率进行转换。
假设接收端的固定采样时钟频率是 T s {{T_s}} Ts,对 y ( t ) y\left( t \right) y(t)在 t = k T i t = k{T_i} t=kTi的时刻进行再采样(resample),其中 T i {T_i} Ti是内插周期,它与符号周期是同步的。
一般情况下, T i T s \frac{{{T_i}}}{{{T_s}}} TsTi不为整数,经过再采样后的数据为 y ( k T i ) y\left( {k{T_i}} \right) y(kTi),根据上图则有
y ( k T i ) = ∑ m x ( m T s ) h I ( k T i − m T s ) y\left( {k{T_i}} \right) = \sum\limits_m {x\left( {m{T_s}} \right){h_I}} \left( {k{T_i} - m{T_s}} \right) y(kTi)=m∑x(mTs)hI(kTi−mTs)
关键问题就是要找到到采样时刻 T i {{T_i}} Ti和滤波器 h I ( t ) {h_I}\left( t \right) hI(t)的表达式。
令m是输入信号索引(signal index),滤波器下标索引是 i = i n t [ k T i / T s ] − m i = {\mathop{\rm int}} \left[ {k{T_i}/{T_s}} \right] - m i=int[kTi/Ts]−m,其中[z]表示不大于z的最大整数。
定义基本索引(basepoint index)为 m k = i n t [ k T i / T s ] {m_k} = {\mathop{\rm int}} \left[ {k{T_i}/{T_s}} \right] mk=int[kTi/Ts],分数间隔(fractional inteval)为 μ k = k T i / T s − m k {\mu _k} = k{T_i}/{T_s} - {m_k} μk=kTi/Ts−mk。
结合上图不难发现, 0 ≤ μ k < 1 0 \le {\mu _k} < 1 0≤μk<1,上面的内插公式可以重写为:
y ( k T i ) = ∑ i = N 1 N 2 x [ ( m k − i ) T s ] h I [ ( i + μ k ) T s ] y\left( {k{T_i}} \right) = \sum\limits_{i = {N_1}}^{{N_2}} {x\left[ {\left( {{m_k} - i} \right){T_s}} \right]} {h_I}\left[ {\left( {i + {\mu _k}} \right){T_s}} \right] y(kTi)=i=N1∑N2x[(mk−i)Ts]hI[(i+μk)Ts]
你可能会好奇了,引入 m k {m_k} mk和 μ k {\mu _k} μk有什么作用?
(1)在哪插入: m k {m_k} mk与 μ k {\mu _k} μk共同决定了 k T i {k{T_i}} kTi的位置,且 μ k {\mu _k} μk可以调整;
(2)计算值:确定 m k {m_k} mk后,将决定用 m k {m_k} mk附近的几个点去计算插入位置的值。
上面用插值滤波器这个名词来表示内插器,但是在这里不需要考虑内插器的滤波性特性,更重要的是得到内插器的结构及相应的系数,以计算出内插位置的值。
常用的内插器算法有Farrow算法、Cubic算法。顺便复习下前面的《第7章:OFDM 信道估计与均衡(4)》,里面也讲了插值算法。
其中,Farrow算法的结构图如下:
2、Gardner误差检查算法
Gardner定时误差算法通常用在BPSK、QPSK信号,通过改进可以应用在QAM等多进制基带信号中。(在QAM中的应用,我目前还没试过,可以参考杜勇的《数字调制解调技术的MATLAB与FPGA实现——Xilinx/VHDL版》一书)
Gardner定时误差算法,该算法的一个特点是每个符号只需要使用两个采样点,一个是strobe点,即最佳观察点,另外一个是midstrobe点,即两个观察点之间的采样点。
对应到上图来说,即strobe点是图中的采样点y(n-1)和y(n),midstrobe点是中间采样点y(n-1/2)。
误差产生公式是: μ t ( k ) = y I ( k − 1 / 2 ) [ y I ( k ) − y I ( k − 1 ) ] + y Q ( k − 1 / 2 ) [ y Q ( k ) − y Q ( k − 1 ) ] \mu_{\mathrm{t}}(k)=y_{\mathrm{I}}(k-1 / 2)\left[y_{\mathrm{I}}(k)-y_{\mathrm{I}}(k-1)\right]+y_{\mathrm{Q}}(k-1 / 2)\left[y_{\mathrm{Q}}(k)-y_{\mathrm{Q}}(k-1)\right] μt(k)=yI(k−1/2)[yI(k)−yI(k−1)]+yQ(k−1/2)[yQ(k)−yQ(k−1)]
根据上面的这个公式,可以分为以下几种情况:
(1)假设没有定时误差,则 y I ( k − 1 2 ) {y_I}\left( {k - \frac{1}{2}} \right) yI(k−21)与 y Q ( k − 1 2 ) {y_Q}\left( {k - \frac{1}{2}} \right) yQ(k−21)为0,那么 u t ( k ) {u_t}\left( k \right) ut(k)为0;
(2)假设有定时误差,但是由于中间点的斜率可正可负,只靠中间值是不能够提供足够多的信息的。
第(2)句话怎么去理解呢?我来举例子说明。
比如现在知道 y ( n − 1 2 ) > 0 y\left( {n - \frac{1}{2}} \right) > 0 y(n−21)>0,那么会有两种情况:
(1) y ( n − 1 ) > 0 y\left( {n - 1} \right) > 0 y(n−1)>0, y ( n ) < 0 y\left( n \right) < 0 y(n)<0
(2) y ( n − 1 ) < 0 y\left( {n - 1} \right) < 0 y(n−1)<0, y ( n ) > 0 y\left( n \right) > 0 y(n)>0
因此误差表达公式需要借助 y ( n − 1 ) − y ( n ) y\left( {n - 1} \right) - y\left( n \right) y(n−1)−y(n)这一项,对定时误差做进一步判断。
有时候为了减少乘法器的使用,不采用实际峰值,而是使用峰值的符号,这会给系统带来一定的系统损失。
若采用峰值符号值去代替峰值后,则定时误差公式则表达为:
μ t ( k ) = y I ( k − 1 2 ) [ s g n ( y I ( k ) ) − s g n ( y I ( k − 1 ) ) ] + y Q ( k − 1 2 ) [ s g n ( y Q ( k ) ) − s g n ( y Q ( k − 1 ) ) ] {\mu _t}\left( k \right) = {y_I}\left( {k - \frac{1}{2}} \right)\left[ {{\mathop{\rm sgn}} \left( {{y_I}\left( k \right)} \right) - {\mathop{\rm sgn}} \left( {{y_I}\left( {k - 1} \right)} \right)} \right] + {y_Q}\left( {k - \frac{1}{2}} \right)\left[ {{\mathop{\rm sgn}} \left( {{y_Q}\left( k \right)} \right) - {\mathop{\rm sgn}} \left( {{y_Q}\left( {k - 1} \right)} \right)} \right] μt(k)=yI(k−21)[sgn(yI(k))−sgn(yI(k−1))]+yQ(k−21)[sgn(yQ(k))−sgn(yQ(k−1))]
当信息中含有长串的连0或者连1符号时,接收端是否无法获取定时信息?结合上面的图便不难理解。
因此,采用Gardner算法时,如果数据符号位存在多位连续相同的情况下,效果便可能不好。
所以仿真的时候,可以采用10101010交替的特殊序列,用来寻找位定时。
除此之外,Gardner算法可以在具有小的载波频差的前提下正常运行,具有与频率误差无关的特性,因此可以在多普勒频移( Δ f d o p p e r ≤ R s / 4 \Delta {f_{dopper}} \le {R_s}/4 Δfdopper≤Rs/4, R s {R_s} Rs是符号速率)条件下完成符号同步。(这个结论的证明可以参考知网论文蔡凡的《卫星定时接收机的关键技术研究》)
三、Gardner环路中环路滤波器与数字振荡器设计
1、环路滤波器
在《第4章:载波同步与锁相环仿真(1)》中介绍了环路滤波器的结构图,以及关键参数 C 1 {C_1} C1和 C 2 {C_2} C2的计算,位同步环路中所使用的环路滤波器与锁相环中的环路滤波器相同,均采用理想积分滤波器。
假设输入的定时误差timing error,简称te(k),output是w(k+1)。此时有两个问题摆在你的面前:
(1)输入te(k)和输出w(k+1)是什么含义呢?
(2)为什么w会比te的计数要大一呢?
你先思考一下,我在后面会做相应的解释。先由上面这个图可以得到:
t e ( k ) [ C 1 + C 2 1 1 − Z − 1 ] = w ( k + 1 ) te\left( k \right)\left[ {{C_1} + {C_2}\frac{1}{{1 - {Z^{ - 1}}}}} \right] = w\left( {k + 1} \right) te(k)[C1+C21−Z−11]=w(k+1)
化简得到:
w ( k + 1 ) = w ( k ) + C 1 [ t e ( k ) − t e ( k − 1 ) ] + C 2 t e ( k ) w\left( {k + 1} \right) = w\left( k \right) + {C_1}\left[ {te\left( k \right) - te\left( {k - 1} \right)} \right] + {C_2}te\left( k \right) w(k+1)=w(k)+C1[te(k)−te(k−1)]+C2te(k)
这个公式便对应下面这段代码:
%环路滤波器,每个数据符号计算一次环路滤波器输出
if(ms>1)
w(ms+1)=w(ms)+c1*(time_error(ms)-time_error(ms-1))+c2*time_error(ms);
else
w(ms+1)=w(ms)+c1*time_error(ms)+c2*time_error(ms);
end
ms=ms+1;
2、数控振荡器(NCO)
在锁相环中的数控振荡器(NCO)是一个相位累加器,而在位同步环路中的振荡器(NCO)是一个相位递减器,差分方程为:
η ( m + 1 ) = [ η ( m ) − w ( m ) ] m o d 1 \eta \left( {m + 1} \right) = \left[ {\eta \left( m \right) - w\left( m \right)} \right]\bmod 1 η(m+1)=[η(m)−w(m)]mod1
至于这个公式是怎么证明得到的,可以参考Gardner的《Interpolation in Digital
Modems——Part I: Fundamentals 》
η ( m ) {\eta \left( m \right)} η(m)是第m个工作时钟的NCO寄存器的内容,w(m)是NCO的控制字,两者都是正小数。
注意到NCO的工作周期是Ts,而内插器的周期是Ti,w(m)是环路滤波器的输出,进而对NCO控制,使得NCO能在最佳采样时刻溢出。
当环路达到平衡时,w(m)近似是一个常数,此时平均1/w(m)个周期Ts,NCO就会溢出一次。所以得到: w ( m ) ≈ T s T i w\left( m \right) \approx \frac{{{T_s}}}{{{T_i}}} w(m)≈TiTs
顺便对mod函数进行说明,也可在MATLAB命令行中敲入help mod进行学习。比如mod(1.3,1)=0.3,mod(-0.3,1)=0.7
此图来自来自IEEE论文《Interpolation in Digital Modems-Part I: Fundamentals》
从上图中,可得到
μ k T s η ( m k ) = ( 1 − μ k ) T s 1 − η ( m k + 1 ) \frac{\mu_{k} T_{s}}{\eta\left(m_{k}\right)}=\frac{\left(1-\mu_{k}\right) T_{s}}{1-\eta\left(m_{k}+1\right)} η(mk)μkTs=1−η(mk+1)(1−μk)Ts
整理得到:
μ k = η ( m k ) 1 − η ( m k + 1 ) + η ( m k ) = η ( m k ) W ( m k ) \mu_{k}=\frac{\eta\left(m_{k}\right)}{1-\eta\left(m_{k}+1\right)+\eta\left(m_{k}\right)}=\frac{\eta\left(m_{k}\right)}{W\left(m_{k}\right)} μk=1−η(mk+1)+η(mk)η(mk)=W(mk)η(mk)
此图来自知网论文《付永明等:Gardner定时同步环路参数设计与性能分析》
NCO的传递函数为: N ( Z ) = k 0 z − 1 1 − z − 1 N\left( Z \right) = \frac{{{k_0}{z^{ - 1}}}}{{1 - {z^{ - 1}}}} N(Z)=1−z−1k0z−1
至此,整个Gardner环路每个模块的原理都讲了一下。
总结来说,首先给 η ( 1 ) \eta \left( 1 \right) η(1)和 w ( 1 ) w\left( 1 \right) w(1)赋初始值,然后得到插值的位置及相应的时钟定时误差te(1),将该误差通过环路滤波器后,转化为对 w ( 2 ) w\left( 2 \right) w(2)的更新,所以 w w w的计数比 $\eta $的计数大一,随后NCO又使得 $\eta $发生变化。
周而复始,不断进行反馈,最后使得整个环路达到稳定。
四、Gardner环路的可运行MATLAB代码
在设计环路参数时,环路等效噪声带宽、角频率等各种环路参数之间是相互制约的。有一个常用的方法是单边环路等效噪声带宽 B L {B_L} BL与符号采样周期 T s {T_s} Ts的乘积值。环路正常锁定,通常要求 B L T s ≪ 0.1 {B_L}{T_s} \ll 0.1 BLTs≪0.1。
知网论文《付永明等:Gardner定时同步环路参数设计与性能分析》推导了环路滤波器系数 C 1 {{C_1}} C1、 C 2 {{C_2}} C2与 B L T s {B_L}{T_s} BLTs之间的关系。即 C 1 = 8 3 B L T s {C_1} = \frac{8}{3}{B_L}{T_s} C1=38BLTs, C 2 = 32 9 ( B L T s ) 2 {C_2} = \frac{{32}}{9}{\left( {{B_L}{T_s}} \right)^2} C2=932(BLTs)2。
不妨令 B L T s = 0.01 {B_L}{T_s} = 0.01 BLTs=0.01,得到 C 1 = 0.0267 {C_1} = 0.0267 C1=0.0267, C 2 = 0.00035556 {C_2} = 0.00035556 C2=0.00035556
%%%%%%%%%%%%%%%%%%%%% Gardner算法 %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% test_gardner.m %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% date:2020年1月21日 author:CSDN博主 功夫在诗外 %%%%%%%%%%
%%%%%%%%%%%%%%%%%程序说明
%%%%正确完成Gardner算法
%%%%%% 仿真环境
%软件版本:MATLAB R2019a
%E8_41_gardner程序
close all
clear all
N=20000; %符号数
K=4; %每个符号采4个样点
Ns=K*N; %总的采样点数
w=[0.5,zeros(1,N-1)]; %环路滤波器输出寄存器,初值设为0.5
n=[0.7 zeros(1,Ns-1)]; %NCO寄存器,初值设为0.9
n_temp=[n(1),zeros(1,Ns-1)];
u=[0.6,zeros(1,2*N-1)]; %NCO输出的定时分数间隔寄存器,初值设为0.6
yI=zeros(1,2*N); %I路内插后的输出数据
yQ=zeros(1,2*N); %Q路内插后的输出数据
time_error=zeros(1,N); %Gardner提取的时钟误差寄存器
i=1; %用来表示Ts的时间序号,指示n,n_temp,nco,
k=1; %用来表示Ti时间序号,指示u,yI,yQ
ms=1; %用来指示T的时间序号,用来指示a,b以及w
strobe=zeros(1,Ns);
c1=5.41*10^(-3);
c2=3.82*10^(-6); %环路滤波器系数
%%%%% 仿真输入测试的PSK基带数据 %%%
bitstream=(randi(2,N,1)-1);
psk2=pskmod(bitstream,2);
xI=zeros(1,Ns);
xQ=zeros(1,Ns);
xI(1:8:8*N)=real(psk2); %8倍插值 %8倍插值,后面2倍抽取实现输入采样信号是输出插值符号速率的4倍
%即4个采样点确定一个插值
xQ(1:8:8*N)=imag(psk2);
%截短后的根升余弦匹配滤波器
h1=rcosfir(0.8,[-8,8],4,1,'sqrt');
aI1=conv(xI,h1);
bQ1=conv(xQ,h1);
L=length(aI1);
%仿真输入数据
aI=[aI1(22:2:L),0,0]; %2倍抽取
bQ=[bQ1(22:2:L),0,0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %下面两行代码是我添加,直接进行4倍插值滤波后得到仿真数据
% aI=rcosflt(real(psk2),1,4,'sqrt',0.8);
% bQ=rcosflt(imag(psk2),1,4,'sqrt',0.8);
%采用这种数据产生方式,从仿真波形看似不收敛,实际已收敛
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% %下面这段程序可以验证不同定时起始点情况下的收敛情况
% %对PSK信号进行16倍上采样
% I=rcosflt(real(psk2),1,16,'sqrt',0.8);
% Q=rcosflt(imag(psk2),1,16,'sqrt',0.8);
% initial=3; %不同的初始采样点下采样对应不同的收敛u值
% m=4; L=length(I); %4倍下采样后,形成每个符号4个采样点的输入数据
% aI=[I(initial:m:L)];
% bQ=[Q(initial:m:L)];
% %下面这段程序可以验证采样频率不是符号速率整数倍情况下的收敛情况
% %对PSK信号进行32倍上采样
% I=rcosflt(real(psk2),1,32,'sqrt',0.8);
% Q=rcosflt(imag(psk2),1,32,'sqrt',0.8);
% initial=2; %不同的初始采样点下采样对应不同的收敛u值
% m=9; L=floor(length(I)/m)*m; %7倍下采样后,形成每个符号32/7个采样点的输入数据
% aI=[I(initial:m:L)];
% bQ=[Q(initial:m:L)];
ns=length(aI)-2;
while(i<ns)
n_temp(i+1)=n(i)-w(ms);
if(n_temp(i+1)>0)
n(i+1)=n_temp(i+1);
else
n(i+1)=mod(n_temp(i+1),1);
%内插滤波器模块
FI1=0.5*aI(i+2)-0.5*aI(i+1)-0.5*aI(i)+0.5*aI(i-1);
FI2=1.5*aI(i+1)-0.5*aI(i+2)-0.5*aI(i)-0.5*aI(i-1);
FI3=aI(i);
yI(k)=(FI1*u(k)+FI2)*u(k)+FI3;
FQ1=0.5*bQ(i+2)-0.5*bQ(i+1)-0.5*bQ(i)+0.5*bQ(i-1);
FQ2=1.5*bQ(i+1)-0.5*bQ(i+2)-0.5*bQ(i)-0.5*bQ(i-1);
FQ3=bQ(i);
yQ(k)=(FQ1*u(k)+FQ2)*u(k)+FQ3;
strobe(k)=mod(k,2);
%时钟误差提取模块,采用的是Gardner算法
if(strobe(k)==0)
%每个数据符号计算一次时钟误差
if(k>2)
time_error(ms)=yI(k-1)*(yI(k)-yI(k-2))+yQ(k-1)*(yQ(k)-yQ(k-2));
else
time_error(ms)=(yI(k-1)*yI(k)+yQ(k-1)*yQ(k));
end
%环路滤波器,每个数据符号计算一次环路滤波器输出
if(ms>1)
w(ms+1)=w(ms)+c1*(time_error(ms)-time_error(ms-1))+c2*time_error(ms);
else
w(ms+1)=w(ms)+c1*time_error(ms)+c2*time_error(ms);
end
ms=ms+1;
end
k=k+1;
u(k)=n(i)/w(ms);
end
i=i+1;
end
figure(1);
subplot(311);plot(u);xlabel('运算点数');ylabel('分数间隔');
subplot(312);plot(time_error);xlabel('运算点数');ylabel('定时误差');
subplot(313);plot(w);xlabel('运算点数');ylabel('环路滤波器输出');
有了上面的代码后,还有以下内容需要完成:
(1)环路正式运用前,一般会用相位阶跃信号或者频率阶跃信号对其进行测试,这里忽略了这个过程;
(1)如何将Gardner算法运用到BPSK/QPSK调制解调器的仿真中,并对比实验误码率与理论误码率的情况,这是下一步的工作。
五、参考资料
在写Gardner环路的文章,我参考了十几篇阅读材料,同时能把这个环路的原理、设计及代码实现均讲得很清楚的材料,我还没有搜到。
但是,有一些材料拼一拼,能对理解Gardner环路非常有帮助。下面将我看到Gardner环路相关的书籍、论文推荐给你。
1、Gardner的三篇论文:
(1)《Interpolation in Digital Modems-Part I: Fundamentals 》
(2)《Interpolation in Digital Modems-Part II: Implementation and Performance 》
(3)《A BPSK/QPSK Timing-Error Detector for Sampled Receivers 》
Gardner的三篇论文值得一看,后续但凡做Gardner环路的研究均会提到这位开山鼻祖。但是在上面的论文中未提到环路的结构与参数设计、如何运用到QAM接收机。
2、付永明的《Gardner 定时同步环路参数设计及性能分析》
该篇论文基于MATLAB对一阶、二阶环路的结构进行了介绍,并分别对一阶环路、二阶环路的性能进行了仿真,重点分析了环路阶数和等效噪声带宽对系统性能的影响,得到了等效噪声带宽与定时同步环路性能的关系,为定时同步环路的设计提供了理论依据。
3、杜勇的《数字通信同步技术的MATLAB与FPGA实现——Xinlinx/VHDL版》
该书提供了实现Gardner算法的MATLAB代码,并对其进行了详细说明与实验结果分析。本文中代码可以说也是参考杜勇老师的书。杜勇的书,讲解知识、深入浅出,让我非常受益。
4、蔡凡的《卫星定时接收机的关键技术研究》
这篇论文对捕获、载波同步、位同步的理论知识介绍非常详细,值得认真阅读。
5、《数字通信与系统的》的第六章PPT链接是:孙永军 | 课程教学 | 西安电子科技大学个人主页
6、斯克拉的《数字通信——基础与应用》第二版
六、致谢
在写这篇文章时,曾经差点好几次想放弃,因为搞懂这些知识了真的太难了。
在这里,我特别感谢CSDN博主“功夫在诗外”,微信公众号“通信工程师专辑”的蔡博士对我的指导。
欢迎你双击屏幕、点赞、收藏、转发和分享,关注我的知乎号,也欢迎读者朋友就相关技术问题与我交流,一起学习,共同进步。请你也别忘了把这篇文章分享给你身边正在学习通信专业的同学们,也许能够帮到Ta。
这是《陈老湿·通信MATLAB仿真》的第10章,期待下次更新见!