
在matlab中怎样实现随机信号的产生
Matlab中随机信号的产生在matlab编程中,我们所能用到的用于产生随机信号的函数有三:Rand,randn,randi下面我们详细的了解一下这三个函数。
1.Rand功能是生产均匀分布的伪随机数,并且所生成的伪随机数分布在(0-1);主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数Rand(m,n.’double’)生成制定精度的均匀分布的伪随机数,参数还可以是’single’;Rand(randStream,m,n)利用指定的randStream生成伪随机数2.Randn生成标注正态分布的伪随机数(均值为0,方差为1)语法同上;3.Randi生成均匀分布的伪随机整数主要语法:randi(iMax)在开区间(0,iMax)生成均匀分布的伪随机整数Randi(iMax,m,n)在开区间(0,iMax)生成m×n型随机矩阵r=randi([iMin,iMax],m,n)在开区间(iMin,iMax)生成m×n型随机矩阵下面我们来看看具体的例子:1,Rand散点图:xh=rand(1,2500);plot(xh)概率分布图:xh=rand(1,25000);hist(xh,2000)2,Randn散点图:xh=randn(1,400000);plot(xh)概率分布图:xh=randn(1,400000);hist(xh,2000)3,Randi散点图:r=randi([12,214],1,144);plot(r)概率分布图:r=randi([12,214],1,144);hist(r,10000)对于随机种子,伪随机数的重复生成,在正常情况下每次调用相同指令生成的伪随机数是不同的例如:rand(1,4)rand(1,4)输出结果为:ans=0.04280.24020.02960.0398ans=0.77530.46870.33780.0074在一些特殊
急
基于不同窗函数的STFT变换的研究
信号处理高手请进不懂信号处理方面的勿进
STFT,全名叫做短时傅里叶变换,它的思想是对一个随机信号做傅里叶频谱分析,更直接的说,就是在一个相当短的时间函数窗内截取目标信号进行频谱分析,达到对随机信号分析处理的目的。
如下:选择一个时频局部化的窗函数,假定分析窗函数g(t)在一个短时间间隔内是平稳(伪平稳)的,移动窗函数,使f(t)g(t)在不同的有限时间宽度内是平稳信号,从而计算出各个不同时刻的功率谱。
短时傅里叶变换使用一个固定的窗函数,窗函数一旦确定了以后,其形状就不再发生改变,短时傅里叶变换的分辨率也就确定了。
如果要改变分辨率,则需要重新选择窗函数。
短时傅里叶变换用来分析分段平稳信号或者近似平稳信号犹可,但是对于非平稳信号,当信号变化剧烈时,要求窗函数有较高的时间分辨率;而波形变化比较平缓的时刻,主要是低频 信号,则要求窗函数有较高的频率分辨率。
短时傅里叶变换不能兼顾频率与时间分辨率的需求。
短时傅里叶变换窗函数受到测不准原理的限制,时频窗的面积不小于2。
这也就从另一个侧面说明了短时傅里叶变换窗函数的时间与频率分辨率不能同时达到最优。
也就是,时间与频率不可能同时最优化。
要想达到优化处理,就需要选用不同的窗函数,这就是楼主您的课题了。
STFT当前主要用于随机信号检测,医学上的神经信号分析,军事上的雷达信号分析等等,应用在当前来说相对比较广泛。
光电子信息工程和电子信息工程有什么区别
首先需要声明的会产生绝对随机的随机数,计算机只能产生“机数”。
其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。
计算机只能生成相对的随机数,即伪随机数。
伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。
怎样理解呢
产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。
比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。
从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。
那么计算机中随机数是怎样产生的呢
有人可能会说,随机数是由“随机种子”产生的。
没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。
那么随机种子是从哪里获得的呢
下面看这样一个C程序:\\\/\\\/rand01.c#include
这样可以通过temp数组把0040:006CH处的一个16位的数送给RAND_SEED。
random用来根据随机种子RAND_SEED的值计算得出随机数,其中这一句:RAND_SEED=(RAND_SEED*123+59)%65536;是用来计算随机数的方法,随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安装的不同的操作系统中也是不同的。
我在linux和windows下分别试过,相同的随机种子在这两种操作系统中生成的随机数是不同的,这说明它们的计算方法不同。
现在,我们明白随机种子是从哪儿获得的,而且知道随机数是怎样通过随机种子计算出来的了。
那么,随机种子为什么要在内存的0040:006CH处取
0040:006CH处存放的是什么
学过《计算机组成原理与接口技术》这门课的人可能会记得在编制ROM BIOS时钟中断服务程序时会用到Intel 8253定时\\\/计数器,它与Intel 8259中断芯片的通信使得中断服务程序得以运转,主板每秒产生的18.2次中断正是处理器根据定时\\\/记数器值控制中断芯片产生的。
在我们计算机的主机板上都会有这样一个定时\\\/记数器用来计算当前系统时间,每过一个时钟信号周期都会使记数器加一,而这个记数器的值存放在哪儿呢
没错,就在内存的0040:006CH处,其实这一段内存空间是这样定义的:TIMER_LOW DW ? ;地址为 0040:006CH TIMER_HIGH DW ? ;地址为 0040:006EH TIMER_OFT DB ? ;地址为 0040:0070H 时钟中断服务程序中,每当TIMER_LOW转满时,此时,记数器也会转满,记数器的值归零,即TIMER_LOW处的16位二进制归零,而TIMER_HIGH加一。
rand01.c中的movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);正是把TIMER_LOW和TIMER_HIGH两个16位二进制数放进temp数组,再送往RAND_SEED,从而获得了“随机种子”。
现在,可以确定的一点是,随机种子来自系统时钟,确切地说,是来自计算机主板上的定时\\\/计数器在内存中的记数值。
这样,我们总结一下前面的分析,并讨论一下这些结论在程序中的应用:1.随机数是由随机种子根据一定的计算方法计算出来的数值。
所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。
看下面这个C++程序:\\\/\\\/rand02.cpp#include 这是因为在相同的编译平台环境下,由随机种子生成随机数的计算方法都是一样的,再加上随机种子一样,所以产生的随机数就是一样的。 2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时\\\/计数器的值)看下面这个C++程序:\\\/\\\/rand03.cpp#include 3.建议:如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。 看下面这个用来生成一个随机字符串的C++程序:\\\/\\\/rand04.cpp#include 如果你把srand((unsigned)time(NULL));改成srand(2);这样虽然在一次运行中产生的字符序列是随机的,但是每次运行时产生的随机字符序列串是相同的。 把srand这一句从程序中去掉也是这样。 此外,你可能会遇到这种情况,在使用timer控件编制程序的时候会发现用相同的时间间隔生成的一组随机数会显得有规律,而由用户按键command事件产生的一组随机数却显得比较随机,为什么 根据我们上面的分析,你可以很快想出答案。 这是因为timer是由计算机时钟记数器精确控制时间间隔的控件,时间间隔相同,记数器前后的值之差相同,这样时钟取值就是呈线性规律的,所以随机种子是呈线性规律的,生成的随机数也是有规律的。 而用户按键事件产生随机数确实更呈现随机性,因为事件是由人按键引起的,而人不能保证严格的按键时间间隔,即使严格地去做,也不可能完全精确做到,只要时间间隔相差一微秒,记数器前后的值之差就不相同了,随机种子的变化就失去了线性规律,那么生成的随机数就更没有规律了,所以这样生成的一组随机数更随机。 这让我想到了各种晚会的抽奖程序,如果用人来按键产生幸运观众的话,那就会很好的实现随机性原则,结果就会更公正。 最后,我总结两个要点:1.计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。 所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。 2.只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。 比如一个信号用S(t)=sin(2t)来表示,那么=sin(2t-1)--改变里面的初相,就是平移,sin(-2t)--改变t的符号,就是翻转,sin(4t)--改变t的系数就是尺度变换。哈工大通信研究生



