基于OFDM+QPSK的通信系统误码率matlab仿真,对比不同同步误差对系统误码率的影响

目录

1.算法运行效果图预览

2.算法运行软件版本

3.部分核心程序

4.算法理论概述

1.1 OFDM 原理

1.2 QPSK 原理

1.3 同步误差对系统性能的影响

5.算法完整程序工程


1.算法运行效果图预览

2.算法运行软件版本

MATLAB2022A

3.部分核心程序

...............................................................
    for ij3=[-20,0,20]  % 同步误差
    
        if Pilot_OFDM(1) == -1 
           H = exp(1i*2*pi*[1:NFFT]*ij3/NFFT);
           HInv = 1./H;
        end

        for snr = SNRs

            Rdata = awgn(Subframe,snr,'measured'); % 添加 AWGN 噪声

             for ij4 = 0:NSymbol-1
                 OFDMSymbol     =  Rdata(ij4*(OFDMSymLen)+1: (ij4+1)*OFDMSymLen);     
                 if ij3 <= 0  
                    OFDM_Sym_cp = OFDMSymbol(CPLen+1+ij3:OFDMSymLen+ij3); 
                 else 
                    OFDM_Sym_cp =[OFDMSymbol(CPLen+1+ij3:OFDMSymLen) zeros(1,ij3)];
                 end
                 QPSK_Sym = (fft(OFDM_Sym_cp,NFFT)/sqrt(NFFT));
                 %信道估计使用导频符号
                 if sum(ij4 == Pilot_OFDM) && Pilot_OFDM(1) ~= -1
                    H             = zeros(1,NFFT);
                    H(Loc_Pilot)  = (QPSK_Sym(Loc_Pilot)/PilotSymbol);
                    H(find(H==0)) = interp1(Loc_Pilot,H(Loc_Pilot),find(H==0));
                    HInv          = 1./H;
                 end
                
                 QPSK_Sym = HInv.*QPSK_Sym ./ (abs(HInv));
                 if sum(ij4 == Pilot_OFDM)&& Pilot_OFDM(1) ~= -1 
                    QPSK_Sym2 = QPSK_Sym(Loc_Carriers);
                 else
                    QPSK_Sym2 = QPSK_Sym(Data_Carriers);
                 end
        end
        Index = 1;
        BER2    = [BER2;BER1 ];
        plotIdx = plotIdx+1;
    end
    BER3= BER3+BER2;   
end

