目录
1.源码获取方式
2.算法描述
3.部分程序
4.部分仿真图预览
1.源码获取方式
使用版本matlab2022a
获取方式1:
点击下载链接(解压密码C+123456):
基于DNN深度学习网络的OFDM信号检测算法的matlab仿真,对比LS和MMSE两个算法
获取方式2:
如果下载链接失效,加博主微信联系,或私信联系。
2.算法描述
在OFDM系统中,信道估计器的设计上要有两个问题:** 一是导频信息的选择,由于无线信道的时变特性,需要接收机不断对信道进行跟踪,因此导频信息也必须不断的传送: 二是既有较低的复杂度又有良好的导频跟踪能力的信道估计器的设计,在确定导频发送方式和信道估计准则条件下,寻找最佳的信道估计器结构。
正交频分复用(OFDM,Orthogonal Frequency Division Multiple)技术凭借抗多径能力强、频谱利用率高、易于与其他多种接入方法相结合等特性,在第四代移动通信(The Fourth Generation,4G)系统中广泛使用并被制定在多项标准中。然而,OFDM也有着因为子载波叠加而导致的峰均比过高,和经过衰落信道后产生的非线性失真、多径衰落等问题,从而会严重影响到整个通信系统的误符号率(SER)性能[2]。
传统的信号检测方法有最小二乘(LS)法和最小均方误差(MMSE)法,LS算法虽然实现起来比较简单、计算复杂度较低,但是其忽略了噪声的影响,因此其信噪比低时性能较差。MMSE算法考虑了噪声的影响,因此其性能比LS算法有所提升,但是这种性能优势需要事先知道信道的先验信息,因而实现起来较为困难,且这2种算法在导频数量较少时的信号检测性能较差。
近年来,深度学习作为人工智能的基础技术,在计算机视觉和自然语言处理等学科取得巨大的成功,在图像分类、语音识别、面部识别和机器翻译风格转换等方面超越了传统机器学习方法的性能,使得无人驾驶、智能疾病诊断和个性化推荐等应用成为可能。神经网络在无线通信领域得到一些应用,例如直接采取端到端方式神经网络代替整个无线通信系统中的信道估计与均衡模块,也有用神经网络进行对信道估计的优化。将神经网络融到迭代信号重建算法,设计一种基于深度学习去噪的近似信息传递网络,利用大量数据学习信道结构,在较短时间内有效地进行信道估计,解决了由射频链路数量有限导致的信道估计难题。
因为频谱资源十分珍贵,如果一个信道仅仅只传输一路信号,那无疑是对频谱资源的浪费, 为了能够充分利用信道带宽, 频分复用是一种很好的方法。OFDM技术是频分复用方法的一种,其基本原理如下:将串行的高速数据流转换为低速的并行数据流,然后将数据调制到相互正交的子载波上4Q。OFDM系统可以通过DFT和ID FT的方法产生相互正交的子载波,然后利用子载波之间的正交性,将原始信号从子载波中分离开来,通过这种方法可以实现OFDM无线通信系统中信号的发送与接收。
如下图所示,经过训练的神经网络以从导频符号所估计的结果作为输入,以所有符号上的信道频率响应作为输出。
从基于给定信道仿真模型的结果来看,由于能“学习”更准确的导频与数据符号之间的信道变化特性,相比于传统方案,该方案能获得更好的性能。然而,在训练阶段用所有符号上的理想信道信息作为目标优化数据,显然是难以实现的。
提供了一种基于深度学习的时变OFDM系统信号检测方法,生成信号检测网络模型输入数据集,构建一个信号检测网络模型,在网络训练前需预设好训练和测试参数,采用在线生成训练数据和测试数据的方式训练网络,测试数据喂入信号检测网络,信号检测网络模型根据喂入的特征向量,产生预测出的发送数据比特,与真实的发送数据比特进行对比,测试网络当前的性能.本发明于针对快速时变OFDM系统,结合深度学习方法,利用循环神经网络处理时间序列的优势,简化了接收机架构,成功实现信号的解调,改进了快速时变OFDM系统中的信号检测性能,本发明有效减小了系统实现复杂度,同时也提升了系统整体的误比特率性能.
针对DNN信号检测网络对OFDM系统信号检测能力不理想的情况,本文提出了LSTM信号检测网络并介绍了框架结构以及训练过程,LSTM信号检测网络主要包含输入层、LSTM层、全连接层、softmax层以及分类层,LSTM信号检测网络能够提取输入数据之间的信息,故相比于DNN网络有更好的性能,该网络需要在已有的信道模型下生成的数据进行训练,然后再将经过训练的网络放入OFDM系统进行应用。仿真表明,LSTM信号检测网络相比于传统算法在不同导频数与有无循环前缀的情况下均有较高的性能提升,与DNN信号检测网络相比,在误符号率为10~(-2)时,有了1d B的性能提升。其次,针对之前提出的LSTM信号检测网络收敛速度慢等问题,本文提出了一种基于双向长短记忆神经网络的信号检测网络,该网络主要包含:输入层、Bi LSTM层、全连接层、softmax层以及分类层。首先需要构建Bi LSTM网络,然后利用3GPP信道模型下生成的数据对已经构建好的神经网络进行训练,最后则可将训练好的神经网络应用于OFDM系统之中,对整个系统进行信号检测。
dnn结构如下:
3.部分程序
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));load('SimParametersPilot64.mat');
load('TrainedNetPilot64.mat');%2.基于深度学习(DL)计算符号错误率(SER),
%最小二乘法(LS)和最小均方误差(MMSE)。NumPilot = length(FixedPilot);
PilotSpacing = NumSC/NumPilot;
NumOFDMsym = NumPilotSym+NumDataSym;
NumClass = length(Label);
NumPath = length(h);load('RHH.mat');%% SNR rangeEs_N0_dB = 0:1:24; % Es/N0 in dB
Es_N0 = 10.^(Es_N0_dB./10); % linear Es/N0
N0 = 1./Es_N0;
NoiseVar = N0./2;%% Testing data sizeNumPacket = 10000; % Number of packets simulated per iteration%% Simulation% Same pilot sequences used in training and testing stages
FixedPilotAll = repmat(FixedPilot,1,1,NumPacket); % Number of Monte-Carlo iterations
NumIter = 1;% Initialize error rate vectors
SER_DL = zeros(length(NoiseVar),NumIter);
SER_LS = zeros(length(NoiseVar),NumIter);
SER_MMSE = zeros(length(NoiseVar),NumIter);for i = 1:NumIterfor snr = 1:length(NoiseVar)[snr,i]%% 1. Testing data generatiOnnoiseVar= NoiseVar(snr);% OFDM pilot symbol (can be interleaved with random data symbols)PilotSym = 1/sqrt(2)*complex(sign(rand(NumPilotSym,NumSC,NumPacket)-0.5),sign(rand(NumPilotSym,NumSC,NumPacket)-0.5)); PilotSym(1:PilotSpacing:end) = FixedPilotAll;% OFDM data symbolDataSym = 1/sqrt(2)*complex(sign(rand(NumDataSym,NumSC,NumPacket)-0.5),sign(rand(NumDataSym,NumSC,NumPacket)-0.5)); % Transmitted OFDM frameTransmittedPacket = [PilotSym;DataSym];% Received OFDM frameReceivedPacket = genTransmissionReceptionOFDM(TransmittedPacket,LengthCP,h,noiseVar);% Collect the data labels for the selected subcarrierDataLabel = zeros(size(DataSym(:,idxSC,:)));for c = 1:NumClassDataLabel(logical(DataSym(:,idxSC,:) == 1/sqrt(2)*Mod_Constellation(c))) = Label(c);endDataLabel = squeeze(DataLabel); % Testing data collectiOnXTest= cell(NumPacket,1);YTest = zeros(NumPacket,1); for c = 1:NumClass[feature,label,idx] = getFeatureAndLabel(real(ReceivedPacket),imag(ReceivedPacket),DataLabel,Label(c));featureVec = mat2cell(feature,size(feature,1),ones(1,size(feature,2))); XTest(idx) = featureVec;YTest(idx) = label;endYTest = categorical(YTest);%% 2. DL detectiOnYPred= classify(Net,XTest,'MiniBatchSize',MiniBatchSize);SER_DL(snr,i) = 1-sum(YPred == YTest)/NumPacket;%% 3. LS & MMSE detection% Channel estimatiOnwrapper= @(x,y) performChanEstimation(x,y,RHH,noiseVar,NumPilot,NumSC,NumPath,idxSC);ReceivedPilot = mat2cell(ReceivedPacket(1,:,:),1,NumSC,ones(1,NumPacket));PilotSeq = mat2cell(FixedPilotAll,1,NumPilot,ones(1,NumPacket));[EstChanLS,EstChanMMSE] = cellfun(wrapper,ReceivedPilot,PilotSeq,'UniformOutput',false);EstChanLS = cell2mat(squeeze(EstChanLS));EstChanMMSE = cell2mat(squeeze(EstChanMMSE));% Symbol detectionSER_LS(snr,i) = getSymbolDetection(ReceivedPacket(2,idxSC,:),EstChanLS,Mod_Constellation,Label,DataLabel);SER_MMSE(snr,i) = getSymbolDetection(ReceivedPacket(2,idxSC,:),EstChanMMSE,Mod_Constellation,Label,DataLabel);endendSER_DL = mean(SER_DL,2).';
SER_LS = mean(SER_LS,2).';
SER_MMSE = mean(SER_MMSE,2).';figure;
semilogy(Es_N0_dB,SER_DL,'r-o');
hold on;
semilogy(Es_N0_dB,SER_LS,'b-o');
hold on;
semilogy(Es_N0_dB,SER_MMSE,'k-o');legend('Deep learning','LS','MMSE');
xlabel('Es/N0 (dB)');
ylabel('Symbol error rate (SER)');
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));%% Load training and validation dataload('TrainingData.mat');
load('ValidationData.mat');%% Define training parametersMiniBatchSize = 1000;
MaxEpochs = 100;
InputSize = 2*NumOFDMsym*NumSC;
NumHiddenUnits = 16;
NumClass = length(Label);%% Form DNN layersLayers = [ ...sequenceInputLayer(InputSize)lstmLayer(NumHiddenUnits,'OutputMode','last')fullyConnectedLayer(NumClass)softmaxLayerclassificationLayer];%% Define trainig optiOnsOptions= trainingOptions('adam',...'InitialLearnRate',0.01,...'ValidationData',{XValid,YValid}, ...'ExecutionEnvironment','auto', ...'GradientThreshold',1, ...'LearnRateDropFactor',0.1,...'MaxEpochs',MaxEpochs, ...'MiniBatchSize',MiniBatchSize, ...'Shuffle','every-epoch', ...'Verbose',0,...'Plots','training-progress');%% Train DNNNet = trainNetwork(XTrain,YTrain,Layers,Options);%% Save the DNNsave('TrainedNet','Net','MiniBatchSize');
4.部分仿真图预览
A88