官方淘宝店 易迪拓培训 旧站入口
首页 > 无线通信 > 通信技术学习讨论 > Gardner定时问题求教

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);
运行的结果如下:

一些调试建议
首先不要用2 order loop  先用一阶的试试,比如把C1 设定为0.02,C2为0,每次调整TED的0.02
这样可以验证你的function是否ok
另外 在二阶环路的时候,先把BW设定的大一些,看是否能锁定

多谢大神

Top