目的: 实现6种(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)调制信号自动调制识别。

条件:windows 10,MATLAB 2014a

内容: 本实验设计了一个分层结构的MLP神经网络分类器。该分类器使用BP算法,自适应改变判决门限,6种调制信号的整体平均识别率为96.94。

更多内容查看:word版(内附完整源代码)下载地址:http://download.csdn.net/download/lanluyug/9923631

一、数字通信调制信号matlab实现原理

1.1二进制振幅键控(2ASK)

振幅键控,就是根据基带信号改变载波的幅度。最简单的实现方式是载波的频率不变,使用二进制信号“0”和“1”控制。2ASK信号可以表示成一个单极性矩形脉冲序列与一个正弦波相乘,其时域表达式为:

其中matlab代码实现2ASK为:

% 2ASK signal

x=randint(1,M);               %M为64,x为随机生成的1*64的随机矩阵(矩阵元素由0和1组成)

m=sin(2*pi*fc*t);    %载波信号

y=ones(1,M*N);               %M=64,N=200,y为1*12800的全1矩阵

for i=1:M

for j=1:N

y((i-1)*N+j)=x(i)*m(j);        %随机生成的2ASK信号

end

end

原理:使用randint()函数生成1*M的随机矩阵(此矩阵由0和1两种元素组成);此时矩阵x=randint()可充当单极性矩形脉冲序列,最后两层嵌套循环生成2ASK信号:y((i-1)*N+j)=x(i)*m(j);

1.2二进制频移键控(2FSK)

频移键控,就是根据基带信号改变载波的频率。二进制频移键控,是指调制信号“0”和“1”分别对应载波的两个频率f1和f2。此时2FSK信号可以看成调整幅度为0和1的两个2ASK信号的叠加,其时域表达式为:

式子中g(t)为单个矩阵脉冲,脉宽为Ts

其中an取值如下:

其中matlab代码实现2FSK为:

%2FSK signal

x=randint(1,M);

m1=sin(2*pi*fc*t);  %载频信号1

m2=sin(2*pi*2*fc*t);      %载频信号2

y=zeros(1,M*N);

for i=1:M

if x(i)==1;

for j=1:N;

y((i-1)*N+j)=x(i)*m1(j);    %码元信息为1时,为m1频率波形

end

elseif  x(i)==0;

for j=1:N;

y((i-1)*N+j)=(1-x(i))*m2(j); %码元信息为0时,为m2频率波形

end

end

end

原理:使用randint()函数生成1*M的随机矩阵(此矩阵由0和1两种元素组成);此时矩阵x=randint()可充当单极性矩形脉冲序列,然后两层嵌套for循环加if判断x[i]生成两类2ASK信号,最后叠加成2FSK信号:x[i]=1时,y((i-1)*N+j)=x(i)*m1(j); x[i]=0时,y((i-1)*N+j)=(1-x(i))*m2(j)。

1.3二进制相移键控(2PSK)

二进制相移键控(2PSK)是载波的相位随着二进制数字基带信号而变化,而振幅和频率保持不变。2PSK信号的时域表达式为:

式子中是相移常数,式子中是基带序列为“0”和“1”控制。

%2PSK signal,

x=randint(1,M);

m1=sin(2*pi*fc*t);

m2=sin(2*pi*fc*t+pi);

y=zeros(1,M*N);

for i=1:M

if x(i)==1;

for j=1:N;

y((i-1)*N+j)=x(i)*m1(j);

end

elseif  x(i)==0;

for j=1:N;

y((i-1)*N+j)=(1-x(i))*m2(j);

end

end

end

原理:使用randint()函数生成1*M的随机矩阵(此矩阵由0和1两种元素组成);此时矩阵x=randint()可充当单极性矩形脉冲序列,然后两层嵌套for循环加if判断x[i]生成两类相位相差π的2ASK信号,最后叠加成2PSK信号:当x[i]=1时,m1=sin(2*pi*fc*t); y((i-1)*N+j)=x(i)*m1(j); 当x[i]=0时,m2=sin(2*pi*fc*t+pi);

