当前位置:文档之家› 随机信号实验报告

随机信号实验报告

随机过程实验报告
通信1206班 U201213696 马建强
一、实验内容
1、了解随机模拟的基本方法,掌握随机数的概念及其产生方法;
2、掌握伪随机数的产生算法以及伪随机数发生器的特点;
3、掌握一般随机数的产生方法;
4、掌握平稳随机过程的数字特征的求解方法。

二、实验步骤
1、利用线性同余法产生在(min,max)上精度为4位小数的平均分布的随机数;
2、编程实现在min 到max 范围内产生服从正态分布的随机数;
3、编程产生服从指数分布的随机数;
4、编程产生服从泊松分布的随机数;
5、计算任意给定分布的随机过程的均值;
6、计算泊松过程的自相关序列。

三、实验代码与结果
1、均匀分布
/*
函数功能,采用线性同余法,根据输入的种子数产生一个伪随机数.
如果种子不变,则将可以重复调用产生一个伪随机序列。

利用CMyRand类中定义的全局变量:S, K, N, Y。

其中K和N为算法参数,S用于保存种子数,Y为产生的随机数
*/
unsigned int CMyRand::MyRand(unsigned int seed)
{
//添加伪随机数产生代码
if(S != seed)
{
S = seed;
Y = (seed * K) % N;
}
else
{
Y = (Y * K) % N;
if(Y == 0)
Y = rand();
}
return Y;
}
/*函数功能,产生一个在min~max范围内精度为4位小数的平均分布的随机数*/
double CMyRand::AverageRandom(double min,double max)
{
int minInteger = (int)(min*10000);
int maxInteger = (int)(max*10000);
int randInteger = MyRand(seed);
int diffInteger = maxInteger - minInteger;
int resultInteger = randInteger % diffInteger + minInteger;
return resultInteger/10000.0;
}
图一、均匀分布
图二、均匀统计
2、正态分布
/*函数功能,在min 到max 范围内产生正态分布的随机数
miu,最大概率密度处的随机变量,即产生的随机数中,概率最大的那个
sigma
*/
double CMyRand::NormalRandom(double miu, double sigma, double min, double max)
{
double dResult;
dResult = 0;
//添加正态分布随机变量产生代码
for(int i=0;i<12;i++)
dResult += AverageRandom(min,max);
dResult = (dResult-6)/(max-min);
dResult = dResult*sigma + miu;
return dResult;
}
图三、正态分布
图四、正态统计
3、指数分布
/*函数功能,产生指数分布的随机数
*/
double CMyRand::ExpRandom(double lambda, double min, double max)
{
double dResult = 0.0;
//添加指数分布随机变量产生代码
while(dResult < 0.01)
{
dResult = AverageRandom(min,max);
}
dResult = -1.0*log(dResult) / lambda;
return dResult;
}
图五、指数分布
图六、指数统计
4、泊松分布
/*函数功能,产生泊松分布的随机数
*/
unsigned int CMyRand::PoisonRandom(double lambda, double min, double max)
{
unsigned int dResult = 0;
//添加泊松分布随机变量产生代码
double u = AverageRandom(min,max);
int i = 0;
double p = exp(-1*lambda);
double F = p;
while(u >= F)
{
p = lambda*p/(i+1);
F += p;
i ++;
}
dResult = i;
return dResult;
}
图七、泊松分布
图八、泊松统计
5、均值
/*函数功能,计算任意分布的随机过程的均值
*/
double CMyRand::Ex(void)
{
int m;
double Ex = 0.0;
//添加均值计算代码]
for (m=0; m<1000; m++)
{
Ex += NormalRandom(0,1.2, 0,1);
}
return Ex/1000;
//return Ex;
}
图九、均值
6、自相关序列
/*函数功能,计算随机过程的自相关序列
*/
double* CMyRand::Rx(double lambda, int points) {
int m,I=5;
double *Rx = (double*)malloc((2*points+1)*sizeof(double));
//添加自相关序列产生代码
//产生的自相关序列存入Rx中,Rx可当作数组使用
//不要在本函数中释放该数组!
for (m=-points; m<=points; m++)
{
Rx[(m+points)] = I * I * exp(-2 * lambda * abs(m));
}
for (m=-points; m<=points; m++)
{
Rx[(m+points)] = I * I * exp(-2 * lambda * abs(m));
}
return Rx;
}
图十、自相关序列
四、实验小结
1、通过本实验复习了C++的编程操作,锻炼了编程能力。

将C++编程与实际随机信号分析结合起来,丰富了动手实践经验。

2、对均匀分布有了更进一步的认识,了解到随机数的产生过程。

通过不断的编程实践理解了伪随机数的产生算法,对以后的编程也有很大帮助。

3、通关直观地观察图像,对正态分布、指数分布、泊松分布等都有了更加直观的认识。

同时也对这门随机过程课增进了理解,是一个很好的对课堂理论知识的补充。

相关主题