在数值模拟应用中,经常在模拟信号中添加噪声数据,分析不同模型的信号解析能力。博文使用MATLAB中提供的 awgn 函数向信号 X 添加高斯白噪声,但从实现原理上分析了 awgn 的实现过程,这样读者可以通过其他语言实现这一过程。
MATLAB中可以方便的使用 awgn 将一定信噪比的高斯白噪声添加到理论信号中,产生添加噪声后的模拟信号。另一个函数 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。
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以瓦特为单位。
单位释义:
根据分贝定义,分贝和噪声具有下式关系:
在使用 awgn , wgn 前还需要介绍一下 rand 与 randn 的用法及原理。
MATLAB中 rand(m,n) 函数用于产生 m 行 n 列的均匀分布序列。均分分布随机数产生方法是在线性同余法基础上对随机数进行归一化。
高斯白分布随机数是在均匀分布的基础上,使用Box-Muller方法,将均匀分布随机数 x1 和 x2 生成高斯白随机数 y1 和 y2 。
方法在“Numerical Recipes”书中有详细介绍及源代码,可直接使用。
由于randn产生的“高斯白序列 x ”标准差 δ 和均值 μ 并不严格等于理论值1和0,需要使用下试进行变换:
直接用 rand和randn函 数对原始信号添加噪声(例如 y=x+rand(l,1) 或者 y=x+randn(l,1)),l ,是信号长度。
使用 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通常被引用于电信号,但它可以应用于任何形式的信号。下式是信噪比计算式:
噪声强度和信噪比关系:
noisePower = sigPower/reqSNR;
使用 awgn 函数向原始信号中添加噪声过程比较简单。首先,计算出 f(x) 的信号强度;然后,根据给定的信噪比计算噪声强度。由于使用的是高斯白噪声即randn函数,而randn的结果是一个强度为1的随机序列。于是,所要添加的噪声信号显然就是: sqrt(noisePower)∗randn(n,1),其中n为信号长度。
下面分别是 wgn和awgn 中的部分源码。从这里可以更好的明白信号强度、信噪比和噪声强度的关系。标准正态分布的信号强度是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