Matlab中杂波/瑞利杂波/rand('state',sum(clock))函数的使用

一.杂波问题

  来自于信号杂波问题,由于经常使用的一种幅度分布模型为瑞利分布,所以本文分析瑞利杂波。

二.杂波 产生原理

  Step1:生成高斯白噪声序列

    Step2:对得到的白噪声进行线性滤波器处理 - 得到相关高斯序列

    Step3:采用零记忆非线性变换(Zero Memory Nonlinearity,ZMNL)/球不变随机过程法(Spherically Invariant Random Process,SIRP)产生任意分布的相关随机序列。

三.瑞利杂波 产生原理

  Step1:产生相关高斯杂波 - 将高斯白噪声通过给定的杂波谱密度设计的滤波器【成型滤波器】

    附注:成型滤波器的设计方法是通过对预定的滤波器的频率特性做傅里叶级数的展开,得到FIR滤波器的权系数,如

%=========================================================================%
%                         2.形成滤波器频率响应                             % 
%=========================================================================%
coe_num=12;    %求滤波器系数,用傅里叶级数展开法
    for n=0:coe_num
        coeff(n+1)=2*sigmaf*sqrt(pi)*exp(-4*sigmaf^2*pi^2*n^2/fr^2)/fr;  
    end
    
    for n=1:2*coe_num+1
        if n<=coe_num+1
            b(n)=1/2*coeff(coe_num+2-n);
        else
            b(n)=1/2*coeff(n-coe_num);
        end
    end

    Step2:分别对相关高斯滤波器输出杂波进行取模 - 从而产生相干相关的瑞利杂波

四.rand('state',X)函数

  Matlab中的rand()函数产生的是伪随机数

     兰德-均匀分布伪随机数

  这个MATLAB函数返回一个伪随机标量的标准

    一旦伪随机数初始状态确定,将直接导致产生的伪随机数确定。

   问题来了,Matlab每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:

>> rand('state',1)
>> rand(3,1)

ans =

    0.9528
    0.7041
    0.9539

>> rand(3,1)

ans =

    0.5982
    0.8407
    0.4428

>> rand('state',1)
>> rand(3,1)

ans =

    0.9528
    0.7041
    0.9539
设定初始状态使得只需保存那时初始状态再运行一遍程序即可重现先前结果。

五.rand('state',sum(clock))函数原理浅析

  • 计算机系统中随机数都是伪随机数:
  •     其通过算法产生,若上一个随机数暴露,则下一个随机数就确定
  • 已知从某个数给定,后面连续的随机数序列则都已确定;
  •     此时我们使用随机数类似于“抽取”- 从一个“确定”序列(或者随机数流)抽取数字
  • 为增加随机数的随机性和可控性,用rand('state',X)来设置随机数流的状态
  • 为了增加随机性
  •     用当前时间sum(clock)作为随机数的初始状态
  •         clock返回一个6元素的向量:年月日时分秒
  •              sum求和 即 随机数的初始状态
  • 因为每次运行程序时间不同,so,所得随机数序列也不同
  •     单独使用这句时,改变了随机数流的状态,但是还没有使用,所以不产生任何变量。但这个算法有一个问题是,如果计算机太快的话,仍然会生成相同随机数。
  • 可考虑用 rand('state',sum(clock)*rand(1))。

六.针对上述问题的相应解决办法

6.1 如何设置初始状态

1
2
3
rand ( 'seed' , S)
rand ( 'state' , S)
rand ( 'twister' , S)

  S是表示初始状态的整数。
  seed、state、twister就比较奇怪,令人捉摸不透,不知道该选用哪个。这实际上是产生随机数的不同算法。

  seed表示采用v4版本的随机数产生器,state是v5版本的随机数产生器,最后的twister用的则是Mersenne Twister随机数产生器。

  那么具体该用哪一个呢?在新版本的语法说明中,Matlab给出了答案:前两个随机数产生器都是“flawed”,推荐大家使用twister随机数产生器。

  此外,MathWorks公司意识到了这几个参数可能会产生误导,于是在新版本(2012及以后)的Matlab中更新了语法。

1
2
3
4
5
rng(1);
A =  rand (2,2);
 
rng( 'shuffle' )
A =  rand (2,2);

  新版的Matlab默认采用Mersenne Twister随机数产生器,rng(S) 函数表示设定初始状态,rng('shuffle') 表示随机分配一个初始状态。

  所以现在只需要记住rng()函数设置初始状态,然后用rand产生随机数就可以了。

  然而,有时我们只需要“真正”的伪随机数(不重复!),如何得到?

6.2 产生非重复随机数

  用2012版本之后的用户比较方便,在产生随机数之前使用rng('shuffle')洗一下就可以(shuffle是洗牌的意思)。

对于旧版本的用户,还不支持rng函数。以前一般是rand('state',sum(100*clock))来根据当前时间设定初始状态,但时间始终是递增的,而且变化幅度相对来说很小,效果不是很好。

  有很多人用别的方式设定初始状态(如rand('twister', fix(mod(1e11*(sum(clock)-2009), 2^31)));),为简便起见,个人推荐采用新版Matlab中rng函数语法,即rand('twister',mod(floor(now*8640000),2^31-1)) ,这样可以产生的不同的随机数。采用这种办法大约每497天种子才会重复一次,一般使用的话足够了。


转载声明!

作者: 张朋飞
本文版权归作者张朋飞所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值