m基于OFDM+QPSK和LDPC编译码通信链路matlab性能仿真,包括Costas载波同步和gardner定时同步

目录

1.算法仿真效果

2.算法涉及理论知识概要

3.MATLAB核心程序

4.完整算法代码文件


1.算法仿真效果

matlab2013b仿真结果如下:

 

2.算法涉及理论知识概要

        基于OFDM+QPSK和LDPC编码的通信链路是一种常用的数字通信系统,用于实现高速、可靠的数据传输。该系统结合了正交频分复用(OFDM)、四相移键控(QPSK)调制和低密度奇偶校验(LDPC)编码与解码技术。此外,系统中还包括Costas环载波同步和Gardner环定时同步模块,用于实现信号的载波频率和定时偏移的同步。

       基于OFDM+QPSK和LDPC编码的通信链路通过将数据分成多个子载波,在频域上并行传输,提高了系统的抗多径衰落和频偏的能力。QPSK调制将每两个比特映射到一个复数点上,实现了四种相位的调制。LDPC编码是一种高效的纠错编码技术,可以提高系统的可靠性。

       基于OFDM+QPSK和LDPC编码的通信链路是一种常用的数字通信系统,用于实现高速、可靠的数据传输。该系统结合了正交频分复用(OFDM)、四相移键控(QPSK)调制和低密度奇偶校验(LDPC)编码与解码技术。此外,系统中还包括Costas环载波同步和Gardner环定时同步模块,用于实现信号的载波频率和定时偏移的同步。

系统原理
         基于OFDM+QPSK和LDPC编码的通信链路通过将数据分成多个子载波,在频域上并行传输,提高了系统的抗多径衰落和频偏的能力。QPSK调制将每两个比特映射到一个复数点上,实现了四种相位的调制。LDPC编码是一种高效的纠错编码技术,可以提高系统的可靠性。

OFDM+QPSK调制
        OFDM技术将整个频谱分成多个子载波,每个子载波之间正交传输。OFDM调制可以通过快速傅里叶变换(FFT)将时域信号转换为频域信号。QPSK调制将每两个比特映射到一个复数点上,实现了四种相位的调制。OFDM+QPSK调制将QPSK调制应用于每个子载波上的信号,实现了高效的频谱利用和抗干扰能力。

 

 LDPC编码和解码
        LDPC编码是一种误码控制编码技术,通过稀疏校验矩阵构建编码器和解码器。编码器将输入数据和校验矩阵进行矩阵运算,生成编码后的数据。解码器使用迭代解码算法,通过消息传递的方式对接收到的编码数据进行解码。LDPC编码可以提供较高的纠错能力和编码效率。

输入数据与校验矩阵的运算:

 Costas环载波同步
        Costas环载波同步模块用于估计接收信号的载波频率偏移,并进行补偿。载波频率偏移会导致接收信号的相位发生变化,因此需要通过同步来保证正确的信号接收和解调。Costas环载波同步通过估计接收信号的相位差来计算载波频率偏移,然后通过反馈控制来调整本地振荡器的频率,使其与接收信号的载波频率保持同步。

       载波频率估计误差:

 Gardner环定时同步
        Gardner环定时同步模块用于估计接收信号的定时偏移,并进行补偿。定时偏移会导致接收信号的采样时刻不准确,因此需要通过同步来恢复正确的采样时刻。Gardner环定时同步通过计算接收信号的时钟边沿间隔的平方误差来估计定时偏移,然后通过反馈控制来调整采样时钟的相位,实现接收信号的定时同步。定时偏移估计误差:

       实现该通信链路的难点在于系统各个环节的设计和优化。需要设计合适的OFDM子载波数量、保护间隔和LDPC编码参数,以及合适的Costas环和Gardner环的参数。同时,需要解决载波同步和定时同步的反馈控制问题,确保接收信号的准确解调。此外,LDPC编码的迭代解码算法和调试也是实现过程中的挑战。基于OFDM+QPSK和LDPC编码的通信链路涉及OFDM调制、QPSK调制、LDPC编码与解码以及载波同步和定时同步等环节。通过合适的参数选择和优化,可以实现高速、可靠的数据传输,并应用于各种通信系统中。

3.MATLAB核心程序