y((i-1)*N+j)=(1-x(i))*m2(j)。

1.4总结

4ASK,4FSK,4PSK调制信号matlab代码采用类似手段构成,在此不作介绍,详细信息可以参考最后附录的源代码。再者,本次实验设置参数如下:载波频率fc=20000;采样频率fs=40000;信息码元长度=15*round(k*fs/fc); 信号长度t0=5.5; 采样点个数Ns=256; 符号速率fd=200; 码元个数M=64,信噪比SNR=5dB;更多细节可参考附录源代码,本人在多数代码后面都写有注释。

二、自动调制识别设计与仿真

目前,自动调制识别方法可以分为两大类:统计判决理论方法和统计模式识别方法。本次报告词用后者。

一个通用的模式识别系统由信号预处理、特征提取和分类识别三部分组成。根据识别部分采用不同又可以分为基于决策理论的信号调制识别、基于人工神经网络的信号调制识别和基于支持向量机的信号调制识别。下图为自动调制识别一般流程:

2.1 调制信号特征参数选取

E.E.Azzouz和A.K.Nandi发表多篇调制信号识别的类似文章,利用他们提出的五个参数,采用判决数的方法对数字信号集(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)进行识别分类,在信噪比10dB时,识别率高于90%,在信噪比为20dB时,识别率高于96%。

2.2 神经网络分类器概述

人工神经网络(ANN)是仿生物神经网络的结构提出的,他是由大量简单的计算单元(节点)相互连接而构成的一种并行分布式处理网络。神经网络的分布处理以及它所特有的高度容错性、自组织和自学习能力使它在自动调制识别领域具有很强的应用能力。

神经网络分类器一般由许多个计算节点组成,每个节点只有一个输出,而这个输出可以连接很多其他的计算节点,每个节点的输入有很多个连接通路,每个连接通路对应于一个连接权系数。

(1)       每个节点具有一个状态变量;

(2)       节点i到节点j有一个权系数;

(3)       每个节点有一个阈值;

在通信信号自动调制识别应用中,一般选用基于有监督训练的神经网络模型作为分类器,特别是各种有监督训练的前馈神经网络,其中的MLP(多层感知器)和RBF(径向基函数神经网络)是最常用的两种模型。

2.3分类器设计

(1)隐含层数的选择

本文设计的神经网络分类器是一个具有三层网络结构的神经网络分类器:输入层、一个隐藏层和输出层。输入层到隐含层采用的传递函数(激活函数)是S型对数函数logsig,隐含层到输出层采用的传递函数是S型正切函数tansig。

两个函数的笛卡尔坐标图分别为:

    

(2)隐含层节点数的确定

由于ANN是一个极为复杂的非线性动态系统,因此很难找到有关其特征、容量一类的简洁解析表达式,常用的一个确定隐含层节点的方法为试凑法:先设置较少的隐含节点训练网络,然后逐渐增加隐含点,用同一样本集进行训练,从中确定网络误差最小时对应的隐节点数。在用试凑法时,可以用一些确定的隐节点数的经验公式。

ANN最常见的试凑法的经验公式如下:

(3)训练样本集与测试样本集

6种(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)调制信号的目标结果以1,2,3,4,5,6来表示。本文选取的训练样本集包含了这六种调制信号的特征参数向量各200组,测试样本集为包含了这6种调制信号特征参数向量各60组。

%  6种(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)调制信号的自动调制识别matlab2014a

clear all;

close all;

echo off; %神经网络训练时不显示每一步的梯度和误差性能

fc=20000; %载波频率

fs=40000; %采样速率

k=2;         %常用系数k为2

code_size=15*round(k*fs/fc);             %信息码元长度

t0=5.5;                               %信号长度

Ns=256;                              %采样点个数

fd=200;                              %符号速率

ts=1/fs;                               %采样周期

M=64                                %码元个数

ti=1/fd;                               %码元间隔 N=200

N=ti/ts

t=[0:ts:t0];

select=menu('调制方式','2ASK','2FSK','2PSK','4ASK','4FSK','4PSK');

switch select

case 1,                                % 2ASK signal

