在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3397|回复: 8

gardner 算法Jitter问题请教

[复制链接]
发表于 2014-6-13 11:33:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最上面是分数间隔,中间是TED的输出,下面是w(n)步长,用过Gardner算法的咨询下这是什么问题?使用的是NCO形式,

m0 =[1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0];
bitstream=[];
for temp=1:200
bitstream=[bitstream m0];%randint(1,N,2);  
end
psk1=[mskmod(bitstream,4)];

localdata=psk1(1:2:length(psk1)); %抽取本地码
psk2=interp1((1:length(psk1)),psk1,(1:0.999:length(psk1)),'spline');

N=round(length(psk2)/8);  %符号数
K=8;     %每个符号采4个样点
Ns=K*N;  %总的采样点数

w=[0.50 zeros(1,N-1)];  %环路滤波器输出寄存器,初值设为0.5
n=[0.6 zeros(1,Ns-1)]; %NCO寄存器,初值设为0.9
n_temp=[n(1),zeros(1,Ns-1)];
u=[0.3 zeros(1,2*N-1)];%NCO输出的定时分数间隔寄存器,初值设为0.6
yI=zeros(1,N);       %I路内插后的输出数据
yQ=zeros(1,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);

% wn=0.00069;
% K=14;
% ET=0.707;
% c1=wn^2/K;
% c2=wn*2*ET/K;

c1=4.6975*10^(-3);   c2=2.6*10^(-6);  

Ts=1/1e6;
f_offset=10e3;
%
%  t=0:Ts/8length(psk2)-1)*Ts/8;
%  psk2=psk2.*exp(1i*2*pi*f_offset*t); %加频偏

testdata=psk2(1:4:length(psk2)); %抽取本地码
aI=real(psk2);
bQ=imag(psk2);
plot(real(psk2));
%
%


% xI=zeros(1,Ns);
% xQ=zeros(1,Ns);
% xI(1:8:8*N)=real(psk2);%8倍插值?为何要这样设计
% xQ(1:8:8*N)=imag(psk2);
% %截短后的根升余弦匹配滤波器
% h1=rcosfir(0.5,[-8,8],4,1,'sqrt');
% hw=kaiser(65,3.97);
% hh=h1.*hw.';
% aI1=conv(xI,h1);
% bQ1=conv(xQ,h1);
% L=length(aI1);
% %仿真输入数据
% aI=[aI1(26:2),0,0];%2倍抽取?为何先8倍插值,再2倍抽取?
% bQ=[bQ1(26:2),0,0];
%##############################

ns=length(aI)-4;
test_variable=0;
pre_nn=0;
pre_n=0;
while(i<ns)
    n_temp(i+1)=n(i)-w(ms);
    pre_nn=pre_n;
    pre_n=n(i);
    if(n_temp(i+1)>0)
        n(i+1)=n_temp(i+1);
    else
        n(i+1)=mod(n_temp(i+1),1);
        %内插滤波器模块
         %PIECEWISE-PARABINO INTETRCPOLATOR
        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;
        Out(k)=yI(k)+1i*yQ(k);
        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));
         % time_error(ms)=real((Out(k-1))^2*(conj(Out(k-3)))^2)-real((Out(k))^2*(conj(Out(k-2)))^2);
           %time_error(ms)=yI(k-1)*(yI(k)-yI(k-2));
            else
                time_error(ms)=(yI(k-1)*(yI(k)))+(yQ(k-1)*(yQ(k)));
            end
            %环路滤波器.每个数据符号计算一次环路滤波器输出
            if(ms>1)
                test_variable=test_variable+c2*time_error(ms);
                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);
                    test_variable=test_variable+c2*time_error(ms);
            end
            ms=ms+1;
        end
        k=k+1;
        u(k)=n(i)/w(ms);
    end
    i=i+1;
end
 楼主| 发表于 2014-6-13 11:36:01 | 显示全部楼层
QQ图片20140613113252.jpg
发表于 2014-9-16 13:24:23 | 显示全部楼层
你的鉴相器输出有问题
发表于 2014-11-4 12:42:43 | 显示全部楼层
哈哈哈,我好像跟你在一群里面。
发表于 2018-11-8 09:03:42 | 显示全部楼层
....... 不错
发表于 2018-11-8 16:18:56 | 显示全部楼层
这么久了,看来问题是已经解决了。
发表于 2018-11-27 17:15:56 | 显示全部楼层
学习中。。。
发表于 2018-12-17 14:17:19 | 显示全部楼层
发表于 2019-1-28 13:22:23 | 显示全部楼层
这么久了还有人来看这个帖子?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 08:43 , Processed in 0.022137 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表