............................................................................
%%
rece        = fft(rece);
%载波同步环
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%锁相环处理过程如下
Discriminator_Out = zeros(carlen * nsamp,1);
Freq_Control      = zeros(carlen * nsamp,1);
PLL_Phase_Part    = zeros(carlen * nsamp,1);   %锁相环频率
PLL_Freq_Part     = zeros(carlen * nsamp,1);   %锁相环相位
WC_frame          = zeros(1,carlen * nsamp);
NCO_Phase         = 0;
mul               = 2;

for i = 1 + mul:carlen - mul
.................................................................................
     end
end

figure(1);
subplot(211)
plot(WC_frame((1+mul)*nsamp:end-mul*nsamp));
grid on;
title('锁相环频率响应曲线');
subplot(212)
plot(PLL_Phase_Part((1+mul)*nsamp:end-mul*nsamp)*180/pi);
title('锁相环相位响应曲线');
grid on;
    
num1 = symerr(sign(I_D(comps1:compf1)) , sign(dataoutI(comps1:compf1)));
num2 = symerr(sign(I_D(comps1:compf1)) , -sign(dataoutI(comps1:compf1)));
num3 = symerr(sign(I_D(comps1:compf1)) , sign(dataoutQ(comps1:compf1)));
num4 = symerr(sign(I_D(comps1:compf1)) , -sign(dataoutQ(comps1:compf1)));
numI = [num1,num2,num3,num4];
num = min(numI);

if num1 == num
    dataout_I = dataoutI;
elseif num2 == num
    dataout_I = -dataoutI;
elseif  num3 == num
    dataout_I = dataoutQ;
else
    dataout_I = -dataoutQ;
end
num1 = symerr(sign(Q_D(comps2:compf2)) , sign(dataoutQ(comps2:compf2)));
num2 = symerr(sign(Q_D(comps2:compf2)) , -sign(dataoutQ(comps2:compf2)));
num3 = symerr(sign(Q_D(comps2:compf2)) , sign(dataoutI(comps2:compf2)));
num4 = symerr(sign(Q_D(comps2:compf2)) , -sign(dataoutI(comps2:compf2)));
numQ = [num1,num2,num3,num4];
num = min(numQ);

if num1 == num
    dataout_Q = dataoutQ;
elseif num2 == num
    dataout_Q = -dataoutQ;
elseif  num3 == num
    dataout_Q = dataoutI;
else
    dataout_Q = -dataoutI;
end   

figure(2);
x= 5:len-5;
stem(x*4 - 18,I_Data(5:len-5),'g');hold on;
stem(I_D(9:end-8));hold on;
stem(dataout_I(9:end),'r');
 
    

%%
%位同步环
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
datarcosI = dataout_I(9:end) ;
datarcosQ = dataout_Q(9:end) ;
interplen = length(datarcosI)/nsamp;
C1        = 0.001;
C2        = C1 * 0.001;
q         = zeros(1,interplen);
m         = 5;
j         = 3;
q0        = 0.9;
%lf输出
w         = 0.5;
%插值乘法器值
s0        = 2;
%误差检测输出
Detector_out   = zeros(1,interplen);
%插值filter输出;
interp_outI    = zeros(1,interplen * 2);
interp_outQ    = zeros(1,interplen * 2);
interp_outI(1) = datarcosI(2);
interp_outI(2) = datarcosI(4);
interp_outQ(1) = datarcosQ(2);
interp_outQ(2) = datarcosQ(4);

for i = 2 : interplen - 1
     for k = 1 : nsamp
........................................................................
end

[RData] = [QPSK_demod(sign(qoutI),sign(qoutQ))]';

RData   = [0;0;0;0;0;0;0;0;RData;0;0;0;0;0;0;0;0;0;0;0;0];
RData= 2*RData-1;
msg_dec   = [];
for i = 1:47
    i
    [vhatsd,nb_itersd,successsd] = func_Dec(RData(Ns*(i-1)+1:Ns*i),newH,N0,Max_iter);
    tmps                         = vhatsd(Ms+1:Ns)';
    msg_dec                      = [msg_dec;tmps];
end
[nCodErrs BERCoded] = biterr(msg_orig(sl:sp-100), msg_dec(sl:sp-100));
BERCoded
 

figure(3);
plot(uu,'*-');

figure(4);
subplot(211)
stem(I_Data(6:end-6));hold on;
stem(qoutI(2:end),'r');
grid on;
subplot(212)
stem(Q_Data(6:end-6));hold on;
stem(qoutQ(2:end),'r');
grid on;
0X_011m

4.完整算法代码文件

V

猜你喜欢

转载自blog.csdn.net/hlayumi1234567/article/details/131794392
今日推荐