1.算法仿真效果
matlab2022a仿真结果如下:
对比不同时偏,不同SNR下gardner环的定时调整参数uk变化仿真结果图:
2.算法涉及理论知识概要
位同步,也叫符号同步、定时同步、码元同步,只有数字通信才需要,数字通信中不管是基带传输还是频带传输都需要。
这是因为数字通信中,是用波形中的几个采样点去代替一个符号,在接收端只需要对这些采样点中的一个进行判决,便可以恢复出这个符号。
实际通信中,由于信道的传输时延,接收两端的时钟偏移,接收端无法找到符号的最佳时刻来对其进行采样判决,这便使得接收端恢复出的数据与发送端的数据有误差。
接收端若想在最佳采样时刻恢复发送端的数据,便要使得接收时钟与发送时钟同步,因此接收端要采取措施来调整接收端的采样时钟,这个同步的过程便定义为位同步。
Gardner定时误差算法通常用在BPSK、QPSK信号,通过改进可以应用在QAM等多进制基带信号中。Gardner定时误差算法,该算法的一个特点是每个符号只需要使用两个采样点,一个是strobe点,即最佳观察点,另外一个是midstrobe点,即两个观察点之间的采样点。Gardener环中的数控振荡器与锁相环路中的NCO功能完全不同,这里的NCO作用是产生时钟,即确定内插基点mk,同时完成分数间隔uk的计算,以提供给内插器进行内插。
位同步环路中的数控振荡器(NCO)是一个相位递减器,它的差分方程为:
η(m+1)=[η(m)-ω(m)]mod1
式中,η(m)是第m个工作时钟NCO寄存器的内容,ω(m)为NCO的控制字,两者都是正小数。NCO的工作周期是T s(采样周期),内插器的周期为T i,ω(m)由环路滤波器进行调节,使NCO在最佳采样时刻溢出。当环路达到平衡时,ω(m)近似是个常数,此时平均每隔1/ω(m)个采样周期,NCO就溢出一次,所以
gardner环内部结构如下所示:
3.MATLAB核心程序
%信号加载的时偏 errs = [2e-4,0.5e-4,0.2e-4]; SNR_DBs = [1,10,20]; idx = 0; for i1 = 1:length(errs) for i2 = 1:length(SNR_DBs) err = errs(i1); SNR_DB = SNR_DBs(i2); idx = idx+1; sl = 3000; ............................................................ I_D = awgn(I_D,SNR_DB,'measured'); %接受端的信号,加载指定的snr Q_D = awgn(Q_D,SNR_DB,'measured'); %接受端的信号,加载指定的snr ......................................................................... %gardner环 for i = 2 : interplen - 1 for k = 1 : nsamp %nco控制模块 y_temp = q0 - w; q(m) = q0; if y_temp > 0 q0 = y_temp; else q0 = mod(y_temp,1); mk = m; uk = s0 * q(m); uu(j) = uk; %内插器I data1 = datarcosI(mk); data2 = datarcosI(mk + 1); interp_outI(j) = uk * data2 + (1 - uk) * data1; %内插抽取模块 ............................................................. end m = m + 1; end %误差检测 ................................................ %环路滤波 .......................................................... end %gardner环性能 figure(1); subplot(3,3,idx) plot(uu,'b'); grid on; title(['SNR=',num2str(SNR_DB),' 时偏:',num2str(err)]); end end %系统最后输出数据与原始数据比对 figure; subplot(311); stem(I_Data(6:end-6)); grid on; xlim([5000,5100]); legend('原始信号'); subplot(312); stem(I_D(4:nsamp:end)); grid on; xlim([5000,5100]); legend('定时同步前基带信号'); subplot(313); stem(qoutI(2:end)); grid on; xlim([5000,5100]); legend('gardner环输出基带信号');