1.算法仿真效果
matlab2022a仿真结果如下:
锁定过程的星座图变化情况:
定时收敛曲线:
载波同步收敛曲线:
2.算法涉及理论知识概要
基于16QAM(Quadrature Amplitude Modulation)调制的音频信号同步接收器是一个复杂但高效的通信系统。该系统主要涉及三个关键部分:Gardner符号同步、载波同步以及CMA(Constant Modulus Algorithm)均衡。
1. Gardner符号同步
Gardner符号同步是一个用于数字通信系统的相位和频率同步的算法,它是在数据符号级别上工作的。这个算法通过一个特殊的滤波器(Gardner或Dragone滤波器)来估计并跟踪接收信号的相位和频率。这个滤波器尝试最小化接收信号和理想信号之间的差异,从而提供一个准确的相位和频率估计。
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在最佳采样时刻溢出。
2. 载波同步
载波同步是用于从接收到的信号中提取相位和频率信息的部分。它主要用于消除接收信号中可能存在的载波偏差。这种偏差可能由发射和接收设备的频率不同步或者多径效应引起。 Costas环(Costas Loop)用在抑制载波调制信号(比如双边带抑制载波调制)和相位调制信号(BPSK、QPSK)的相干解调中的载波恢复(carrier frequency recovery)上。Costas环的主要应用是在无线通信接收机中。与基于PLL的检波器相比,它的优势在于,在相位差比较小的情况下,Costas环输出的误差电压为 sin(2(θi−θf)) ,而基于PLL的检波器输出的误差电压为 sin(θi−θf) ,这不仅使灵敏度提高了一倍,而且使Costas环路特别适合跟踪载波的多普勒频移,特别是在OFDM和GPS接收机中。
3. CMA均衡
CMA(Constant Modulus Algorithm)均衡是一种常用于数字通信系统的盲信号处理技术。它主要用于消除多径干扰和通道失真。CMA均衡器通过调整其权重来最小化输出信号的模值偏差。这意味着它会尝试将接收到的信号调整到接近理想的信号形状。
基于16QAM调制的音频信号同步接收器将上述三个部分结合在一起,通过处理接收到的信号实现同步解调和均衡处理,从而恢复出原始信号。
3.MATLAB核心程序
%gardner算法开始 %gardner算法开始 len=length(out); K=4; %每 个符号采4个样点 Ns=len; %总的采样点数 N=floor(Ns/K);%符号数 i=4; %用来表示Ts的时间序号,指示n,n_temp,nco, k=1; %用来表示Ti时间序号,指示u,yI,yQ ms=1; %用来指示T的时间序号,用来指示a,b以及w strobe=zeros(1,Ns); c1=0.0267; c2=0.00035556; %环路滤波器系数 %%%%% 仿真输入测试的PSK基带数据 %%% aI=real(out); aQ=imag(out); ik=[]; qk=[]; ns=length(aI)-2; length(aI); tic; 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-2)-0.5*aI(i+1-2)-0.5*aI(i-2)+0.5*aI(i-1-2); FI2=1.5*aI(i+1-2)-0.5*aI(i+2-2)-0.5*aI(i-2)-0.5*aI(i-1-2); FI3=aI(i-2); ..................................................................... end k=k+1; u(k)=n(i)/w(ms); end i=i+1; end toc; figure; t=0:length(u)-1; T=1/2400; subplot(311); plot(t*T,u); xlabel('运算点数'); ylabel('分数间隔'); t=0:length(time_error)-1; T=1/2400; subplot(312); plot(t*T,time_error); xlabel('运算点数'); ylabel('定时误差'); t=0:length(w)-1; T=1/2400; subplot(313); t=0:length(ik)-1; T=1/1200; plot(t*T,ik);title('最终的基带数据I'); len=length(ik); symbolall=ik-1i*qk; sym=zeros(1,len); ik=[0,ik]; basebandSignal=symbolall'; %% %载波同步 tic; T=1/FS; Yo = []; %给锁相环一个初始相位 Phase0 = pi/4; for frame=1:nf x = basebandSignal(frame)*exp(sqrt(-1)*(phase*frame*T+Phase0)); %phase是反馈的调整变量,用来调整输入信号的载波频率来调整跟踪频率 %将数据转换到基带 ...................................................................... Yo(frame)= dfrq; end %均衡器 OUT4 = CMA(OUT3); OUT4 = OUT4; toc; LENS = 1000;%simulink设置的是1000.这里也1000. axis([-0.5,0.5,-0.5,0.5]); subplot(133); plot(real(OUT4(LENS*(i-1)+1:LENS*i)),imag(OUT4(LENS*(i-1)+1:LENS*i)),'r.');title('CMA均衡基带数据星座图'); axis([-0.5,0.5,-0.5,0.5]); pause(0.1); end y=OUT4; T=1/2400; Tx_real=y; Tx_real=Tx_real'; t=t(1:length(Tx_real))*T; data=[t' Tx_real]; ts2= timeseries; ts2.Time=t'; ts2.Data=Tx_real; save('data2.mat','-v7.3','ts2');
标签:同步,aI,0.5,CMA,length,gardner,信号,载波 From: https://www.cnblogs.com/51matlab/p/17736676.html