• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-07-27
  • 语言: 其他
  • 标签: Gardner  

资源简介

完整的gardner定时同步算法,能够有效的对高阶QAM信号进行时偏校正,同时分析了环路误差和环路抖动,性能良好,适合新手学习。

资源截图

代码片段和文件信息

clc;
clear all;
N = 10000; 
M = 64;%M进制
SNR = 20;%高斯信道信噪比
RolloffCoef = 0.3;%根升余弦滤波器的滚降系数
Fd = 5e6;%样本符号率
Fs= 5e6 * 8;%采样率


Ts = 65;
rcos = my_cos(Ts);
% plot(rcos);

%产生随机序列
s = randint(1NM);
x=modulate(modem.qammod(M)s);   %调制构造用于M-QAM调制的调制器对象
% figure(1); plot(x ‘r.‘);      

%脉冲成型
x_t=rcosflt(xFdFs‘sqrt‘RolloffCoef);
% figure(2); plot(x_t ‘r.‘);

%通过高斯白信道
c_t = awgn(x_t SNR ‘measured‘);   %加噪声
% figure(3); plot(c_t ‘r.‘);

%匹配滤波
h1 = rcosfir(RolloffCoef [-4 4] 8 1 ‘sqrt‘);

delay = (length(h1)+1)/2;

%加预滤波器
hh2 = diff(h1);
hh22 = [hh2 0];
hh = kaiser(65 7.97);

hk1 = h1 .* hh22;
hk2 = h1 .* rcos.‘;
hk3 = h1 .* hh.‘;

r_t1 = conv(c_t h1);
r_t = r_t1(delay: end-delay -47);
% figure(4); plot(r_t ‘r.‘);

% figure;freqz(hk3);
% mm1 = 20 * log(abs(fft(r_t))) / log(10);

% k=length(mm1);

% xx_f = [0: (Fs/k): Fs/2];
% figure;plot(xx_f mm1(1 : length(xx_f)));


aI1 = real(r_t);
bQ1 = imag(r_t);
L = length(aI1);

aI=[aI1(1:2:L)];%2倍抽取?为何先8倍插值,再2倍抽取?
bQ=[bQ1(1:2:L)];

ma=max(abs(aI));
mb=max(abs(bQ));
m=max(mamb);
aI=aI/m;bQ=bQ/m;

N=floor(length(aI)/4);
Ns=4*N;  %总的采样点数

bt=0.001;
c1=8/3*bt;
c2=32/9*bt*bt;
i=3;    %用来表示Ts的时间序号指示nn_tempnco

w=[0.5zeros(1N-1)];  %环路滤波器输出寄存器,初值设为0.5
n=[0.7 zeros(1Ns-1)]; %NCO寄存器,初值设为0.9
n_temp=[n(1)zeros(1Ns-1)]; 
u=[0.6zeros(12*N-1)];%NCO输出的定时分数间隔寄存器,初值设为0.6
yI=zeros(12*N);       %I路内插后的输出数据 
yQ=zeros(12*N);       %Q路内插后的输出数据
time_error=zeros(1N); %Gardner提取的时钟误差寄存器

ik=time_error;
qk=time_error;

k=1;    %用来表示Ti时间序号指示uyIyQ
ms=1;   %用来指示T的时间序号用来指示ab以及w
strobe=zeros(1Ns);




ns=length(aI)-2;
while(i    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(k2);
        %时钟误差提取模块,采用的是Gardner算法
        if(strobe(k)==0)
            %取出插值数据
            ik(ms)=yI(k);
            qk(ms)=yQ(k);
            
            %每个数据符号计算一次时钟误差
            if(k>2)
               Ia=(yI(k)+yI(k-2))/2;
               Qa=(yQ(k)+yQ(k-2))/2;
               time_error(ms)=[yI(k-1)-Ia ]  *(yI(k)-yI(k-2))+[yQ(k-1)-Qa]  *(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-1);
                %w(ms+1)=w(ms)+c1*(time_error(ms)-time_error(ms-1));
            else
                w(ms+1)=w(ms)+c1*time_error(ms)+c2*time_error(m

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3726  2017-09-06 20:55  my_gardner.m

     文件       3741  2017-09-06 19:43  g3.m

----------- ---------  ---------- -----  ----

                 7467                    2


评论

共有 条评论