x=randint(1,M);               %M为64,x为随机生成的1*64的随机矩阵(矩阵元素由0和1组成)

m=sin(2*pi*fc*t);    %载波信号

y=ones(1,M*N);               %M=64,N=200,y为1*12800的全1矩阵

for i=1:M

for j=1:N

y((i-1)*N+j)=x(i)*m(j);        %随机生成的2ASK信号

end

end

T=zeros(6,50);                  %T为6*50的全0矩阵

T(1,1:50)=1;                    %将矩阵T第一行全部置1

case 2,                                 %2FSK signal

x=randint(1,M);

m1=sin(2*pi*fc*t);  %载频信号1

m2=sin(2*pi*2*fc*t);      %载频信号2

y=zeros(1,M*N);

for i=1:M

if x(i)==1;

for j=1:N;

y((i-1)*N+j)=x(i)*m1(j);    %码元信息为1时,为m1频率波形

end

elseif  x(i)==0;

for j=1:N;

y((i-1)*N+j)=(1-x(i))*m2(j); %码元信息为0时,为m2频率波形

end

end

end

T=zeros(6,50);

T(2,1:50)=1;

case 3,                                 %2PSK signal,

x=randint(1,M);

m1=sin(2*pi*fc*t);

m2=sin(2*pi*fc*t+pi);

y=zeros(1,M*N);

for i=1:M

if x(i)==1;

for j=1:N;

y((i-1)*N+j)=x(i)*m1(j);

end

elseif  x(i)==0;

for j=1:N;

y((i-1)*N+j)=(1-x(i))*m2(j);

end

end

end

T=zeros(6,50);

T(3,1:50)=1;

case 4,                                 % 4ASK signal

x=randint(1,M,4);

m=sin(2*pi*fc*t);

y=ones(1,M*N);

for i=1:M

if x(i)==0;

for j=1:N

y((i-1)*N+j)=x(i)*m(j);

end

elseif x(i)==1;

for j=1:N

y((i-1)*N+j)=x(i)*m(j);

end

elseif x(i)==2;

for j=1:N

y((i-1)*N+j)=x(i)*m(j);

end

elseif x(i)==3;

for j=1:N

y((i-1)*N+j)=x(i)*m(j);

end

end

end

T=zeros(6,50);

T(4,1:50)=1;

case 5,                                 % 4FSK signal

x=randint(1,M,4);

m1=sin(2*pi*fc*t);

m2=sin(2*pi*2*fc*t);

m3=sin(2*pi*3*fc*t);

m4=sin(2*pi*4*fc*t);

y=zeros(1,M*N);

for i=1:M

if x(i)==0;

for j=1:N

y((i-1)*N+j)=(1-x(i))*m1(j);

end

elseif x(i)==1;

for j=1:N

y((i-1)*N+j)=x(i)*m2(j);

end

elseif x(i)==2;

for j=1:N

y((i-1)*N+j)=(x(i)-1)*m3(j);

end

elseif x(i)==3;

for j=1:N

y((i-1)*N+j)=(x(i)-2)*m4(j);

end

end

end

plot(y)

T=zeros(6,50);

T(5,1:50)=1;

case 6,                                     %4PSK signal

x=randint(1,M,4);

m1=sin(2*pi*fc*t);

m2=sin(2*pi*fc*t+pi/2);

m3=sin(2*pi*fc*t+pi);

m4=sin(2*pi*fc*t+3*pi/2);

y=zeros(1,M*N);

for i=1:M

if x(i)==0;

for j=1:N

y((i-1)*N+j)=(1-x(i))*m1(j);

end

elseif x(i)==1;

for j=1:N

y((i-1)*N+j)=x(i)*m2(j);

end

elseif x(i)==2;

for j=1:N

y((i-1)*N+j)=(x(i)-1)*m3(j);

end

elseif x(i)==3;

for j=1:N

y((i-1)*N+j)=(x(i)-2)*m4(j);

end

end

end

T=zeros(6,50);

T(6,1:50)=1;

end

SNR=5;                                    %定义信噪比,单位dB

sigpow=mean(abs(y).^2);                       %power of input signal