figure;
semilogy(SNRs,BER3(1,:)/1000,'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on
semilogy(SNRs,BER3(2,:)/1000,'k-^',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.2,0.9,0.5]);
hold on
semilogy(SNRs,BER3(3,:)/1000,'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
hold on
xlabel(' SNR(db)');
ylabel(' BER1 ');
legend('同步误差:-20','无同步误差','同步误差:20');
grid on    
0041 

4.算法理论概述

1.1 OFDM 原理

         OFDM 是一种多载波调制技术,将高速数据流分成多个低速数据流,每个低速数据流用不同的正交子载波传输,从而提高了频谱利用率和抗多径衰落的能力。

1.2 QPSK 原理

        QPSK 是一种基于相位的调制方式,将每两个连续的比特映射到不同的相位状态,实现数据的传输。

1.3 同步误差对系统性能的影响

        同步误差是指接收端时钟与发送端时钟之间的时间偏移,它可能由于时钟漂移、频率偏差、采样时刻的不准确等原因引起。在 OFDM 系统中,同步误差会导致接收端无法准确地解析每个子载波的相位和幅度,从而影响信号的解调和数据的正确解析。

       同步误差会导致解调时的相位和幅度失配,从而增加信号的误码率。特别是在高信噪比条件下,同步误差对误码率的影响更为显著,因为此时信号的主要误差源来自同步误差。

        同步误差引起的频偏和相位失配会导致解调后的信号失真。失真的信号可能无法正确解析,甚至无法通过信号解析器,从而造成严重的通信质量问题。

5.算法完整程序工程

OOOOO

OOO

O

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于 DCO-OFDM 的 NOMA 可见光通信系统误码率仿真Matlab 代码: ```matlab clear all; close all; clc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%% N = 1024; % 子载波数量 M = 4; % 调制方式 Nsc = 84; % 子载波数量 Np = 4; % 子载波组数 Noma = 2; % NOMA用户数量 Pl = [0.5 0.5]; % NOMA功率分配系数 L = Nsc * Np * Noma; % 总比特数 snr = 0:2:20; % 信噪比范围 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 生成 QPSK 调制的符号集合 QPSK = [-1-1i,-1+1i,1-1i,1+1i]/sqrt(2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 生成随机数据 data = randi([0,1],L,1); % 生成 QPSK 调制符号 symbo = qammod(data,M); %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 信道编码 % interleave interleaverIndices = reshape(1:L, Nsc, []); interleavedData = symbo(interleaverIndices); % DCO-OFDM % 加载PAM映射表 load('PAM_mapping_7_84.mat'); % 分组 blocks = reshape(interleavedData, Nsc, []); % PAM 映射 pamMapped = PAM_mapping(blocks,PAM_mapping_table); % IFFT ifftOut = ifft(pamMapped, Nsc, 1); % 循环前缀 CP = ifftOut(end-15:end, :); ofdmOut = [CP; ifftOut]; % 串并转换 serialOut = ofdmOut(:); % 光电转换 I = real(serialOut); Q = imag(serialOut); %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % NOMA % 分组 I_blocks = reshape(I, Nsc*Np, []); Q_blocks = reshape(Q, Nsc*Np, []); % 矩阵变换 I_new = zeros(Nsc*Np,Noma); Q_new = zeros(Nsc*Np,Noma); I_new(:,1) = I_blocks(:,1); Q_new(:,1) = Q_blocks(:,1); I_new(:,2) = I_blocks(:,2); Q_new(:,2) = Q_blocks(:,2); % NOMA多用户干扰消除 I_Noma = zeros(Nsc*Np,1); Q_Noma = zeros(Nsc*Np,1); for i=1:Nsc*Np I_Noma(i,1) = Pl(1)*I_new(i,1) + Pl(2)*I_new(i,2); Q_Noma(i,1) = Pl(1)*Q_new(i,1) + Pl(2)*Q_new(i,2); end % 串并转换 I_Noma_blocks = reshape(I_Noma, Nsc, Np); Q_Noma_blocks = reshape(Q_Noma, Nsc, Np); I_Noma_serialOut = I_Noma_blocks(:); Q_Noma_serialOut = Q_Noma_blocks(:); % 光电转换 I_Noma_serialOut = I_Noma_serialOut(:); Q_Noma_serialOut = Q_Noma_serialOut(:); %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % AWGN信道 for i=1:length(snr) % 信道增益 h = sqrt(0.5)*(randn(1,1)+1i*randn(1,1)); % 加性高斯白噪声 noise = sqrt(0.5/(10^(snr(i)/10)))*(randn(length(serialOut),1)+1i*randn(length(serialOut),1)); % 接收信号 receivedSignal = h*I_Noma_serialOut + noise; % 光电转换 receivedI = real(receivedSignal); receivedQ = imag(receivedSignal); % 串并转换 receivedI_blocks = reshape(receivedI, Nsc, Np); receivedQ_blocks = reshape(receivedQ, Nsc, Np); receivedI_ofdmOut = [receivedI_blocks; receivedI_blocks(end-15:end,:)]; receivedQ_ofdmOut = [receivedQ_blocks; receivedQ_blocks(end-15:end,:)]; receivedI_ifftOut = fft(receivedI_ofdmOut, Nsc, 1); receivedQ_ifftOut = fft(receivedQ_ofdmOut, Nsc, 1); % PAM解映射 receivedI_index = PAM_demapping(receivedI_ifftOut,PAM_mapping_table); receivedQ_index = PAM_demapping(receivedQ_ifftOut,PAM_mapping_table); % 解交织 deinterleavedI = receivedI_index(interleaverIndices); deinterleavedQ = receivedQ_index(interleaverIndices); % 解调制 demodulatedI = qamdemod(deinterleavedI,M); demodulatedQ = qamdemod(deinterleavedQ,M); % 转回实部和虚部 demodulatedI = real(demodulatedI); demodulatedQ = real(demodulatedQ); % 计算误码率 [numErrors(i),ber(i)] = biterr(data,[demodulatedI;demodulatedQ]); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 绘图 semilogy(snr,ber,'-bo','LineWidth',2,'MarkerSize',8); grid on; xlabel('SNR(dB)'); ylabel('BER'); title('DCO-OFDM NOMA可见光通信系统误码率仿真'); ``` 需要注意的是,上述代码中用到了几个辅助函数,需要自行编写或下载相应的实现。具体如下: 1. PAM_mapping.m:用于进行 PAM 映射的函数。 ```matlab function PAM_out = PAM_mapping(PAM_in,PAM_table) PAM_out = zeros(size(PAM_in)); for i=1:size(PAM_in,2) PAM_out(:,i) = PAM_table(PAM_in(:,i)+1,i); end end ``` 2. PAM_demapping.m:用于进行 PAM 解映射的函数。 ```matlab function PAM_out = PAM_demapping(PAM_in,PAM_table) PAM_out = zeros(size(PAM_in)); for i=1:size(PAM_in,2) [~,PAM_out(:,i)] = min(abs(PAM_in(:,i)-PAM_table(:,i)),[],1); PAM_out(:,i) = PAM_out(:,i)-1; end end ``` 3. PAM_mapping_table.mat:PAM 映射表。可以通过以下代码生成: ```matlab PAM_table = [-7 -5 -3 -1 1 3 5 7; -3 -1 1 3 -3 -1 1 3]; save('PAM_mapping_table.mat','PAM_table'); ``` 希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简简单单做算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值