Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类

内容大纲

加性高斯白噪声信道(AWGN)下的digital调制格式识别分类

(1. PSK; 2. QPSK; 3.8QAM; 4. 16QAM; 5. 32QAM; 6.64QAM)

100次独立仿真,识别正确率 vs SNR

设计

我的实现方法是 基于高阶累积量的信号特征的识别算法

调制格式识别过程如下:

信号预处理

  • 去除直流成分

信号在接收端由于接收机的影响,有可能产生直流成分。直流分量在后面混频等处理中会产生影响,因此在信号处理以前必须去除直流成分。

令s ̅(t)表示信号s(t)的均值,即

则去除直流后的信号表示为

%去除直流成分
CMAOUT = CMAOUT - mean(CMAOUT);
  • 信号功率归一化

由于信道衰落影响到接收信号的功率,提取有关幅度的特征参量时会出现不一致的情况。因此需要对接收信号进行功率归一化,以消除信号功率的影响。令σ_x^2表示已经经过去除直流分量之后的信号x(t)的平均功率,即

那么经过功率归一化后的信号表示为

%normalization接收信号功率归一化
CMAOUT=CMAOUT/sqrt(mean(abs(CMAOUT).^2));

特征提取

基于高阶累积量的信号处理方法,对通信信号中的加性高斯噪声有很好的抑制能力,在低信噪比下进行信号识别也能有良好的性能,应用在信号分析领域是非常有效的。

随机过程的k阶累积量为

则根据定义,随机过程的二阶和四阶累积量为

如果定义

,令

,则上面累积量的表达式化简为:

在信号的实际处理中,要从有限的接收数据中估计信号的累积量,可以采用采样点的平均代替理论的平均。例如,给定观察数据r_k,k=1,2,⋯,N,则可以使用下来的估计表达式。当信号和噪声的8阶矩存在并为有限值的时候,其不同定义的4阶累积量的估计是渐进无偏的一致估计。

由于处理的信号是在AWGN信道下接收的,所以对于C21这个二阶累积量来说,由于是信号模的平方近似计算得到的,因此噪声的功率会也包含进去了。所以,需要处理C21这个累积量。由于信噪比已知,则可以计算信号功率根据信噪比关系求得噪声功率。

令snr为信噪比,则

C21的累积量的更新为

C21=C21-noise_power

s = CMAOUT;
signalpow = mean(abs(s).^2);%信号功率
noisepow = signalpow/(10^(snr(snrIndex)/10));%噪声功率
C20_hat = mean(s.^2);
C21_hat = mean(abs(s).^2);
C21_hat = C21_hat-noisepow;%计算信号二阶累积量C21时,由于C21为信号模的平方
%而我们接收的s是在AWGN信道下接收的,所以求C21时还应考虑噪声功率。
C40_hat = mean(s.^4)-3*C20_hat^2;
%C41_hat = mean((s.^3).*conj(s))-3*C20_hat*C21_hat;
C42_hat = mean(abs(s).^4)-abs(C20_hat)^2-2*C21_hat^2; C40_normal = C40_hat/C21_hat.^2;
%C42_normal = C42_hat/C21_hat.^2;

分类识别

从论文中得知的一些四阶累积量的性质:

但是,对于实际接收到的信号,由于信号功率的影响,无法从累积量的绝对值中进行信号的区分。为了能够各阶累积量相比较,必须采取将信号功率归一化的方法,使得不同信号的累积量具有可比性。归一化是假设信号具有单位功率,即C_21=1,其他四阶累积量利用C_21进行归一化:

查询可得不同调制方式的归一化四阶累积量理论值

根据以上表格内容可以做出判断

AbsC40 = abs(C40_normal);
if(j==printJ) fprintf('%g ',AbsC40); end
if(AbsC40>=1.5)%PSK
classify = 1;
elseif(AbsC40>=0.9&&AbsC40<1.1)%QPSK
classify = 2;
elseif(AbsC40>=1.1&&AbsC40<1.3)%8QAM
classify = 3;
elseif(AbsC40>=0.67&&AbsC40<0.9)%16QAM
classify = 4;
elseif(AbsC40<0.35)%32QAM
classify = 5;
elseif(AbsC40>=0.35&&AbsC40<0.63)%64QAM
classify = 6;
end if(classify == System.BitPerSymbol)
classify_correct = classify_correct + 1;
end

最后打印出信噪比与识别正确率的关系和对应的星座图

classify_correct_ratio(snrIndex) = classify_correct/ClassifySetNumber*100;
end
%%绘制图形
figure(1);subplot(2, 3, j);
plot(snr, classify_correct_ratio, '-b.'); figure(2);subplot(2, 3, j);
plot(real(CMAOUT),imag(CMAOUT),'.');

运行效果

实验中用到的参数设置

%%参数设置
snr_mini = 5; %信噪比最小值
snr_max = 20; %信噪比最大值
TxSampleRate = 32e9; %信号的码元速率
TxLinewidth = 0; %发射信号的载波线宽
TxCarrierRate = 0; %发射信号的载波频率
DataSymbolNumber = 10000; %数据点的个数
ClassifySetNumber = 100; %独立仿真的次数
printJ = 5; %需要输出观察的调制方式,0为不输出
printXingZuo = 1; %是否需要打印星座图,0为不打印 % signal generation;如果想要进行100组独立的测试,可以建立100次循环,产生100组独立的数据
for j = 1:6 % bit per symbol: 1. PSK; 2. QPSK; 3.8QAM; 4. 16QAM; 5. 32QAM; 6.64QAM...
System.BitPerSymbol = j;
snr = snr_mini:snr_max; %SNR信噪比的设置,单位dB
classify_correct_ratio = zeros(length(snr), 1);
for snrIndex= 1:length(snr)
if(j==printJ) fprintf('\n--------------- snr = %d ------------\n',snr(snrIndex)); end
classify_correct = 0; for i = 1:ClassifySetNumber
Tx.SampleRate = TxSampleRate; %symbol Rate,信号的码元速率,可以自行定义
Tx.Linewidth = TxLinewidth;%发射信号的载波的线宽,一般与信号的相位噪声有关
Tx.Carrier = DataSymbolNumber;%发射信号的载波频率
M = 2^System.BitPerSymbol;

从上述可以看出,一共进行了100次独立仿真。

由于没有找到32QAM的累积量的理论值,但是通过实验探究可以观察在32QAM的调制方式下。

通过输出语句我们可以观察到如下

当信噪比在不同的取值情况下面,由于归一化处理,32QAM的C40的模值的理论值应为0.2

在不同的信噪比下面,识别正确率如下图:

要求的信噪比是12—15,在信噪比的比较低的时候,识别会有一定的误差,例如信噪比只有5的情况下比较明显,随着信噪比的提升,噪声的影响减少,分类识别的方法体现出来良好的稳定性。可以看到,信噪比大于10之后的识别率几乎都达到了100%。其中PSK的识别率是最好的。64QAM在累积量的识别方法里面低信噪比时稍微差点。

对应的调制方式星座图如下:

其中64QAM的区分没有特别明显,这就是低信噪比时产生的识别困难情况。但是稍微提高信噪比就能很好的识别。

完整代码

clear all;
clc; %%参数设置
snr_mini = 5; %信噪比最小值
snr_max = 20; %信噪比最大值
TxSampleRate = 32e9; %信号的码元速率
TxLinewidth = 0; %发射信号的载波线宽
TxCarrierRate = 0; %发射信号的载波频率
DataSymbolNumber = 10000; %数据点的个数
ClassifySetNumber = 100; %独立仿真的次数
printJ = 5; %需要输出观察的调制方式,0为不输出
printXingZuo = 1; %是否需要打印星座图,0为不打印 % signal generation;如果想要进行100组独立的测试,可以建立100次循环,产生100组独立的数据
for j = 1:6 % bit per symbol: 1. PSK; 2. QPSK; 3.8QAM; 4. 16QAM; 5. 32QAM; 6.64QAM...
System.BitPerSymbol = j;
snr = snr_mini:snr_max; %SNR信噪比的设置,单位dB
classify_correct_ratio = zeros(length(snr), 1);
for snrIndex= 1:length(snr)
if(j==printJ) fprintf('\n--------------- snr = %d ------------\n',snr(snrIndex)); end
classify_correct = 0; for i = 1:ClassifySetNumber
Tx.SampleRate = TxSampleRate; %symbol Rate,信号的码元速率,可以自行定义
Tx.Linewidth = TxLinewidth;%发射信号的载波的线宽,一般与信号的相位噪声有关
Tx.Carrier = DataSymbolNumber;%发射信号的载波频率
M = 2^System.BitPerSymbol;
%%信号生成 Tx.DataSymbol = randi([0 M-1],1,DataSymbolNumber);%每一次随机产生的数据量 %数据的不同调制方式产生:这里把2^3(8QAM)的形式单独拿出来设置,是为了实现最优的星型8QAM星座图
if M ~= 8;
h = modem.qammod('M', M, 'SymbolOrder', 'Gray');
Tx.DataConstel = modulate(h,Tx.DataSymbol);
else
tmp = Tx.DataSymbol;
tmp2 = zeros(1,length(Tx.DataSymbol));
for kk = 1:length(Tx.DataSymbol) switch tmp(kk)
case 0
tmp2(kk) = 1 + 1i;
case 1
tmp2(kk) = -1 + 1i;
case 2
tmp2(kk) = -1 - 1i;
case 3
tmp2(kk) = 1 - 1i;
case 4
tmp2(kk) = 1+sqrt(3);
case 5
tmp2(kk) = 0 + 1i .* (1+sqrt(3));
case 6
tmp2(kk) = 0 - 1i .* (1+sqrt(3));
case 7
tmp2(kk) = -1-sqrt(3);
end
end
Tx.DataConstel = tmp2;
clear tmp tmp2;
end Tx.Signal = Tx.DataConstel; %数据的载波加载,考虑到相位噪声等
N = length(Tx.Signal);
dt = 1/Tx.SampleRate;
t = dt*(0:N-1);
Phase1 = [0, cumsum(normrnd(0,sqrt(2*pi*Tx.Linewidth/(Tx.SampleRate)), 1, N-1))];
carrier1 = exp(1i*(2*pi*t*Tx.Carrier + Phase1));
Tx.Signal = Tx.Signal.*carrier1; Rx.Signal = awgn(Tx.Signal,snr(snrIndex),'measured');%数据在AWGN信道下的接收 %%信号识别
CMAOUT = Rx.Signal; %去除直流成分
CMAOUT = CMAOUT - mean(CMAOUT); %normalization接收信号功率归一化
CMAOUT=CMAOUT/sqrt(mean(abs(CMAOUT).^2)); s = CMAOUT;
signalpow = mean(abs(s).^2);%信号功率
noisepow = signalpow/(10^(snr(snrIndex)/10));%噪声功率
C20_hat = mean(s.^2);
C21_hat = mean(abs(s).^2);
C21_hat = C21_hat-noisepow;%计算信号二阶累积量C21时,由于C21为信号模的平方
%而我们接收的s是在AWGN信道下接收的,所以求C21时还应考虑噪声功率。
C40_hat = mean(s.^4)-3*C20_hat^2;
%C41_hat = mean((s.^3).*conj(s))-3*C20_hat*C21_hat;
C42_hat = mean(abs(s).^4)-abs(C20_hat)^2-2*C21_hat^2; C40_normal = C40_hat/C21_hat.^2;
%C42_normal = C42_hat/C21_hat.^2; AbsC40 = abs(C40_normal);
if(j==printJ) fprintf('%g ',AbsC40); end
if(AbsC40>=1.5)%PSK
classify = 1;
elseif(AbsC40>=0.9&&AbsC40<1.1)%QPSK
classify = 2;
elseif(AbsC40>=1.1&&AbsC40<1.3)%8QAM
classify = 3;
elseif(AbsC40>=0.67&&AbsC40<0.9)%16QAM
classify = 4;
elseif(AbsC40<0.35)%32QAM
classify = 5;
elseif(AbsC40>=0.35&&AbsC40<0.63)%64QAM
classify = 6;
end if(classify == System.BitPerSymbol)
classify_correct = classify_correct + 1;
end %subplot(1,7,snrIndex);%绘制原始噪声
%plot(Rx.Signal,'.');
%plot(CMAOUT,'.');
end
classify_correct_ratio(snrIndex) = classify_correct/ClassifySetNumber*100;
end
%%绘制图形
figure(1);subplot(2, 3, j);
plot(snr, classify_correct_ratio, '-b.');
axis([snr_mini snr_max 0 110]);
ylabel('识别正确率/%');
xlabel('信噪比/dB');
if(j == 1)
title('PSK调制方式识别');
elseif(j == 2)
title('QPSK调制方式识别');
elseif(j == 3)
title('8QAM调制方式识别');
elseif(j == 4)
title('16QAM调制方式识别');
elseif(j == 5)
title('32QAM调制方式识别');
else
title('64QAM调制方式识别');
end if(printXingZuo==1)
figure(2);subplot(2, 3, j);
plot(real(CMAOUT),imag(CMAOUT),'.');
if(j == 1)
title('PSK调制方式星座图');
elseif(j == 2)
title('QPSK调制方式星座图');
elseif(j == 3)
title('8QAM调制方式星座图');
elseif(j == 4)
title('16QAM调制方式星座图');
elseif(j == 5)
title('32QAM调制方式星座图');
else
title('64QAM调制方式星座图');
end
end end