noisefac=10^(-SNR/10);

noise=randn(1,size(y,2));

noise=noise*(sqrt(sigpow*noisefac)/sqrt(mean(noise.^2)));      %产生所需的高斯噪声

ynoise=noise+y;                               %加噪后的信号

for n=1:1:50

m=n*Ns;

x=(n-1)*Ns;

for i=x+1:m;                                  %提取信号段

y0(i)=ynoise(i);

end

Y=fft(y0);                                    %调制信号的傅立叶变换

y1=hilbert(y0);                                %实信号的解析式

z=abs(y0);                                    %实信号的瞬时幅度

phase=angle(y1);                              %实信号的瞬时相位

add=0;                                       %求Rmax

for i=x+1:m;

add=add+z(i);

end

ma=add/Ns;                                 %瞬时幅度的平均值

y2=z./ma  ;                                 %幅度比,即为文献中的an(i)

y2n=y2-1;                                    %归一化瞬时幅度

Rmax=max(abs(fft(y2n.^2)/Ns));%零中心归一化瞬时幅度的谱密度的最大值

Xcn=0;

Ycn=0;

for i=x+1:m;

Xcn=Xcn+y2n(i).*y2n(i);

Ycn=Ycn+abs(y2n(i));

end

Xcnav=Xcn/Ns;

Ycnav=(Ycn/Ns).*(Ycn/Ns);

deltaaa=sqrt(Xcnav-Ycnav);               %零中心归一化瞬时幅度绝对值得标准偏差

if  phase(2+x)-phase(1+x)>pi;             %修正相位序列

Ck(1+x)=-2*pi;

elseif  phase(1+x)-phase(2+x)>pi;

Ck(1+x)=2*pi;

else Ck(1+x)=0;

end

for i=x+2:m-1;

if   phase(i+1)-phase(i)>pi;

Ck(i)=Ck(i-1)-2*pi;

elseif  phase(i)-phase(i+1)>pi

Ck(i)=Ck(i-1)+2*pi;

else

Ck(i)=Ck(i-1);

end

end

if  -phase(m)>pi;

Ck(m)=Ck(m-1)-2*pi;

elseif phase(m)>pi;

Ck(m)=Ck(m-1)+2*pi;

else Ck(m)=Ck(m-1);

end

phase1=phase+Ck                       %去相位卷叠后的相位序列

phasenl=phase1-2*pi*fc*i/fs;              %非线性相位

at=1;                             %判决门限电平

a=0;   %求取零中心非弱信号段瞬时相位非线性分量绝对值的标准偏差和零中心非弱信号段瞬时相位非线性分量的标准偏差

b=0;

d=0;

c=0;

for i=x+1:m;

if y2(i)>at

c=c+1;

phasesquare(i)=phasenl(i).*phasenl(i);

a=a+phasesquare(i);

phaseabs(i)=abs(phasenl(i));

b=b+phaseabs(i);

d=d+phasenl(i)

end

end

a1=a/c;

b1=(b/c).*(b/c);

d1=(d/c).*(d/c);

deltaap=sqrt(a1-b1);    %零中心非弱信号段瞬时相位非线性分量绝对值的标准偏差

deltadp=sqrt(a1-d1);    %零中心非弱信号段瞬时相位非线性分量的标准偏差

freqN(i)=phase1(i)-phase1(i-1);

for i=x+1:m;

if i>at;

c=c+1;

freqNsquare(i)=freqN(i).*freqN(i);

a=a+freqNsquare(i);

b=b+freqN(i);

end

end

a1=a/c;

b1=(b/c)^2;

deltaaf=sqrt(a1-b1);           %零中心归一化非弱信号段瞬时频率绝对值得标准偏差

Pi=rand(5,50);

P0=rand(5,50);

Pi(5*n-4)=Rmax;

Pi(5*n-3)=deltaap;

Pi(5*n-2)=deltadp;

Pi(5*n-1)=deltaaa;

Pi(5*n)=deltaaf;

end

%采用BP网络

%NEWCF--生成一个新的前向神经网络

%TRAIN--对网络进行训练

% 定义训练样本

