| 
 | 
 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 
×
 
最上面是分数间隔,中间是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/8 length(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 |   
 
 
 
 |