基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等
1.算法运行效果图预览
2.算法运行软件版本
MATLAB2022a
3.算法理论概述
正交频分复用(OFDM)是一种在现代通信系统中广泛使用的调制技术,它具有高效的频谱利用和抗多径衰落等特点。64QAM(64-ary Quadrature Amplitude Modulation)是一种调制方式,可以在每个符号中传输更多的位信息。在OFDM系统中,保持载波同步对确保数据传输的可靠性至关重要。
3.1 OFDM原理
OFDM将高速数据流划分为多个较低速的子载波,这些子载波之间互相正交,从而降低了子载波之间的干扰。每个子载波可以独立地调制和解调,提高了抗多径衰落和频率偏移的能力。
3.2 64QAM调制
64QAM是一种高阶调制方式,每个符号可以传输6个比特(2^6=6426=64种可能的组合)。每个符号的相位和幅度有64种可能的组合,使得64QAM适合传输更多的信息,但也对信号质量要求更高。
3.3 载波同步
在OFDM系统中,准确的载波同步是至关重要的。载波同步包括两个方面:频率同步和相位同步。频率同步旨在校准发送端和接收端的本地振荡器,以消除频率偏移。相位同步则调整接收信号的相位,以最大化解调性能。
4.部分核心程序
for ij=1:Nframe [sj,ij] %64个符号的训练序列 msg1 = round(63*rand(64,1)); msg2 = repmat(msg1,2,1); msg2_64QAM = qammod(msg2,Morder); dataPre = round(63*rand(36,1)); dataPre_64QAM = qammod(dataPre,Morder); %数据 signal = round(63*rand(nsym-2*64-36,1)); signal_64QAM = qammod(signal,Morder); Tx_din = [dataPre;msg2;signal]; Tx_bin = de2bi(Tx_din,6,'left-msb'); Tx_bin2 = Tx_bin.'; %发送数据的二进制数 Tx_bin3 = reshape(Tx_bin2,[],1); dataTxSig =[dataPre_64QAM;msg2_64QAM;signal_64QAM]; dataTx = dataTxSig.*Carrier.'; .............................................................................. %积分滤波器 PLL_Phase_Part(i)= Discriminator(i)*C1; PLL_Freq_Part(i) = Discriminator(i-1)*C2+PLL_Freq_Part(i-1); Freq_Control(i) = PLL_Phase_Part(i)+PLL_Freq_Part(i); NCO_Phase(i) = NCO_Phase(i-1)+Freq_Control(i-1); fre(i) = NCO_Phase(i)/(2*pi*i)*fs; %平滑处理 if i-len<=99 Discriminator2(i) = mean(Discriminator(len+1:i)); fre2(i) = mean(fre(len+1:i)); else Discriminator2(i) = mean(Discriminator(i-99:i)); fre2(i) = mean(fre(i-99:i)); end end if (sj==12 | sj==15)& ij==1 figure subplot(2,2,1) plot(fre2(len+1:nsym)); grid on; title('锁相环频率响应'); subplot(2,2,2) plot(NCO_Phase(len+1:nsym)); grid on; title('NCO输出相位'); subplot(2,2,3) plot(Discriminator2(len+1:nsym)); title('鉴相器输出'); grid on; subplot(2,2,4) plot(dataPhaEst(2000:end),'b*'); title('锁相环之前星座图'); grid on; figure plot(Signal_PLL(2000:end),'r.'); title('锁相环之后星座图'); grid on; end s_pll=Signal_PLL; dRx2=qamdemod(s_pll,Morder); dRx1=reshape(dRx2,[],1); dRx_bit1=de2bi(dRx1,6,'left-msb'); dRx_bit2=dRx_bit1.'; dRxbit=reshape(dRx_bit2,[],1); for m=(1200+1):nsym if dRxbit(m)~=Tx_bin3(m) err_bit(ij)=err_bit(ij)+1; end end end sum_bit_err=sum(err_bit); BER(sj)=sum_bit_err/(Nframe*(4*nsym-300*4)); end figure; semilogy(SNRss,BER,'b-o'); grid on xlabel('SNR'); ylabel('error');