深入理解awgn函数如何向信号中添加高斯白噪声

引言

在数值模拟应用中,经常在模拟信号中添加噪声数据,分析不同模型的信号解析能力。博文使用MATLAB中提供的 awgn 函数向信号 X 添加高斯白噪声,但从实现原理上分析了 awgn 的实现过程,这样读者可以通过其他语言实现这一过程。
MATLAB中可以方便的使用 awgn 将一定信噪比的高斯白噪声添加到理论信号中,产生添加噪声后的模拟信号。另一个函数 wgn 仅是产生高斯白噪声。[注:高斯白既标准正态分布]

wgn 描述

y=wgn(m,n,p) 产生一个 m n 列的高斯白噪声的矩阵, p dBW 为单位指定输出噪声的强度。
y=wgn(m,n,p,imp) 以欧姆 (Ohm) 为单位指定负载阻抗。
y=wgn(m,n,p,imp,state) 重置RANDN的状态。
在数值变量后还可附加一些标志性参数:
y=wgn(,POWERTYPE) 指定 p 的单位。POWERTYPE可以是dBW,dBm或linear。线性强度(linear power)以瓦特(Watt)为单位。
y=wgn(,OUTPUTTYPE) 指定输出类型。OUTPUTTYPE可以是real或complex。

awgn 描述

y=awgn(x,snr) 将白高斯噪声添加到向量信号 x 中。标量 snr 指定了每一个采样点信号与噪声的比率,单位为 dB 。如果 x 是复数的, awgn 将会添加复数噪声。这个语法假设 x 的能量是 0dBW
y=awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度,如果SIGPOWER为’measured’,则函数将在加入噪声之前测定信号强度。
y=awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。
y=awgn(,POWERTYPE) 指定SNR和SIGPOWER的单位。POWERTYPE可以是’dB’或’linear’。如果POWERTYPE是’dB’,那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是’linear’,那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。

单位释义:

  1. 分贝(decibel,dB),分贝(dB)是用于表示物理量的两个值的比率的对数单位。分贝(dB)是表示相对功率或幅度电平的标准单位,是用来表示两个能量之间的差别的一种单位,不是一个绝对单位。电子系统中将电压、电流、功率等物理量的强弱通称为电平,电平的单位通常就以分贝表示,即事先取一个电压或电流作为参考值(0dB),用待表示的量与参考值之比取对数,再乘以20作为电平的分贝数(功率的电平值改乘10)。
  2. 分贝瓦(dBW, dBm (dB-milliWatt):即与1milliWatt(毫瓦)作比较得出的数字。
  3. dBm (dB-milliWatt):即与1milliWatt(毫瓦)作比较得出的数字。
  4. 0 dBm = 1 mW,10 dBm = 10 mW,20 dBm = 100 mW

根据分贝定义,分贝和噪声具有下式关系:

Psignal,dB=10log10(Psignal)

randrandn

在使用 awgn wgn 前还需要介绍一下 rand randn 的用法及原理。
MATLAB中 rand(m,n) 函数用于产生 m n 列的均匀分布序列。均分分布随机数产生方法是在线性同余法基础上对随机数进行归一化。
高斯白分布随机数是在均匀分布的基础上,使用Box-Muller方法,将均匀分布随机数 x1 x2 生成高斯白随机数 y1 y2
方法在“Numerical Recipes”书中有详细介绍及源代码,可直接使用。

由于randn产生的“高斯白序列 x ”标准差 δ 和均值 μ 并不严格等于理论值1和0,需要使用下试进行变换:

y=xμδ

y 是较 x “严格”意义上的高斯白分布序列。利用序列 y 可以生成指定均值 μ 和标准差 δ 的正态分布序列 y
y=yδ+μ

直接用 randrandn 数对原始信号添加噪声(例如 y=x+rand(l,1) 或者 y=x+randn(l,1)l ,是信号长度。

wgn,awgn

使用 wgn,awgn 内部都调用了 randn 函数产生高斯白噪声。即, wgn 函数中调用了 randn 函数,而 awgn 函数中调用了 wgn 函数。
在使用 wgn awgn 涉及到了信号强度、噪声强度和信号比的概念,有必要进一步解释这两个概念和计算方法。

信号强度:
信号的强度指的就是信号的能量(振幅的平方和),连续情形就是对 f(x) 平方后求积分,而在离散的情形是求和代替积分。在MATLAB中运行 editawgn 后可以看到源码也是这样实现的,既均方根振幅:

 sigPower = sum(abs(sig(:)).^2)/length(sig(:))

信噪比(Signal-to-noise ratio,SNR):
信噪比是用于科学和工程中将所需信号的电平与背景噪声水平进行比较的措施。它被定义为信号功率与噪声功率的比值,通常以分贝表示。高于1:1(大于0 dB)的信号比噪声更多。SNR通常被引用于电信号,但它可以应用于任何形式的信号。下式是信噪比计算式:

SNR=PsignalPnoise

其中, Psignal 是信号的功率, Pnoise 是噪声功率。噪声和原始信号必须等长且对应。如果在相同阻抗下测量信号和噪声,则可以通过计算振幅比的平方来获得SNR:
SNR=PsignalPnoise=AsignalAnoise

其中 Asignal Anoise 分别是均方根root mean square (RMS) 振幅。既MATLAB中源码就是通过这种方式计算的信号强度与相应的噪声强度。

噪声强度和信噪比关系:

noisePower = sigPower/reqSNR;

使用 awgn 函数向原始信号中添加噪声过程比较简单。首先,计算出 f(x) 的信号强度;然后,根据给定的信噪比计算噪声强度。由于使用的是高斯白噪声即randn函数,而randn的结果是一个强度为1的随机序列。于是,所要添加的噪声信号显然就是: sqrt(noisePower)randn(n,1)n

下面分别是 wgnawgn 中的部分源码。从这里可以更好的明白信号强度、信噪比和噪声强度的关系。标准正态分布的信号强度是1。

switch lower(pMode)
   case 'linear'
      noisePower = p;
   case 'dbw'
      noisePower = 10^(p/10);
   case 'dbm'
      noisePower = 10^((p-30)/10);
end;
if(strcmp(measMode,'measured'))
   sigPower = sum(abs(sig(:)).^2)/length(sig(:));

   if(strcmp(pMode,'db'))
      sigPower = 10*log10(sigPower);
   end
end

% --- Compute the required noise power
switch lower(pMode)
   case 'linear'
      noisePower = sigPower/reqSNR;
   case 'db'
      noisePower = sigPower-reqSNR;
      pMode = 'dbw';
end

% --- Add the noise
if(isreal(sig))
   opType = 'real';
else
   opType = 'complex';
end

y = sig+wgn(size(sig,1), size(sig,2), noisePower, 1, state, pMode, opType);

参考

[1]http://cn.mathworks.com/help/comm/ref/awgn.html?searchHighlight=awgn&s_tid=doc_srchtitle
[2]http://cn.mathworks.com/help/comm/ref/wgn.html?searchHighlight=wgn&s_tid=doc_srchtitle
[3]http://www.ilovematlab.cn/thread-28150-1-1.html
[4]https://en.wikipedia.org/wiki/Signal-to-noise_ratio
[5]https://en.wikipedia.org/wiki/Decibel

你可能感兴趣的:(算法/方法)