Gardner定时问题求教
01-08
各位大神,
我在通信实验过程中遇到一个问题,哪位大神能不能给我看看,非常感谢!
我在发送端通过AWG发生信号,在接收端通过示波器以40倍的传输速率进行采样。
下面是Matlab代码
Signals_I = decimate(EXP_Signals_I,20); %EXP_Signals_I和EXP_Signals_Q分别是示波器采的点,进行20倍下采样
Signals_Q = decimate(EXP_Signals_Q,20);
然后,进行Gardner定时恢复
function [YI,YQ] = Gardner_Timing(XI,XQ)
datalength = length(XI);
N = ceil(datalength/2);
w = [0.5, zeros(1,N-1)]; %环路滤波器输出寄存器,初值设为0.5
n = [0.9, zeros(1,datalength-1)]; %NCO寄存器,初值设为0.9
n_temp = [n(1),zeros(1,datalength-1)];
u = [0.6,zeros(1,N-1)];%NCO输出的定时分数间隔寄存器,初值设为0.6
YI=zeros(1,datalength); %I路内插后的输出数据
YQ=zeros(1,datalength); %Q路内插后的输出数据
strobe = zeros(1,datalength);
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
Kd = 6;
BL = 0.003;
zeta = 0.707;
Wn = (8 * BL * zeta)/(1 + 4 * zeta^2);
c1 = 2 * Wn * zeta / Kd;
c2 = Wn^2 / Kd;
ns = datalength-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);
%内插滤波器模块
C_02= (1/6)*u(k)^3+(-1/6)*u(k);
C_01= (-1/2)*u(k)^3+(1/2)*u(k)^2+(1)*u(k);
C_0 = (1/2)*u(k)^3+(-1)*u(k)^2+(-1/2)*u(k)+1;
C_1 = (-1/6)*u(k)^3+(1/2)*u(k)^2+(-1/3)*u(k);
YI(k)=C_02*XI(i+2) + C_01*XI(i+1) + C_0*XI(i) + C_1*XI(i-1);
YQ(k)=C_02*XQ(i+2) + C_01*XQ(i+1) + C_0*XQ(i) + C_1*XQ(i-1);
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;
subplot(311);
plot(u);
subplot(312);
plot(time_error);
subplot(313);
plot(w);
运行的结果如下:
我在通信实验过程中遇到一个问题,哪位大神能不能给我看看,非常感谢!
我在发送端通过AWG发生信号,在接收端通过示波器以40倍的传输速率进行采样。
下面是Matlab代码
Signals_I = decimate(EXP_Signals_I,20); %EXP_Signals_I和EXP_Signals_Q分别是示波器采的点,进行20倍下采样
Signals_Q = decimate(EXP_Signals_Q,20);
然后,进行Gardner定时恢复
function [YI,YQ] = Gardner_Timing(XI,XQ)
datalength = length(XI);
N = ceil(datalength/2);
w = [0.5, zeros(1,N-1)]; %环路滤波器输出寄存器,初值设为0.5
n = [0.9, zeros(1,datalength-1)]; %NCO寄存器,初值设为0.9
n_temp = [n(1),zeros(1,datalength-1)];
u = [0.6,zeros(1,N-1)];%NCO输出的定时分数间隔寄存器,初值设为0.6
YI=zeros(1,datalength); %I路内插后的输出数据
YQ=zeros(1,datalength); %Q路内插后的输出数据
strobe = zeros(1,datalength);
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
Kd = 6;
BL = 0.003;
zeta = 0.707;
Wn = (8 * BL * zeta)/(1 + 4 * zeta^2);
c1 = 2 * Wn * zeta / Kd;
c2 = Wn^2 / Kd;
ns = datalength-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);
%内插滤波器模块
C_02= (1/6)*u(k)^3+(-1/6)*u(k);
C_01= (-1/2)*u(k)^3+(1/2)*u(k)^2+(1)*u(k);
C_0 = (1/2)*u(k)^3+(-1)*u(k)^2+(-1/2)*u(k)+1;
C_1 = (-1/6)*u(k)^3+(1/2)*u(k)^2+(-1/3)*u(k);
YI(k)=C_02*XI(i+2) + C_01*XI(i+1) + C_0*XI(i) + C_1*XI(i-1);
YQ(k)=C_02*XQ(i+2) + C_01*XQ(i+1) + C_0*XQ(i) + C_1*XQ(i-1);
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;
subplot(311);
plot(u);
subplot(312);
plot(time_error);
subplot(313);
plot(w);
运行的结果如下:
一些调试建议
首先不要用2 order loop 先用一阶的试试,比如把C1 设定为0.02,C2为0,每次调整TED的0.02
这样可以验证你的function是否ok
另外 在二阶环路的时候,先把BW设定的大一些,看是否能锁定
多谢大神
相关文章:
- 请教16Qam的Gardner位同步(05-08)
- 求gardner的一篇经典paper(05-08)
- Gardner的时间同步问题(05-08)
- 有人熟悉Gardner算法吗?(05-08)
- 求gardner的Phaselock Techniques 3rd edition 电子书 英文版(05-08)
- gardner符号定时恢复疑问求助(05-08)
射频专业培训教程推荐