%Pi为输入矢量

%T为目标矢量

%创建一个新的前向神经网络 

net=newff(minmax(Pi),[5,15,6],{'tansig','purelin','logsig'},'traingda');

%设置训练参数

net.trainParam.show=50; %两次显示之间的训练步数

net.trainParam.lr=1; %

net.trainParam.mc=0.5;

net.trainParam.epochs=2000; %训练次数

net.trainParam.goal=1e-3; %训练目标

%调用TRAINGDM算法训练网络

[net,tr]=train(net,Pi,T);

%对网络进行仿真

A=sim(net,Pi);

E=T-A;

T1=zeros(6,50);

T1(1,1:50)=1;

E1=0;

for c=1:1:300

Eout=(T1(c)-A(c))^2;

E1=Eout+E1 ;

end

T2=zeros(6,50);

T2(2,1:50)=1;

E2=0;

for c=1:1:300

Eout=(T2(c)-A(c))^2;

E2=Eout+E2;

end

T3=zeros(6,50);

T3(3,1:50)=1;

E3=0;

for c=1:1:300

Eout=(T3(c)-A(c))^2;

E3=Eout+E3;

end

T4=zeros(6,50);

T4(4,1:50)=1;

E4=0;

for c=1:1:300

Eout=(T4(c)-A(c))^2;

E4=Eout+E4;

end

T5=zeros(6,50);

T5(5,1:50)=1;

E5=0;

for c=1:1:300

Eout=(T5(c)-A(c))^2;

E5=Eout+E5;

end

T6=zeros(6,50);

T6(6,1:50)=1;

E6=0;

for c=1:1:300

Eout=(T6(c)-A(c))^2;

E6=Eout+E6;

end

E0=0;

if (E1>E2)

E0=E2;

else E0=E1;

end

if (E3<E0)

E0=E3;

end

if (E4<E0)

E0=E4;

end

if (E5<E0)

E0=E5;

end

if (E6<E0)

E0=E6;

end

E0;

if (E0==E1)

type=menu('输入信号是','2ASK信号');

end

if (E0==E2)

type=menu('输入信号是','2FSK信号');

end

if(E0==E3)

type=menu('输入信号是','2PSK信号');

end

if(E0==E4)

type=menu('输入信号是','4ASK信号');

end

if(E0==E5)

type=menu('输入信号是','4FSK信号');

end

if(E0==E6)

type=menu('输入信号是','4PSK信号');

end

%计算正确识别率sita

sita=0;

j=0;

for nn=1:1:50

Ee=(E(6*nn-5)^2)+(E(6*nn-4)^2)+(E(6*nn-3)^2)+(E(6*nn-2)^2)+(E(6*nn-1)^2)+(E(6*nn)^2);

if Ee<0.01

j=j+1

end

end

sita=j/50;

type=menu('正确识别率为:',sita*100,'%')

转载于:https://www.cnblogs.com/lanluyug/p/7346555.html

