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)/(2pii)*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(4nsym-300*4));
end
figure;
semilogy(SNRss,BER,'b-o');
grid on
xlabel('SNR');
ylabel('error');
```