基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM

69 阅读2分钟

1.算法仿真效果

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

1.jpeg

2.jpeg

3.jpeg  

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

 

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

       正交幅度调制(QAM)是一种广泛应用于现代通信系统中的调制技术,其具有较高的频谱效率和抗噪声性能。随着通信技术的不断发展,对 QAM 调制信号的准确检测变得至关重要。传统的信号检测方法在复杂的通信环境下可能面临性能下降的问题。近年来,深度学习技术,特别是循环神经网络(RNN),在信号处理领域展现出了巨大的潜力。门控循环单元(GRU)网络作为一种改进的 RNN 结构,具有更高效的训练和更好的性能表现。

 

       QAM 是一种将幅度调制和相位调制相结合的调制方式。对于 M-QAM(M 为调制阶数,如 16QAM、32QAM、64QAM、128QAM 等),信号可以表示为:

3bc44d346fd40515c78b2bbc79b27670_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

       GRU 是一种门控循环单元,它的主要目的是解决传统 RNN 在处理长序列数据时出现的梯度消失和梯度爆炸问题。GRU 由更新门和重置门组成。

 

277942ea52eab0eda9460bc24f8fd1af_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

GRU 的计算过程:

 

a6500526568c0c06b958d584c1fb1bc5_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

      基于 GRU 网络的 QAM 调制信号检测算法通过利用 GRU 的门控机制,能够有效地提取 QAM 调制信号的时间序列特征,实现对不同调制阶数(16QAM、32QAM、64QAM、128QAM)的准确检测。与 LSTM 相比,GRU 具有更少的参数和更快的训练速度,在一些情况下(snr较低时)能够取得与 LSTM 相当甚至更好的性能,而当SNR较高时,LSTM性能则优于GRU。在实际应用中,可以根据具体的需求和计算资源选择合适的网络结构。

 

3.MATLAB核心程序 `%调制:16:16QAM,64:64QAM

Midxs     = [16,32,64,128];

YTest = categorical(YTest,[1 0],{'Y','N'});

 

 

False_detect  = zeros(length(YTest(1,:)),1);

Miss_detect   = zeros(length(YTest(1,:)),1);

Accuracy      = zeros(length(YTest(1,:)),1);

count1        = 0;

count2        = 0;

for ij=1:length(YTest(1,:))

    %调用模型进行预测识别

    temp = classify(net,XTest(:,ij));

    

    for n=1:length(temp)

        if YTest(n,ij) == 'Y'

            if temp(n) ~= YTest(n,ij)

                False_detect(ij) = False_detect(ij) + 1;

            end

            count1 = count1 + 1;

        end    

        if YTest(n,ij) == 'N'

            if temp(n) ~= YTest(n,ij)

                Miss_detect(ij) = Miss_detect(ij) + 1;

            end

            count2 = count2 + 1;

        end

    end

    False_detect(ij) = False_detect(ij)/count1;

    Miss_detect(ij)  = Miss_detect(ij)/count2;

    Accuracy(ij)     = 1 - sum(temp~=YTest(:,ij))/length(temp);

end

 

SNR = [-40 : 2 : 10];

 

% 绘制准确率图

if Midx == 16

    save R\gru_1.mat SNR Accuracy  Miss_detect False_detect

end

if Midx == 32

    save R\gru_2.mat SNR Accuracy  Miss_detect False_detect

end

if Midx == 64

    save R\gru_3.mat SNR Accuracy  Miss_detect False_detect

end

if Midx == 128

    save R\gru_4.mat SNR Accuracy  Miss_detect False_detect

end

end`