目录:
1 扩频的基本原理
1.1 扩频的概念
- 扩频的简单理解
前面讲过一些调制方法,都是利用调制信号乘以基带信号得到已调信号。2ASK的调制信号就是二进制序列,MSK调制信号可以是一种正交载波。调制无非就是频谱搬移,将基带信号调制到期望的频带内以便传输。这里扩频也属于一种调制方式,所谓扩频,就是扩展频谱的范围,比如原信号的频谱在200 ~ 400KHz,通过扩频,信息可能就分散在20 ~ 30MHz内。通过拓宽频谱,可以极大增强通信的抗干扰性。在扩频系统中,发送方以特定的调制方式将原始信号的频谱加以扩展,得到扩频信号。接收端再对扩频信号加以处理,把它恢复为原始信号。这就是扩频和解扩。
- 为什么要扩频
一般的,如语音信号,带宽比大约几到十几,属于窄带通信,扩频信号的带宽比高达1000,属于宽带通信。用这么大的带宽来传输信息,是浪费资源吗?显然,可以利用信道复用,在宽带范围内完成若干窄带通信,即在同一频带同时建立多个信号进行通信,各信道可以通过扩频码进行区分,这就是码分多址(CDMA)。
- 如何扩展频谱?
既然是调制,就是频谱搬移,搬移到高频,就需要比基带信号频率高的信号。我们知道,时域有限,频域无限。一个窄脉冲的频谱非常宽,如果持续时间很窄的脉冲序列被所传输的信息调制时,就可以产生带宽很大的信号。这种持续时间很窄的脉冲码序列,码元速率很高,称之为伪码序列。伪码序列不影响传输的信息,仅仅起扩展频谱的作用,接收方可通过相关解调获取信息码。
1.2 直扩系统工作原理
直扩系统的组成框图如图所示,a(t)是信源输出,码元持续时间为Ta,c(t)是伪码,码元宽度是Tc,以模二加实现二者相乘,产生速率与伪码速率相同的扩频序列。

所以直扩系统的关键就是产生伪码。理论上来说,使用随机码扩展频谱是最理想的,但接收方也需要同样的随机序列副本,理想的随机序列是不可复制的。因此在工程中多用PN码,即伪随机序列解决这一问题,本文使用的是m序列。
m序列是一种线性反馈序列,可根据本原多项式产生,其模型可用线性反馈移位寄存器来表征,移位寄存器的位数和抽头个数由m序列的阶数查表可得,这里不赘述。
2 直扩调制信号的matlab仿真分析
如前所述,直扩系统调制信号可分为三个过程:产生伪码序列、原始信号通过伪码序列进行扩频、载波调制。m序列由本原多项式产生抽头系数,伪码产生函数及扩频主函数代码如下:
function p=PnCode(polynomial,reg)
grade=length(polynomial)-1;
PN_Length=(2^grade-1);
pn=zeros(1,PN_Length);
%找出本原多项式中除最低位外为1的位,并依次存放在寄存器c中
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
%产生一个周期的PN码
q=0;
for i=1:PN_Length
p(i)=reg(1);
m=reg(grade+1-c(1));
for q=2:grade
if (c(q)>0) & (reg(grade+1-c(q))==1)
m=~m;
end
end
for q=1:(grade-1)
reg(q)=reg(q+1);
end
reg(5)=m;
end
可以看出,m序列产生过程主要分为:设置初始状态、寄存器模二和运算、移位、次态的初值为模二和的结果,循环了数值为伪码长度的次数后,产生的便是一个周期的伪码。
%仿真直扩信号的调制过程
Rb=200*10^3;
Lpn=31;
Rc=Rb*Lpn;
Fs=8*Rc;
fc=8*10^6;
a=0.8;
N=5000;
L=N*Lpn*Fs/Rc;
t=0:(L-1);
t=t/Fs;
polynomial=[1 0 0 1 0 1]; %产生PN码的本原多项式
reg=[1 0 0 0 0];
PN=PnCode(polynomial,reg)
%PN=zeros(1,length(PN));
bitstream=randint(1,N,2);
source=rectpulse(bitstream,Lpn);
data=zeros(1,N*Lpn);
for i=1:N
if bitstream(i)==0
data((i-1)*Lpn+1:i*Lpn)=PN;
else
data((i-1)*Lpn+1:i*Lpn)=~PN;
end
end
for i=1:N*Lpn
if data(i)==0
data(i)=-1;
end
end
%对扩频后的数据以Fs频率采样
Ads=upsample(data,Fs/Rc);
%设计升余弦滤波器
n_T=[-2 2];
rate=Fs/Rc;
T=1;
Shape_b = rcosfir(a,n_T,rate,T);%figure(4);freqz(Shape_b)
rcos_Ads=filter(Shape_b,1,Ads);
f0=sin(2*pi*fc*t);
dss=rcos_Ads.*f0;
运行程序后,可以在命令行中显示一个周期的伪码序列`
[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 0]
仿真结果如图所示。扩频就是伪码与信息做异或处理,对于二进制而言,信息码无非是"0"或者"1",异或遇0不变,遇1取反,一个信息码元对应一个周期的伪码。因此,伪码速率是信息码元的31倍(31是伪码长度),当产生了一个信息码元,就要产生31位的伪码与之对应运算,生成的也是31位的码长,这个码可能与PN码一样,也可能是其反码,这取决于信息码元是"0"还是"1",所以扩频码的码率=伪码码率=31*信息码元的码率。
`
3 伪码同步的一般原理
解扩的关键就在于收发双方伪码是否一致,即需要完成伪码同步。同步又分为捕获和跟踪,捕获是利用滑动相关原理,跟踪可利用延迟锁相环。
3.1 滑动相关捕获
滑动相关原理框图如下:

