1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
在信道变化迅速的系统中,通常依靠频域的导频子载波进行信道估计。导频子载波按照特定的规则插入到时频两维资源中。导频子载波处的信道响应可以通过最小二乘法(least-square,ls)和线性最小均方误差法(linearminimummeansquareerror,lmmse)进行估计,其他子载波处的信道响应则通过插值得到。基于判决反馈的盲信道估计方法将判决后的数据反馈至信道估计器进行去除调制信息操作,从而得到信道响应结果。基于相位的估计算法利用dqpsk调制信号幅度恒定相位为的整数倍的特性,利用接收信号相位在乘4、模2π、除以4的操作后,所有星座点都将变换到正实轴上(相位为0,幅度为1),这一操作相当于去除了dqpsk的调制信息,无需对信号进行判决。
近几年,人工智能尤其是深度学习在无线通信物理层中也得到了广泛的应用。深度学习(Deep Learning, DL),由Hinton等人于2006年提出,是机器学习(MachineLearning, ML)的一个新领域。深度学习被引入机器学习使其更接近于最初的目标----人工智能(AI,Artificial Intelligence)。深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字、图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。深度学习是一个复杂的机器学习算法,在语言和图像识别方面取得的效果,远远超过先前相关技术。它在搜索技术、数据挖掘、机器学习、机器翻译、自然语言处理、多媒体学习、语音、推荐和个性化技术,以及其它相关领域都取得了很多成果。深度学习使机器模仿视听和思考等人类的活动,解决了很多复杂的模式识别难题,使得人工智能相关技术取得了很大进步。
在所用的结构中使用DNN的原因是,DNN是唯一可以在任何类型(有监督的和无监督的)任何地方(星座整形器,信道估计器和检测器)应用的机器学习算法。例如,即使支持向量机(它是有监督的二进制分类器),尽管其检测性能良好,但也不能应用于星座整形器或信道估计器等其他部分(因为这两个部分是无监督的。DNN是光学通信中使用最广泛的深度学习技术,并且是传统方法的适当替代方法。DNN的复杂度低,响应速度快。它可以建模复杂的多维非线性关系。由于这些优点,在FSO中应用DNN进行星座整形,信道估计和检测可以显着降低复杂性,成本,等待时间和处理,同时保持系统性能。
深度神经网络的内部神经网络有3层,第一层输入,最后一层输出,其余中间都是隐藏层,层与层之间全连接。在局部的小模型来讲和感知机是一样的,都是线性关系+激活函数,即
Layer 1: Layer 2:
Z[1] = W[1]·X + b[1] Z[2] = W[2]·A[1] + b[2]
A[1] = σ(Z[1]) A[2] = σ(Z[2])
X其实就是A[0],所以不难看出:
Layer i:
Z[i] = W[i]·A[i-1] + b[i]
A[i] = σ(Z[i])
(注:σ是sigmoid函数)
因此不管我们神经网络有几层,都是将上面过程的重复
3.MATLAB核心程序
```for i = 1:length(SNRS);
i
L = 3;
SNR = SNRS(i);
P=[1+1i,1-1i,2-1i,1+2i]';
for i=1:20000
hh = randn(3,1)+1i*randn(3,1);
yy = comsystem(P,L,hh,SNR);
h(:,i) = hh;
y(:,i) = yy;
end
n = size(y,2);
indim = size(y,1);
outdim = size(h,1);
inputdim = indim*2;
outputdim = outdim*2;
realy = real(y);
imagy = imag(y);
yy = zeros(inputdim,n);
yy(1:2:inputdim-1,:) = realy;
yy(2:2:inputdim,:) = imagy;
realh = real(h);
imagh = imag(h);
hh = zeros(outputdim,n);
hh(1:2:outputdim-1,:) = realh;
hh(2:2:outputdim,:) = imagh;
%Normalization
din = min(yy')';
Tdin = max(yy')';
trainYY = yy;
for i = 1:n
tmp = yy(:,i);
tmp = (tmp-din)./(Tdin-din);
trainYY(:,i) = tmp;
end
dout = min(hh')';
Tdout = max(hh')';
trainHH = hh;
for i = 1:n
tmp = hh(:,i);
tmp = (tmp-dout)./(Tdout-dout);
trainHH(:,i) = tmp;
end
pr = zeros(inputdim,2);
pr(:,1) = 0;
pr(:,2) = 1;
hiden = 18;
net = newff(pr,[hiden,outputdim],{'logsig','purelin'},'trainlm');
net.trainParam.lr=0.01;
net.trainParam.goal=1e-5;
net.trainParam.epochs=40;
net=train(net,trainYY,trainHH);
if SNR==1
save dat\DNN_SNR1.mat net din Tdin dout Tdout
end
if SNR==2
save dat\DNN_SNR2.mat net din Tdin dout Tdout
end
if SNR==3
save dat\DNN_SNR3.mat net din Tdin dout Tdout
end
if SNR==4
save dat\DNN_SNR4.mat net din Tdin dout Tdout
end
if SNR==5
save dat\DNN_SNR5.mat net din Tdin dout Tdout
end
if SNR==6
save dat\DNN_SNR6.mat net din Tdin dout Tdout
end
if SNR==7
save dat\DNN_SNR7.mat net din Tdin dout Tdout
end
if SNR==8
save dat\DNN_SNR8.mat net din Tdin dout Tdout
end
if SNR==9
save dat\DNN_SNR9.mat net din Tdin dout Tdout
end
if SNR==10
save dat\DNN_SNR10.mat net din Tdin dout Tdout
end
if SNR==11
save dat\DNN_SNR11.mat net din Tdin dout Tdout
end
if SNR==12
save dat\DNN_SNR12.mat net din Tdin dout Tdout
end
if SNR==13
save dat\DNN_SNR13.mat net din Tdin dout Tdout
end
if SNR==14
save dat\DNN_SNR14.mat net din Tdin dout Tdout
end
if SNR==15
save dat\DNN_SNR15.mat net din Tdin dout Tdout
end
if SNR==16
save dat\DNN_SNR16.mat net din Tdin dout Tdout
end
if SNR==17
save dat\DNN_SNR17.mat net din Tdin dout Tdout
end
if SNR==18
save dat\DNN_SNR18.mat net din Tdin dout Tdout
end
if SNR==19
save dat\DNN_SNR19.mat net din Tdin dout Tdout
end
if SNR==20
save dat\DNN_SNR20.mat net din Tdin dout Tdout
end
end
```