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

来源:互联网 发布:手机直播字幕软件 编辑:程序博客网 时间:2024/05/19 20:44

引言

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

wgn描述

y=wgn(m,n,p) 产生一个mn列的高斯白噪声的矩阵,pdBW为单位指定输出噪声的强度。
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

在使用awgnwgn前还需要介绍一下randrandn的用法及原理。
MATLAB中rand(m,n)函数用于产生mn列的均匀分布序列。均分分布随机数产生方法是在线性同余法基础上对随机数进行归一化。
高斯白分布随机数是在均匀分布的基础上,使用Box-Muller方法,将均匀分布随机数x1x2生成高斯白随机数y1y2
方法在“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函数。
在使用wgnawgn涉及到了信号强度、噪声强度和信号比的概念,有必要进一步解释这两个概念和计算方法。

信号强度:
信号的强度指的就是信号的能量(振幅的平方和),连续情形就是对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

其中AsignalAnoise分别是均方根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);   endend% --- Compute the required noise powerswitch lower(pMode)   case 'linear'      noisePower = sigPower/reqSNR;   case 'db'      noisePower = sigPower-reqSNR;      pMode = 'dbw';end% --- Add the noiseif(isreal(sig))   opType = 'real';else   opType = 'complex';endy = 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

阅读全文
0 0
原创粉丝点击