基于DNN深度神经网络的OFDM+QPSK信号检测与误码率matlab仿真

目录

1.算法仿真效果

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

3.MATLAB核心程序

4.完整算法代码文件获得


1.算法仿真效果

matlab2022a仿真结果如下**(完整代码运行后无水印)**:

仿真操作步骤可参考程序配套的操作视频。

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

在现代通信系统中,高效可靠的信号检测至关重要。正交频分复用(OFDM)技术因其能有效对抗多径衰落、提高频谱效率等优点,被广泛应用于众多通信标准,如 4G、5G 移动通信以及数字视频广播等领域。正交相移键控(QPSK)则是一种常用的数字调制方式,它在有限的带宽内实现了较高的数据传输速率。然而,在复杂的通信环境中,OFDM-QPSK 信号会受到噪声、干扰等因素的影响,传统的信号检测方法在性能上存在一定的局限性。深度神经网络(DNN)以其强大的特征学习和模式识别能力,为 OFDM-QPSK 信号检测提供了新的解决方案,能够有效提升检测性能,适应复杂多变的通信场景。

DNN 是一种包含多个隐藏层的神经网络,通常由输入层、隐藏层和输出层组成。每一层由多个神经元组成,神经元之间通过权重连接。在基于 DNN 的 OFDM - QPSK 信号检测中,输入层接收经过处理的 OFDM-QPSK 信号特征,隐藏层对这些特征进行逐层提取和变换,输出层则输出检测结果。

信号预处理

DNN模型构建

确定网络的层数、每层的神经元数量、激活函数等参数。例如,对于一个简单的 MLP 模型,可能包含 3个隐藏层,每个隐藏层的神经元数量在 50 - 200 之间,激活函数可以选择 ReLU(Rectified Linear Unit)函数。在本课题中,DNN网络结构如下:

Layers = [

sequenceInputLayer(384,"Name","sequence")

fullyConnectedLayer(500,"Name","fc_1")

reluLayer("Name","relu_1")

fullyConnectedLayer(250,"Name","fc_2")

reluLayer("Name","relu_2")

fullyConnectedLayer(120,"Name","fc_3")

reluLayer("Name","relu_3")

fullyConnectedLayer(16,"Name","fc_4")

regressionLayer("Name","regressionoutput")];

DNN训练与检测

训练数据准备:收集大量的 OFDM - QPSK 信号样本,包括不同信噪比条件下的信号。对这些信号进行预处理和特征提取,得到训练数据。同时,根据信号的调制映射关系,确定每个样本的真实类别标签。

模型训练:使用训练数据对 DNN 模型进行训练,通过反向传播算法调整模型的参数,使得模型的预测结果与真实标签之间的损失函数最小化。在训练过程中,可以采用交叉验证等方法来评估模型的性能,防止过拟合。

信号检测:训练完成后,将接收到的 OFDM - QPSK 信号经过预处理和特征提取后输入到训练好的 DNN 模型中,模型输出预测结果。根据预测结果和调制映射关系,恢复出原始的二进制数据。

3.MATLAB核心程序

复制代码
        % 在数据符号位置插入 QPSK 信号
        Sym_qpsk = func_QPSKMod(dataSym);
        Msg_qpsk = reshape(Sym_qpsk, Nsubs, Nsymb);
        
        %导频插入
        Xpilot          = 1 - 1j;
        Loc_pilot       = loc_pilot : It_pilot : NFrame;
        Num_pilot_frame = length(Loc_pilot) * Nsubs;
        
        Loc_data        = 1 : NFrame;
        Loc_data(Loc_pilot(:)) = [];
        
        dat_ifft        = zeros(NFFT-1,NFrame);
        
        dat_ifft(:, Loc_pilot(:)) = Xpilot;
        dat_ifft(:, Loc_data(:))  = Msg_qpsk;
        
        dat_ifft                  = [zeros(1, NFrame); dat_ifft];
        
        %OFDM发射
        Tx_ofdm                   = func_TOFDM(dat_ifft, NFFT, NCP);
 
        %Channel
        OFDM_ch                   = (1 / sqrt(2)) * randn(Nsymb2, 1) + (1 / sqrt(2)) * 1j * randn(Nsymb2, 1);
        OFDM_ch_sp                = repmat(OFDM_ch, NFrame, 1);
        
        Rx_ofdm0                  = OFDM_ch_sp .* Tx_ofdm;
        Rx_ofdm0                  = awgn(Rx_ofdm0,SNR,'measured');
        Hch_ideal                 = Rx_ofdm0 ./ OFDM_ch_sp;
...................................................................
        % Deep learning
        [Rx_ofdm_feature, ~] = func_ofdm_feature(Rx_ofdm, Msg_qpsk(1:8));
        Rx_de_H_dnn          = predict(DNN_Trained, Rx_ofdm_feature);
        Rx_de_H_dnn2         = Rx_de_H_dnn(1:2:end, :) + 1j * Rx_de_H_dnn(2:2:end, :);
        Rx3_de_qpsk          = func_QPSKDemod(Rx_de_H_dnn2);
        Rx3_de_qpsk2         = de2bi(Rx3_de_qpsk, 2);
        Rx_de_qpsk_dnn       = reshape(Rx3_de_qpsk2, [], 1);
.................................................
figure;
semilogy(SNRs,ber_ls,'-k<',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.3,0.9,0.3]);
hold on
semilogy(SNRs,ber_mmse,'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on
semilogy(SNRs,ber_dnn,'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
grid on
xlabel('SNR');
ylabel('BER');
legend('LS','MMSE','DNN');


figure;
semilogy(SNRs,ser_ls,'-k<',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.3,0.9,0.3]);
hold on
semilogy(SNRs,ser_mmse,'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on
semilogy(SNRs,ser_dnn,'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
grid on
xlabel('SNR');
ylabel('SER');
legend('LS','MMSE','DNN');
0X_075m

4.完整算法代码文件获得

V

相关推荐
Evand J9 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
星夜离尘561 天前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Evand J3 天前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
严肃小白兔4 天前
MATLAB 绘图与科研论文插图制作:图形设计、统计表达与矢量导出
开发语言·matlab·科研绘图
严肃小白兔5 天前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
Evand J6 天前
【PMSM例程】(14)永磁同步电机无迹卡尔曼滤波(UKF)定子电阻在线辨识与补偿。电阻变化跟踪及预测误差对比仿真。附完整代码的下载链接
matlab·电机·滤波·卡尔曼滤波·永磁同步电机·无迹卡尔曼滤波·pmsm
爱喝雪碧的可乐6 天前
MATLAB
开发语言·算法·matlab
严肃小白兔6 天前
MATLAB 优秀开源项目与工具箱推荐:涵盖通信、图像处理、脑机接口等九大领域
图像处理·matlab·信息与通信·开源项目
Evand J8 天前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
分享资料9 天前
MATLAB 中分号 (;)的作用
matlab