基于ANN的6种调制信号自动调制识别(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)相关推荐

  1. 基于matlab的短波通信信号基本样式(AM、DSB、FM、2ASK、2FSK、2PSK)

    标题基于matlab的短波通信信号基本样式(AM.DSB.FM.2ASK.2FSK.2PSK) 最近学校老师布置的通信信号的仿真任务,本来仿真一个普通信号并不是一件难事,但是老师要求按照实际的频段来仿 ...

  2. 基于FPGA的2ASK、2FSK、2PSK的调制解调

    文章目录 前言 一.顶层原理图 二.signalTap II 上的仿真图 三.部分代码贴出 总结 前言 这是自己的毕设总结,主要就是基于FPGA的调制解调器的设计.涉及到2ASK.2FSK.2PSK的 ...

  3. matlab电路仿真三角波,Matlab仿真: 1Mhz正弦载波与2kHz三角波调制信号进行调制仿真...

    %Matlab仿真: 1Mhz正弦载波与2kHz三角波调制信号进行调制仿真 %======================= %1,2,5,2kHz三角波的产生: clear;clc; f_tri=1 ...

  4. 基带模型下基于高阶累积量的MFSK信号的调制识别(代码和参考文献见CSDN同名资源)

    信号模型:基带信号 文献一:吕新正. 利用高阶累积量实现数字调制信号的自动识别[J]. 2004. 核心思想:将基带信号进行微分后在计算|C21|和|C42|的值,定义特征参数 T 4 = ∣ C 4 ...

  5. MATLAB仿真噪声信号、单多音信号、LFM、2ASK、2FSK、BPSK、16QAM

    文章目录 背景: 1.高斯白噪声 2.噪声调幅信号 3.噪声调频信号 4.单音信号 5.多音信号 6.线性扫频信号 7.2ASK信号 8.2FSK信号 9.BPSK信号 10.16QAM信号 缩略对照 ...

  6. java 调制信号,常见调制技术汇总

    ASK:幅移键控,载波幅度随着基带信号的变化而变化,还可以称作"通-断键控或者开关键控".恒定振幅表示1,载波关闭表示0 FSK:频移键控,载波频率随着基带信号的变化而变化.不同的 ...

  7. 基于LabVIEW的基带NRZ矩形波形产生模块以及二进制数字调制系统(2ASK、2FSK、2PSK)以及抗噪声分析(含工程源码、设计报告)

    通用基带单极性NRZ矩形波产生模块 通过输入二进制序列(序列长度可自定义),产生相应的基带波形,一般为NRZ矩形波. 基本设计思路 在此VI设计中,将输出的单极性NRZ信号采用命名为"输出一 ...

  8. 2ASK、2FSK、2PSK、2DPSK、4ASK、4FSK、4PSK、4DPSK、QPSK,以及4QAM、16QAM和MSK、GMSK这些调制和解调过程

    2ASK,2FSK,2PSK,2DPSK四个二进制的仿真结论如下所示: 4ASK,4FSK,4PSK,4DPSK四个四进制的仿真结论如下所示: QPSK,4QAM,16QAM三个仿真结果如下所示: M ...

  9. 自动调制分类发展历程

    作为一名即将进入研究生阶段的学生,将机器学习用于自动调制分类的发展历程整理如下,供今后参考学习之用,深入了解之人大可莞尔.                           机器学习用于信号自动调制 ...

最新文章

  1. MySQL笔记12:C语言访问MYSQL数据库的完整的代码例子
  2. 关于将一个数输出为原码、反码和补码的解惑
  3. 【Prometheus 】 Blackbox_exporter 指标 probe_http_duration_seconds
  4. 汇编-简单的条件转移指令应用-附例子:判断坐标所在象限
  5. java 换行 运算符格式_Java代码样式运算符换行格式
  6. servlet中显示mysql字段_Java Servlet:从数据库获取信息并在屏幕上显示它
  7. strtus常用的一些配置
  8. seL4操作系统基础06:dataport interface与seL4SharedData connector
  9. jfinal中使用freemarker
  10. Session实现验证码登陆笔记
  11. 硬盘无法识别怎么办 硬盘无法识别怎么恢复数据
  12. 二进制、十进制、八进制、十六进制转换对照表
  13. cad学生版和教育版_针对学生和教育者的3个版权提示
  14. 邵阳职院计算机专业怎么样,邵阳市古峰职业学校怎么样?
  15. 人类2100年长啥样?3D建模模拟出来让人惊掉下巴!
  16. PPT 将图片的白色部分透明化
  17. HDOJ 题目1217 Arbitrage(最短路径,Floyd)
  18. JAVAScript实现人民币大小写转换算法
  19. 基于微信小程序的大学生心理测试+后台管理
  20. 网络安全面试指南(CybersecurityInterviewGuide)

热门文章

  1. PendingIntent详解
  2. HTML中label的两种使用方法
  3. LWIP源码结构分析
  4. golang的select
  5. const应用和作用
  6. 一个程序看fputc和fgetc
  7. UART0串口编程(三):中断方式的串口编程;用中断编写发送函数
  8. 常考数据结构与算法:删除链表的倒数第n个节点
  9. Web的诞生和网络基础 | 读《图解HTTP》
  10. OSS- OSS brower 登陆失败