如图所示,接收信号与本地伪码序列相乘后再进行积分,即求出它们的互相关值,然后在门限检测器中与某一门限比较,以判断是否已捕获到有用信号。这里利用PN码的相关性,当两个相同的伪码序列在相位上一致时,其相关值有最大输出,即达到相关峰。一旦确认捕获完成,则捕获指示信号的同步脉冲控制搜索控制时钟,调整本地伪码产生器产生伪码频率和相位,使之与接收信号保持同步。
3.2 延迟锁相环跟踪原理
当捕获到有用信号,即收发双方伪码相差在一个伪码码元以内,同步系统转入同步阶段,即精同步,也成为跟踪阶段。
对于延迟锁相环,需要得到本地伪码与接收信号的相差,它是以扩频序列自相关函数的偶对称性来实现跟踪功能。下左图为扩频序列的自相关函数曲线,右图为延迟锁相环的鉴相曲线。可见相关峰出现对称轴上,且相关信号的延迟和滞后曲线相减可以得到扩频序列的跟踪曲线。

由鉴相曲线可知,在相差位于一定范围内,鉴相器输出一个与 τ τ τ成线性关系的极性信号,那么可以由这个小范围得到鉴相误差,从而经过环路滤波送到VCO,控制本地伪码序列向减小跟踪偏差的方向调整。所以在此过程研究鉴相是为了寻找一个小范围的线性曲线来作为VCO的控制信号,在后文会提出一种全数字伪码同步环,将前文所述的捕获过程和这里的跟踪过程合并,要知道跟踪就是利用小范围相差得到的线性相关信号,控制VCO,使得相位可以被调控,从而达到精准跟踪。
4 同步算法及matlab仿真分析
4.1 算法设计
由前所述,传统的滑动相关器通过控制本地伪码产生器的驱动时钟频率来达到滑动的目的。在数字电路中,通过控制本地伪码产生器,使其按固定步长左移或者右移来达到相对滑动的目的,此法也成为固定步长串行搜索法。原理图如图所示:

由图可以看出当PN码与接受的时钟发生相干解扩(相乘后积分),通过门限检测得到信息序列,如果不是原始数据,即按固定长度步进。如何知道解出的数据和原始数据匹配呢,利用相乘和积分运算获得相关值,通过门限检测来比较是否捕获到了有用信号,即门限检测是用于检测相关值,从而知道是否具有相差,来达到本地伪码与接收信号中的伪码相对滑动的目的。
由于每次滑动步长为一个码元周期,即对于扩频序列,一个周期一个周期的处理,第一次对第一个周期的扩频码进行调整,步进了一个固长,如果没有同步成功,下一次对第二个周期的扩频码接着调整,则步进两个步长。每次调整都需要完成一个伪码周期(采样后的),比如伪码长度是31,经过八倍采样,那么原来的一个伪码码元被扩展到了8个,则伪码周期就是8位码元,那么最多要调整31次,即最长捕获时间为Ta=LpnTb。
4.2 伪码同步环
由前文可知,捕获和跟踪都需要环路,如果能用同一个环路实现或者尽可能多地对两种环路中的部分部件(积分器)加以重用,则可大大减少所需的硬件资源。因为捕获和跟踪在时间轴上不重复,这就为环路部件的重用提供可能,这就是全数字伪码同步环的由来。原理图如图所示。

