⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timing.m

📁 采用GARDNER算法的定时模块的仿真
💻 M
字号:
定时恢复程序:
clear all
N=60000;  %符号数 
K=4;      %每个符号采4个样点
Ns=K*N;  %总的采样点数
f=7.23*10^6;   %符号的码率
alpha=0.15;
initial=2;
Index=2;
fi=Index*f;   %输出定时时钟的频率为输入频率的Index倍,在这里设为2
w=[f/fi,zeros(1,N-1)];  %开始步长w(1)设为Ts/Ti,这里为0.5,w的总长度为总的符号数N
n=[0.9 zeros(1,Ns-1)];  %将n(1)设为0.9
n_temp=[n(1),zeros(1,Ns-1)]; 
u=[0.6,zeros(1,2*N-1)];%
yI=zeros(1,2*N);  %I路内插后的输出数据 
yQ=zeros(1,2*N);  %Q路内插后的输出数据
time_error=zeros(1,N);   %时钟误差
i=1;    %用来表示Ts的时间序号,指示n,n_temp,nco,
j=0;
k=1;  %用来表示Ti时间序号,指示u,yI,yQ
ms=1;  %用来指示T的时间序号,用来指示a,b以及w
strobe=zeros(1,Ns);
c1=5.41*10^(-5);   c2=3.82*10^(-8);  %环路滤波器系数
bitstream=randint(1,N,64);              
qam64=qammod(bitstream,64);
xI=zeros(1,Ns);
xQ=zeros(1,Ns);
xI(1:8:8*N)=real(qam64);
xQ(1:8:8*N)=imag(qam64);
%截短后的根升余弦匹配滤波器
h1=rcosfir(0.15,[-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+initial:2:L),0,0];
bQ=[bQ1(26+initial:2:L),0,0];
ns=length(aI);
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);
   %内插滤波器模块
        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; 
        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
plot(u);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -