转载-基于MATLAB给信号添加高斯白噪声

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

转载-基于MATLAB给信号添加⾼斯⽩噪声
MATLAB中产⽣⾼斯⽩噪声⾮常⽅便,可以直接应⽤两个函数,⼀个是WGN,另⼀个是AWGN。

WGN⽤于产⽣⾼斯⽩噪声,AWGN则⽤于在某⼀信号中加⼊⾼斯⽩噪声。

1. 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'。

2. AWGN:在某⼀信号中加⼊⾼斯⽩噪声
y = awgn(x,SNR) 在信号x中加⼊⾼斯⽩噪声。

信噪⽐SNR以dB为单位。

x的强度假定为0dBW。

如果x是复数,就加⼊复噪声。

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)是表⽰相对功率或幅度电平的标准单位,换句话说,就是我们⽤来表⽰两个能量之间的差别的⼀种表⽰单位,它不是⼀个绝对单位。

例如,电⼦系统中将电压、电流、功率等物理量的强弱通称为电平,电平的单位通常就以分贝表⽰,即事先取⼀个电压或电流作为参考值(0dB),⽤待表⽰的量与参考值之⽐取对数,再乘以20作为电平的分贝数(功率的电平值改乘10)。

2. 分贝⽡(dBW, dB Watt):指以1W的输出功率为基准时,⽤分贝来测量的功率放⼤器的功率值。

3. dBm (dB-milliWatt):即与1milliWatt(毫⽡)作⽐较得出的数字。

0 dBm = 1 mW
10 dBm = 10 mW
20 dBm = 100 mW
也可直接⽤randn函数产⽣⾼斯分布序列,例如:
程序代码
y=randn(1,2500);
y=y/std(y);
y=y-mean(y);
a=0.0128;
b=sqrt(0.9596);
y=a+b*y;
就得到了 N ( 0.0128, 0.9596 ) 的⾼斯分布序列
产⽣指定⽅差和均值的随机数
设某个随机变量x均值为mu,⽅差为var^2,若要产⽣同样分布的随机变量y,但使新的随
机变量参数改变,均值为mu_1,⽅差为var_1^2,可以⽤如下公式进⾏变换:
y=var_1/var*(x-mu)+mu_1,其中x为随机变量,其余为常数(原分布参数)。

具体到正态分布,若要产⽣均值为u,⽅差为o^2的M*N的随机数矩阵,可以⽤
y=o*randn(M,N)+u得到。

对于均匀分布,若要产⽣[a,b]区间的均匀分布的M*N的随机数矩阵,则可以⽤
y=rand(M,N)*(b-a)+a得到。

%===========================================================%
上述资料基本上完整地描述了原始问题,不过有⼏点内容附带说明⼀下:
1. ⾸先更正⼀个错误,我认为在“⽣成N ( 0.0128, 0.9596 ) 的⾼斯分布序列”的程序中,应该改为以下的代码:
程序代码
y=randn(1,2500);
y=y-mean(y);
y=y/std(y);
a=0.0128;
b=sqrt(0.9596);
y=a+b*y;
2. 上⾯资料最后部分隐含了⼀个出⾃zhyuer 版友的结论:
%==========================zhyuer===================================%
1) rand产⽣的是[0,1]上的均匀分布的随机序列
2) randn产⽣均值为0,⽅差为1的⾼斯随机序列,也就是⽩噪声序列;
%===================================================================%
也就是说,可以直接使⽤上⾯两个函数对原始信号添加噪声(例如y=x+rand(length(x),1)或者y=x+randn(length(x),1))
3.事实上,⽆论是wgn还是awgn函数,实质都是由randn函数产⽣的噪声。

即,wgn函数中调⽤了randn函数,⽽awgn函数中调⽤了wgn函数。

下⾯就我熟悉的“向已知信号添加某个信噪⽐(SNR)的⾼斯⽩噪声”来说明⼀下,不过如果⼤家阅读过awgn的实现代码就不⽤看下去了,呵呵。

从上述可知,这个任务可以使⽤awgn函数实现,具体命令是:awgn(x,snr,’measured’,'linear’),命令的作⽤是对原信号f(x)添加信噪⽐(⽐值)为SNR的噪声,在添加之前先估计信号f的强度。

这⾥涉及三个问题:在awgn这个函数中,SNR是如何计算的?什么是信号
的强度?awgn函数具体是如何添加噪声的?事实上,前两个问题是相关的,因为根据定义,SNR就是信号的强度除以噪声的强度,所以,⾸先来讲讲信号的强度。

其实信号的强度指的就是信号的能量,在连续的情形就是对f(x)平⽅后求积分,⽽在离散的情形⾃然是求和代替积分了。

在matlab中也是这样实现的,只不过多了⼀个规范化步骤罢了:
sigPower = sum(abs(sig(:)).^2)/length(sig(:))
这就是信号的强度。

⾄此,SNR的具体实现也不⽤多说了(注:由于采⽤的是⽐值⽽⾮db,所以与下⾯“计算信噪⽐”所使⽤的⽅式不同,即没有求对数步骤)。

最后说说awgn函数具体是如何添加噪声的。

事实上也很简单,在求出f的强度后,结合指定的信噪⽐,就可以求出需要添加的噪声的强度noisePower=sigPower/SNR。

由于使⽤的是⾼斯⽩噪声即randn函数,⽽randn的结果是⼀个强度为1的随机序列(⾃⼰试试
sum(randn(1000,1).^2)/1000就知道了,注意信号的长度不能太⼩)。

于是,所要添加的噪声信号显然就是:sqrt(noisePower)*randn(n,1),其中n为信号长度。

相关文档
最新文档