python产生高斯白噪声,python加噪声
介绍了如何利用Python自行生成随机序列,并实现了Whichmann/Hill生成器。
参考:
基本原理
本文将随机数大致分为均匀分布和非均匀分布两种。通过非线性变换可以得到均匀分布的随机数。所以均匀分布的随机数更基本。引文[3]提到了三种生成算法:线性同余法、联合法和反馈位移寄存器法。限于时间,简单介绍一下线性同余法:
线性同余是基于同余计算的方法,将原来的序列重新排列。该方法从一个“种子”开始,递归地得到整个随机序列[3]:
\begin{equation}
x _ I=ax _ { I-1 } c \ quad \ left(\ mod m \ quad \ right)
\end{equation}
其中$x_i$,$a$和$c$都是正整数,$x_0$称为种子,$a$称为乘数,当$c=0$时,称为乘法同余法,反之亦然。
查语录[3]这本书,全是英文的,但是很长,不过我还是翻了翻。当我翻到第47页时,我发现了算法的清晰表达。该算法由Wichmann和Hill于1982年发表,将三个生成器组合成一个同余生成器。由于易于编程且随机性极好(书中简述了相关研究),本文选择该算法实现[1]:
\begin{equation}
\begin{cases}
x_i \equiv 171x_{i-1}\mod 30269 \\
y_i \equiv 172x_{i-1}\mod 30307\\
z_i \equiv 170x_{i-1}\mod 30323\\
u _ I=\ left(\ dfrac { x _ I } { 30269 } \ dfrac { y _ I } { 30307 } \ dfrac { z _ I } { 30323 } \ right)\ mod 1
\end{cases}
\end{equation}
生成器的种子是$\left(x_0,y_0,z_0\right)$,是一个三元向量。生成器在区间$\left(0,1\right)$内直接生成$u_i$。从最后的表达式可以看出,分母的值很大。
实现
为了减少代码量,我把$ x,y,z $放在一个名为x的变量下,把A,B设置为np.array格式,避免序列之间不支持对应元素的乘,除,求补的问题。
# -*-编码:utf-8 -*-
创建于8月28日星期二
@作者:adgk07
生成噪声信号的脚本
将numpy作为np导入
来自pylab import *
S=[1,3,7] #用户定义种子
L=1024 #用户定义长度
a=np.array([171。 172, 170])
b=np.array([30269。 30307, 30323])
x=np.zeros((L,3))
x[0]=S
y=np.zeros(L)
y[0]=np.sum(S/b)%1
对于np.arange(L-1)中的数字:
x[数字1]=(a* x[数字])%b
y[数字1]=NP . sum(x[数字1]/b)%1
绘图(y)
显示()
上面的例程可以重写为一个函数。
结束
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。