%E8_41_gardner程序
close all
clear all
N=20000; %符号数
K=4; %每个符号采4个样点
Ns=K*N; %总的采样点数
g=0.8;
w=[0.5,zeros(1,N-1)]; %环路滤波器输出寄存器,初值设为0.5
n=[0.7 zeros(1,Ns-1)]; %NCO(数字控制振荡器)寄存器,初值设为0.7
n_temp=[n(1),zeros(1,Ns-1)]; %??
u=[0.6,zeros(1,2*N-1)]; %NCO输出的定时分数间隔寄存器,初值设为0.6
yI=zeros(1,2*N); %I路内插后的输出数据
yQ=zeros(1,2*N); %Q路内插后的输出数据
time_error=zeros(1,N); %Gardner提取的时钟误差寄存器
i=1; %用来表示Ts(ADC的采样周期)的时间序号,指示n,n_temp,nco,
k=1; %用来表示Ti(Ti=T/N)时间序号,指示u,yI,yQ
ms=1; %用来指示T(符号周期)的时间序号,用来指示a,b以及w
strobe=zeros(1,Ns); % ??
c1=5.41*10^(-3);
c2=3.82*10^(-6); %环路滤波器系数
%%%%% 仿真输入测试的PSK基带数据 %%%
bitstream=(randi(2,N,1)-1);
psk2=pskmod(bitstream,2);
xI=zeros(1,Ns);
xQ=zeros(1,Ns);
xI(1:8:8*N)=real(psk2); %8倍插值 %8倍插值,后面2倍抽取实现输入采样信号是输出插值符号速率的4倍
%即4个采样点确定一个插值
xQ(1:8:8*N)=imag(psk2);
%截短后的根升余弦匹配滤波器
h1=rcosfir(g,[-8,8],4,1,'sqrt'); %滚降因子,截断长度,每个码元的采样个数,采样周期,滤波器类型
aI1=conv(xI,h1);
bQ1=conv(xQ,h1);
L=length(aI1);
%仿真输入数据
aI=[aI1(22:2:L),0,0]; %2倍抽取
bQ=[bQ1(22:2:L),0,0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %直接进行4倍插值滤波后得到仿真数据
% aI=rcosflt(real(psk2),1,4,'sqrt',g);
% rcosflt滚降滤波函数,输入信号real(psk2),1为输入采样频率,4为输出采样频率,后者为前者的整数倍,0.8滚降因子
% bQ=rcosflt(imag(psk2),1,4,'sqrt',g);
%采用这种数据产生方式,从仿真波形看似不收敛,实际已收敛
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% %不同定时起始点情况下的收敛情况
% %对PSK信号进行16倍上采样
% I=rcosflt(real(psk2),1,16,'sqrt',g);
% Q=rcosflt(imag(psk2),1,16,'sqrt',g);
% initial=3; %不同的初始采样点下采样对应不同的收敛u值
% m=4; L=length(I); %4倍下采样后,形成每个符号4个采样点的输入数据
% aI=[I(initial:m:L)];
% bQ=[Q(initial:m:L)];
% %采样频率不是符号速率整数倍情况下的收敛情况
% %对PSK信号进行32倍上采样
% I=rcosflt(real(psk2),1,32,'sqrt',g);
% Q=rcosflt(imag(psk2),1,32,'sqrt',g);
% initial=2; %不同的初始采样点下采样对应不同的收敛u值
% m=7; L=floor(length(I)/m)*m; %7倍下采样后,形成每个符号32/7个采样点的输入数据
% aI=[I(initial:m:L)];
% bQ=[Q(initial:m:L)];
ns=length(aI)-2;
while(i<ns)
n_temp(i+1)=n(i)-w(ms); %NCO寄存器与环路滤波器输出差值
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);%c1,c2环路滤波系数,
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); %NCO输出的定时分数间隔寄存器,初值设为0.6 =NCO寄存器/环路滤波输出
end
i=i+1;
end
figure(1);
subplot(311);plot(u);xlabel('运算点数');ylabel('分数间隔');
subplot(312);plot(time_error);xlabel('运算点数');ylabel('定时误差');
subplot(313);plot(w);xlabel('运算点数');ylabel('环路滤波器输出');
没有合适的资源?快使用搜索试试~ 我知道了~
gardner.zip_3G/4G/5G开发_matlab__3G/4G/5G开发_matlab_
共1个文件
m:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 27 浏览量
2021-08-09
19:36:58
上传
评论
收藏 2KB ZIP 举报
温馨提示
psk基带信号,采用gardner时钟误差检测算法
资源推荐
资源详情
资源评论
收起资源包目录
gardner.zip (1个子文件)
gardner.m 4KB
共 1 条
- 1
资源评论
- FPGA练习生2022-07-05发现一个宝藏资源,资源有很高的参考价值,赶紧学起来~
pudn01
- 粉丝: 40
- 资源: 4万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功