全数字伪码同步环与传统同步环的差别主要是捕获方式的改变,即采用延迟锁相环中的超前支路和滞后支路的相关累加器的平方和作为判断是否捕获到有用信号的依据,而不单只使用一条支路的相关累加器的输出作为门限检测值。跟踪部分不变,还是利用固定步长调整相位。在步进中可以减少本地伪码的固定步长,这样尽可能避免由于积累的相差过多,再加上频偏的影响导致滑动无法同步,4.3仿真采用的是步进1/2伪码码元长度(4个采样点,一个周期采8个点)。理论上,超前和滞后的两条支路的相关累加器的相关函数如图所示。

4.3 捕获及跟踪门限仿真
clc
Rb=200*10^3;
Lpn=31;
Rc=Rb*Lpn;
Fs=8*Rc;
a=0.8;
N=2;
t=0:(N*Lpn*Fs/Rc-1);
t=t/Fs;
ploynomial=[1 0 0 1 0 1];
reg=[1 0 0 0 0]; %设置PN码的初始相位
PN=E9_1_PnCode(ploynomial,reg); %调用函数产生PN码
bitstream=zeros(1,N); %产生N点原始二进制数据
source=rectpulse(bitstream,Lpn);
data=zeros(1,N*Lpn);
for i=1:N
if bitstream(i)==0
data((i-1)*Lpn+1:i*Lpn)=PN;
else
data((i-1)*Lpn+1:i*Lpn)=~PN;
end
end
for i=1:N*Lpn
if data(i)==0
data(i)=-1;
end
end
Ads=upsample(data,Fs/Rc);
%设计升余弦滤波器
n_T=[-2 2];
rate=Fs/Rc;
T=1;
Shape_b = rcosfir(a,n_T,rate,T);
%对采样后的数据进行升余弦滤波;
rcos_Ads=filter(Shape_b,1,Ads);
pn_ad=Ads(1:Fs/Rb);
dat=rcos_Ads(Fs/Rb/2: Fs/Rb/2+Fs/Rb-1);
Len=length(dat);
%产生滞后1/2个伪码码元周期的支路数据
data_aft=[dat(Len-Fs/Rc/2+1:Len),dat(1:Len-Fs/Rc/2)];
%产生超前1/2个伪码码元周期的支路数据
data_pre=[dat(Fs/Rc/2+1:Len),dat(1:Fs/Rc/2)];
%捕获时的相关峰和差曲线
step=2;
PN_oc=pn_ad;
sum_aft=zeros(1,Lpn*step);
sum_pre=zeros(1,Lpn*step);
for i=1:Lpn*step
if i>1
PN_oc=[pn_ad((i-1)*Fs/Rc/step+1:Len),pn_ad(1:(i-1)*Fs/Rc/step)];
end
for j=1:Fs/Rb
if PN_oc(j)==1
sum_aft(i)=sum_aft(i)+data_aft(j);
sum_pre(i)=sum_pre(i)+data_pre(j);
else
sum_aft(i)=sum_aft(i)-data_aft(j);
sum_pre(i)=sum_pre(i)-data_pre(j);
end
end
end
square_aft=sum_aft.*sum_aft;
square_pre=sum_pre.*sum_pre;
square_sum=square_aft+square_pre;
square_sub=square_aft-square_pre;
%跟踪时的相关峰和差曲线
step=8;
PN_oc=pn_ad;
sum_aft=zeros(1,Lpn*step);
sum_pre=zeros(1,Lpn*step);
for i=1:Lpn*step
if i>1
PN_oc=[pn_ad((i-1)*Fs/Rc/step+1:Len),pn_ad(1:(i-1)*Fs/Rc/step)];
end
for j=1:Fs/Rb
if PN_oc(j)==1
sum_aft(i)=sum_aft(i)+data_aft(j);
sum_pre(i)=sum_pre(i)+data_pre(j);
else
sum_aft(i)=sum_aft(i)-data_aft(j);
sum_pre(i)=sum_pre(i)-data_pre(j);
end
end
end
square_aft=sum_aft.*sum_aft;
square_pre=sum_pre.*sum_pre;
square_sum=square_aft+square_pre;
square_sub=square_aft-square_pre;
下图分别为步进4个采样点和1个采样点时捕获状态的相关峰曲线。其中相关峰之差中间的线性部分就是鉴相部分,相关峰之和中间凹下去而没有出现平坦的原因是因为采样频率不够高。解决办法要么增加采样频率,要么将捕获和跟踪两个环路分开设计。

