利用伪随机序列理论产生均匀分布的随机序列

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

利用伪随机序列理论产生均匀分布的随机序列

进而产生高斯白噪声

摘要:本文介绍了利用伪随机序列理论产生均匀分布的随机序列,进而产生高斯白噪声。高斯白噪声生成分两步实现。本文介绍这两步中的主流算法,并对其性能进行了分析;讨论了该算法组合的具体实现,包括加入对高斯白噪声均值和方差的控制。

关键词:均匀分布随机变量高斯白噪声线性同余法

目前,为获得参数可调的高斯白噪声,一般采用数字方法产生。数字方法产生分为两步:先产生均匀分布的白噪声,然后通过均匀分布的白噪声获得高斯白噪声。在这两步中均有多种方法可以选择。

1 均匀分布白噪声生成算法的选择

目前,有三种常用的均匀分布白噪声生成算法:线性同余算法、

Shift-Register方法和Lagged-Fibonacci算法。

对三种算法的性能进行测试,包括随机数在分布上的均匀性、随机数在随机序列中分布的均匀性和随机序列种子序列的依赖关系等内容。就性能而言,lagged-Fibonacci算法采用乘最好,lagged-Fibonacci算法采用加或减次之,线性同余法又次之。

从实现角度,Shift-Register方法、lagged-Fibonacci算法采用异或和lagged-Fibonacci算法采用加或减只需要移位、异或和加减法等操作,适合FPGA 实现。而线性同余算法和lagged-Fibonacci算法采用乘需要乘法操作,适合编程实现。

根据以上判断,结合实际情况,采用线性同余法算法来实现产生均匀分布的随机序列。

2. 均匀分布白噪声产生高斯白噪声算法的选择

目前,比较常用的有地址方法和公式方法。

(1) 查阅相关资料,可以知道两种方法产生高斯白噪声的性能相近。

(2) 从实现角度,前者具体实现时,产生高斯白噪声速度比较快,但需

要使用Rom来保存映射关系。为获得较高性能的高斯白噪声,需要大容

量的Rom。后者具体实现时,不需要使用大容量的内存,但需要n个均

匀白噪声才可以产生一个高斯白噪声,产生速度比较慢。

(3) 根据以上判断,结合实际情况,采用公式方法。

3. 实际使用

综合前面,采用线性同余法算法和公式方法的组合来实现高性能高斯白噪声。并且考虑加入对高斯白噪声的均值和方差的控制!程序流图如下:

(1)均匀白噪声模块中,采用线性同余法。

这里使用的算法表达式如下:

选取足够大的正整数M和任意自然数n0,a,b,由递推公式:

n i+1=(a*f(n i)+b)mod M i=0,1,…,M-1

生成的数值序列称为是同余序列。当函数f(n)为线性函数时,即得到线性同余序列:

n i+1=(a*n i+b)mod M i=0,1,…,M-1 以下是线性同余法生成伪随机数的程序段:

void uniform(double a,double b,long int *seed)

{ double t;

*seed=2045*(*seed)+1;

*seed=*seed-(*seed/1048576)*1048576;

t=*seed/1048576.0;

t=a+(b-a)*t;

return t;

}

其中种子参数seed可以任意选择,a,b可以是0.01w和0.99w之间的任何整数(w是一个字长)。

应用递推公式产生均匀分布随机数时,式中参数a,b 的选取十分重要。

重复操作,获得均匀分布的随机序列。

得到的序列如图:

由公式E(x)= ∑=N

i i x

N 11得序列的期望,其值为0.505151,与理想值

0.5十分接近。

由统计各区间所含序列点数,绘得概率密度曲线如下图:

曲线在0.9与1.1之间波动,与理想曲线接近。

(2)高斯白噪声模块中,采用公式法。

中心极限定理 如果大量的随机变量组成一个随机变量,即

Y= ,且每个随机变量X i 对总量Y 的影响足够小,在N 趋近于无穷大时,Y (近似)服从正态分布,与X i 的分布律无关。

公式方法取N =12时,分布已经接近高斯分布了。即对产生的12个均匀白噪声按表达式进行操作来获得高斯白噪声。

在获得高斯白噪声后,通过乘法器和加法器实现高斯白噪声方差和均值的调节就得到了参数可调的数字高斯白噪声。因为对高斯分布x ,通过变换y=μ+σx ,可以获得均值为μ、方差为σ2的高斯分布y 。

程序段如下:

//每产生M 个高斯点中的一个点需要N_perpoint 个均匀分布的随机数。 //N_perpoint 越大越精确

//该程序产生M 个均值为MeanNeed ,方差为SigmaNeed 2的高斯随机数

for(i=0;i

{ gauss[i]=0;

s=s+i;//修改每次的种子,使产生不同的变量

for(n=0;n

{ x[n]=uniform(a,b,&s);//产生均匀分布的随机变量 gauss[i]=gauss[i]+sqrt((float)12/N_perpoint)*x[n];

∑=N

i Xi 1

}

gauss[i]=gauss[i]-(float)sqrt((float)12/N_perpoint)* (N_perpoint/2);

gauss[i]=(float)(MeanNeed+SigmaNeed*gauss[i]);

mean=mean+gauss[i]/M;//计算实际得到噪声的期望}

for(i=0;i

sigma=sigma+(gauss[i]-mean)*(gauss[i]-mean)/M;

//计算实际得到噪声的方差

产生的高斯白噪声序列如下图:(期望为0,方差为1,序列长度为1000)

得到的序列期望为0.009893,方差为1.028599,与设定值接近。

统计各区间所含序列点数,绘得概率密度曲线如下图:

相关文档
最新文档