UP目录
一、理论基础
人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过自身的训练,学习某种规则,在给定输入值时得到最接近期望输出值的结果。作为一种智能信息处理系统,人工神经网络实现其功能的核心是算法。BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。
基本BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。正向传播时,输入信号通过隐含层作用于输出节点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。误差反传是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据。通过调整输入节点与隐层节点的联接强度和隐层节点与输出节点的联接强度以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。
BP神经网络,即误差反馈神经网络算法。从结构上讲,BP神经网络是由一个信息的正向传播网络和一个误差的反向传播网络两个模块构成。BP神经网络的基本结构如下图所示:
从图的结构可知,BP神经网络主要由三个层次组成,包括BP神经网络的输入层,BP神经网络的隐含层以及BP神经网络的输出层。来自外部的各种信息通过BP神经网络的输入层传输进入到其隐含层进行网络运算处理,并通过输出层输出得到最终的处理结果。当BP神经网络的输出层输出结果和其预先设置的输入值的误差较大的时候,则进入BP神经网络的反向传播阶段,并进行网络权值的更新,直到输出结果和期望结果误差满足一定条件为止。
其中,信号的前向传播过程的主要步骤如下:
第一、神经网络隐含层的第i个节点的输入变量neti:
第二、神经网络隐含层的第i个节点的输出变量yi:
第三、神经网络输出层的第k个节点的输入变量netk:
第四、神经网络输出层第k个节点的输出变量ok:
二、核心程序
.....................................................................
%根据参数获得FSK和PSK区分参数
Level= (mean([len1,len2]) - mean([len3,len4]))/2;
%分别提取FSK和PSK的不同调制方式的特征参数
char1 = real(func_para_check(y_2FSKn,N0));
char2 = real(func_para_check(y_4FSKn,N0));
char3 = real(func_para_check(y_2PSKn,N0));
char4 = real(func_para_check(y_4PSKn,N0));
%通过GRNN神经网络进行训练
char = [char1;char2]';
T = [1;2]';
net_fsk = newff(char,T,5);
net_fsk = train(net_fsk,char,T);
char = [char3;char4]';
T = [1;2]';
net_psk = newff(char,T,5);
net_psk = train(net_psk,char,T);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%加载信号进行测试
%通过大量的循环测试,计算正确率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
zql = 0;
%运行的时候,尽量将下面的两个参数指标设置大点,这样结果才精确
MTKL = 100;
SNRS = [-5:0.5:5];
Bers = zeros(length(SNRS),1);
for jj = 1:length(SNRS)
for i = 1:MTKL
SNRS(jj)
i
rng(i);
%长度
N = N0;
%SNR
SNR = SNRS(jj);
%2FSK
y_2FSK = func_2FSK(N);
%4FSK
y_4FSK = func_4FSK(N);
%BPSK
y_2PSK = func_2PSK(N);
%QPSK
y_4PSK = func_4PSK(N);
%设置单独的一种调制信号
tmps = [4,4,4,4];%4PSK
if tmps(1) == 1
datas = y_2FSK;
end
if tmps(1) == 2
datas = y_4FSK;
end
if tmps(1) == 3
datas = y_2PSK;
end
if tmps(1) == 4
datas = y_4PSK;
end
datas = func_multipath(datas);
data = func_add_noise(datas,SNR);
[p,f] = func_power(data,Ns);
len = func_fsk_psk_check(p);
flag = 0;
%首先进行FSK和PSK两种模式的区分
if len >= Level%为FSK模式
%根据识别参数进行调制类型的辨识
char = real(func_para_check(data,length(data)));
T = round(net_fsk(char'));
if T == 1
flag = 1;
end
if T == 2
flag = 2;
end
else%为PSK模式
%根据识别参数进行调制类型的辨识
char = real(func_para_check(data,length(data)));
T = round(net_psk(char'));
if T == 1
flag = 3;
end
if T == 2
flag = 4;
end
end
if flag == tmps(1)
zql = zql + 1;
end
end
%识别正确率
Bers(jj) = zql/MTKL;
zql = 0;
end
up65
三、测试结果
通过matlab2021a仿真结果如下: