高斯白噪声信道仿真

  • 1 前言
  • 2 什么是加性高斯白噪声
  • 3 用MATLAB生成高斯白噪声的方法
  • 3.1 方法一:awgn函数
  • 3.2 方法二:randn函数
  • 4 AWGN信道系统仿真
  • 5 总结

1 前言

为了记录学习的过程,打算开始在上写博文,博文的内容主要是涉及到通信的一些基本原理和matlab仿真。
今天就开始写第一篇吧,介绍通信系统仿真中如何添加加性高斯白噪声,以及高斯白噪声对系统性能的影响。

2 什么是加性高斯白噪声

在随机信号分析里面,我们学习过,白噪声是功率谱密度为常数的平稳随机过程。

即:

高斯白噪声下的信号检测python 高斯白噪声信道_信噪比


关于高斯分布(正态分布):

高斯白噪声下的信号检测python 高斯白噪声信道_正态分布_02

3 用MATLAB生成高斯白噪声的方法

3.1 方法一:awgn函数

格式一:awgn(xin,snr);
此种调用方式假设输入信号xin的功率为0dBW(0dBW=10log10(1W)),按照snr(dB)的信噪比添加噪声。
matlab仿真代码如下:

clear all;
close all;
clc;
t=0:0.001:10;
x=sin(2*pi*t);
snr=20;
y=awgn(x, snr);
subplot(2,1,1);plot(t,x);title('正弦信号x')
subplot(2,1,2);plot(t,y);title('叠加了高斯白噪声后的正弦信号');

z=y-x;
var(z)

画出加噪和未加噪的信号的时域波形图如下所示:

高斯白噪声下的信号检测python 高斯白噪声信道_信噪比_03

从仿真结果可以看出,叠加了噪声后 的信号与原信号相比有了失真。因为程序中设置的噪声为-20dBW,转换为线性噪声功率值即为0.01,可以看到var(z)=0.01。

格式二:awgn(xin,snr,sigpower)

这种调用方式是假设输入信号的功率为sigpower(单位为dBW),按照此信号功率和信噪比添加白噪声,运行如下代码:

clear all;
close all;
clc;

t=0:0.001:10;
x=sin(2*pi*t);
snr=20;
y=awgn(x, snr,10);
subplot(2,1,1);plot(t,x);title('正弦信号x')
subplot(2,1,2);plot(t,y);title('叠加了高斯白噪声后的正弦信号')

z=y-x;
var(z)

仿真结果如下:

高斯白噪声下的信号检测python 高斯白噪声信道_正态分布_04

可以看到同样是信噪比为20dB,但是失真比之前的要大,这是因为输入信号的功率其实没有10dBW(输入的正弦信号的实际功率为0.5W=-3dBW),因此虽然信噪比不变,但实际上噪声功率增大了,我们可以看到var(z)=0.1。

格式三:awgn(xin,snr,‘measured’)

这种格式是根据输入信号的实际功率和信噪比来计算所加噪声的功率的,仿真代码:

clear all;
close all;
clc;

t=0:0.001:10;
x=sin(2*pi*t);
snr=20;
y=awgn(x, snr,'measured');
subplot(2,1,1);plot(t,x);title('正弦信号x')
subplot(2,1,2);plot(t,y);title('叠加了高斯白噪声后的正弦信号')

z=y-x;
var(z)

仿真结果如下:

高斯白噪声下的信号检测python 高斯白噪声信道_高斯白噪声下的信号检测python_05

从上述仿真结果可以看出,添加噪声后的失真都比上述两种方式小,这是因为加噪时时是按照实际的信号功率添加的,添加的噪声功率为0.005W,从运算出来的var(z)结果也能看出来。

高斯白噪声下的信号检测python 高斯白噪声信道_正态分布_06

3.2 方法二:randn函数