Matlab实现加性高斯白噪声信道(AWGN)下的digital调制格式识别分类的更多相关文章

  1. python 写matlab中的加性高斯白噪声AWGN

    定义 原始信号:x 噪声信号:n 信噪比:SNR 信号长度:N def wgn(x, snr): snr = 10**(snr/10.0) xpower = np.sum(x**2)/len(x) n ...

  2. [转] Matlab中给信号加高斯白噪声的方法

    MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = ...

  3. MATLAB中产生高斯白噪声的两个函数

    MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声.1.WGN:产生高斯白噪声 y = wg ...

  4. 数学之路-python计算实战(7)-机器视觉-图像产生加性零均值高斯噪声

    图像产生加性零均值高斯噪声.在灰度图上加上噪声,加上噪声的方式是每一个点的灰度值加上一个噪声值.噪声值的产生方式为Box-Muller算法生成高斯噪声. 在计算机模拟中,常常须要生成正态分布的数值.最 ...

  5. 【FPGA】高斯白噪声的Verilog实现

    本文章主要讨论高斯白噪声的FPGA实现.简单的方法可以采用在Matlab中产生服从一定均值和方差的I.Q两路噪声信号.然后将两组数据存在FPGA中进行回放,以此来产生高斯白噪声.这种方法优点是产生方法 ...

  6. 高斯白噪声(white Gaussian noise,WGN)

    本文科普一下高斯白噪声(white Gaussian noise,WGN). 百度百科上解释为“高斯白噪声,幅度分布服从高斯分布,功率谱密度服从均匀分布”,听起来有些晦涩难懂,下面结合例子通俗而详细地 ...

  7. MATLAB实例:二元高斯分布图

    MATLAB实例:二元高斯分布图 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. MATLAB程序 %% demo Multivariate No ...

  8. AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服 ...

  9. JS window对象 返回下一个浏览的页面 forward()方法,加载 history 列表中的下一个 URL。

    返回下一个浏览的页面 forward()方法,加载 history 列表中的下一个 URL. 如果倒退之后,再想回到倒退之前浏览的页面,则可以使用forward()方法,代码如下: window.hi ...

随机推荐

  1. mysql时间日期相加相减实现

    分享篇mysql中日期的一些操作,就是我们常常会用到的mysql时间日期的相加或者相减的了,这个mysql也自己带了函数,有需要的朋友可以参考一下. 最简单的方法 select TO_DAYS(str ...

  2. 在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client

    在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client   阅读目录 验证代码流程 Refreshing a Token Built-In Providers 这个包能够让你 ...

  3. java的WebService实践(cxf)

    Java发布WebService,结合Spring,通过cxf的方式 难点:1.引用什么jar包: 1.创建接口 源码如下: package com.nankang; import javax.jws ...

  4. /proc/cpuinfo

    /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间. 它以文件系统的方式为访问系统内核数据的操作提供接口. 用户和应用程序可以通过 proc得到系统的信息,并可以改变内核的某些参数 ...

  5. ARC————自动引用计数

    一.内存管理/引用计数 1.引用计数式内存管理的方式(下面四种) 对象操作 OC方法 生成并持有对象 alloc/new/copy/mutableCopyd等方法 持有对象 retain方法 释放对象 ...

  6. Check Box Select/Deselect All on Grid

    The below function is to be used on a grid with multiple check boxes. Place the code behind a FieldC ...

  7. 根据Ip获取城市帮助类

    思路构建 1.先通过本地的测IP地址库进行匹配 2.如果本地IP地址库存在此IP的城市信息,就直接返回,调用速度也快 3.如果本地没有对应的IP城市信息,必须通过调用网络的IP查询的API了,这里我使 ...

  8. 大数据实践:ODI 和 Twitter (一)

    本文利用twitter做为数据源,介绍使用Oracle大数据平台及Oralce Data Integrator工具,完成从twitter抽取数据,在hadoop平台上处理数据,并最终加载到oracle ...

  9. input中如何输入逆写的中文句子

    <input style="text-align:right" /><input type="text" dir="rtl" ...

  10. Laravel 5 基础(七)- Eloquent (laravel 的ORM)

    我们来生成第一个模型 php artisan make:model Article #输出 Model created successfully. Created Migration: 2015_03 ...