除了采用awgn函数,我们也可以采用randn函数来产生加性高斯白噪声。
这里只给出其中一种调用格式:randn(n)
它返回一个n行n列的随机矩阵,其中每一行每一列都服从均值为0,方差为1的标准正态分布。
下面给出一个调用randn函数来实现信号加噪的仿真代码:

clear all;
close all;
clc;
t=0:0.001:10;
x=sin(2*pi*t);
px=norm(x).^2/length(x);      %计算信号x的功率
snr=20;                       %信噪比,dB形式
pn=px./(10.^(snr./10));       %根据snr计算噪声功率
n=sqrt(pn)*randn(1,length(x));%根据噪声功率产生相应的高斯白噪声序列
y=x+n;                  %在信号上叠加高斯白噪声
subplot(2,1,1);plot(t,x);title('正弦信号x')
subplot(2,1,2);plot(t,y);title('叠加了高斯白噪声后的正弦信号')

var(n)

程序说明:norm(x)默认情况下为norm(x,2)表示计算x的2范数:

高斯白噪声下的信号检测python 高斯白噪声信道_通信系统_07


所以计算信号功率为:px=norm(x).^2/length(x);

仿真结果如下:

高斯白噪声下的信号检测python 高斯白噪声信道_信噪比_08


从仿真结果可以看出,通过randn函数达到了和awgn(xin,snr,‘measured’)调用一样的效果,从var(z)=0.005,也说明了这个问题。

4 AWGN信道系统仿真

章节3只是简单的介绍了如何对一个输入信号添加高斯白噪声,接下来,我们以一个简化的通信系统为例,给出信号通过AWGN信道之后的误码率和误比特率的情况。
matlab仿真代码如下:

clear all;
close all;
clc;
nSamp = 8;
numSymb = 200000;
M =4;
SNR = -3:1:3;
grayencod = [0 1 3 2];
BER = zeros(1,length(SNR));
SER = zeros(1,length(SNR));
msg_demod  =  zeros(1,numSymb);
for ii=1:length(SNR)
    msg = randsrc(1,numSymb,[0:3]); % 原始信息比特
    msg_gr = grayencod(msg+1);  
    msg_tx = pskmod(msg_gr,M);
    msg_tx = rectpulse(msg_tx,nSamp);
    msg_rx = awgn(msg_tx,SNR(ii),'measured');
    msg_rx_down = intdump(msg_rx,nSamp);
    msg_gr_demod = pskdemod(msg_rx_down,M); % 解调出来的信息比特
    %格雷码逆映射
    for jj=1:length(msg_gr_demod)
        if(msg_gr_demod(jj)==0)
            msg_demod(jj) = 0;
        elseif(msg_gr_demod(jj)==1)
            msg_demod(jj) = 1;
        elseif(msg_gr_demod(jj)==3)
            msg_demod(jj) = 2;
        else
            msg_demod(jj) = 3;
        end
    end
    [errorBit, BER(ii)] = biterr(msg,msg_demod,log2(M));
    [errorSym, SER(ii)] = symerr(msg,msg_demod);
end

scatterplot(msg_tx(1:100));
title('发射信号星座图点');
xlabel('同相分量');
ylabel('正交分量');

scatterplot(msg_rx(1:100));
title('接收信号星座图点');
xlabel('同相分量');
ylabel('正交分量');

figure
semilogy(SNR,BER,'-bo',SNR,SER,'-r*');
legend('BER','SER');
title('QPSK在AWGN信息下的性能');
xlabel('信噪比(dB)');
ylabel('误符号率和误比特率');

仿真结果如下:

高斯白噪声下的信号检测python 高斯白噪声信道_高斯白噪声下的信号检测python_09

从仿真结果可以看出,经过高斯白噪声信道后,在SNR较低的情况下,在接收端可能会出现错误判决。

5 总结

以上就是今天要讲的内容,本文介绍了通信系统仿真中常见的加性高斯白噪声的生成以及对接收端的性能影响。接下来会讲讲有关瑞利时变多径衰落信道的内容,等更新啦~~