我是靠谱客的博主 忧虑茉莉,最近开发中收集的这篇文章主要介绍MATLAB数字信号处理(3)计算方式生成随机序列1.指数分布随机序列2.正态分布随机变量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

信号检测、估计和通信等问题都需要经仿真进行性能分析,产生服从特定分布的随机变量至关重要。

MATLAB中提供了现成的函数random,可以产生服从某种确定分布的随机序列。还有一些其它函数,比如exprnd专门用于产生服从指数分布的随机序列,但总体上random要更为通用。

我们平时只管调用函数即可,简化工作量,而无需关心random函数背后的计算原理。最近学习的《信号检测与估计-理论与应用》简单介绍了一下相关部分。在此做个记录。


1.指数分布随机序列

总的来说,想生成一个服从某确定分布随机变量的一般方法,是先产生[0,1]区间内均匀分布的随机变量U,经过如下变换
X = F x − 1 ( U ) X={F_x}^{-1} (U) X=Fx1(U)
即可产生满足分布函数F_X (x)的随机变量X的随机序列。如参数为1的指数分布随机变量的概率密度函数和分布函数为:
P X ( x ) = e − x , x ≥ 0 P_X (x)=e^{-x}, x≥0 PX(x)=ex,x0
F X ( x ) = 1 − e ( − x ) , x ≥ 0 F_X (x)=1-e^(-x),x≥0 FX(x)=1e(x),x0
由F_X (x)的反函数得到:
X = − l n ( 1 − U ) X=-ln(1-U) X=ln(1U)
由于U服从均匀分布时,1-U也服从均匀分布,因此上式可简化为:
X = − l n ( U ) X=-ln(U) X=ln(U)
设计MATLAB程序如下(R2017a版本下编写),rand函数产生均匀分布的序列。各个函数的具体用法一定要在Help中搜索,没必要在博客里细说。如果经常用MATLAB做仿真,而不是为了应付几次作业,一定要养成查看help文档的习惯。:

%-------------------------------------------------
%            计算产生指数分布随机序列
%-------------------------------------------------
clc; clear; close all;
 
num = 10000;           % 数据长度
n10=num/10;
u = rand(num,1);       % 产生均匀分布序列
 
x = 0:.1:10;
z = -log(u);           % 得到指数分布序列
et = hist(z,x);        % 计算概率密度函数
nznorm = et/n10;       % 归一化
Ex = mean(z); Dx = var(z);  % 计算统计量
plot(x,nznorm,'b'); title('计算方式-指数分布随机变量,Ex='...
    +string(Ex)+',Dx='+string(Dx));
xlabel('x'); ylabel('p_X (x)');
grid on; hold on
y=exp(-x);
plot(x,y,'m')
legend('模拟数据曲线','理论曲线');
 
figure;
%z = exprnd(1,num,1);
z = random('exp',1,[num,1]);
et = hist(z,x);
nznorm = et/n10;       % 归一化
Ex = mean(z); Dx = var(z);  % 计算统计量
plot(x,nznorm,'b'); title('exprnd函数-指数分布随机变量,Ex='...
    +string(Ex)+',Dx='+string(Dx));
xlabel('x'); ylabel('p_X (x)'); grid on;

计算方式生成的随机序列的概率密度函数,与标准指数分布概率密度函数公式的对比如下图。样本点数量num越大,则两者越接近。
在这里插入图片描述
使用random函数产生指数分布随机序列,概率密度函数如下
在这里插入图片描述
指数分布的参数λ为1。计算方式产生的序列数学期望为0.99123,方差为0.99573;random函数产生的序列数学期望为0.99278,方差为0.98932。两者都有不错的性能,和真实参数非常接近(对于指数分布,E(x)=D(x)=λ)。

概率密度函数的计算采用了直方图计算的方式(hist函数),直方图绘制的是所有数据在各个区间内的个数。从离散化的角度来看概率密度函数,意义和直方图一模一样。

无论是MATLAB还是哪种编程语言中,所有基于连续方式定义的公式都要将变量离散化。最简单的例子大家都接触过,用MALLAB绘制一个sin(t)函数,就要先根据采样频率生成离散的时间序列t。

如何将书本、论文中的公式转换为编程语言,是必备技能。本科阶段或许还不是很重视这方面的技能提升,但研究生阶段不会这个连算法都没法仿真,论文都没法写。所以要多加练习,多看代码。


2.正态分布随机变量

random函数也可以生成正态分布的随机序列。下面介绍两种计算方法。

2.1 中心极限定理

假定一个随机变量X是多个独立随机变量之和,在满足一定条件时,随机变量逼近正态分布。一般可以采用m个独立的均匀分布随机变量相加得到X,则X服从均值为m/2、方差为m/12的正态分布。有需要也可以根据概率论知识将生成的序列标准化,得到标准正态分布。

MATLAB设计程序如下(R2017a版本下编写):

%-------------------------------------------------
%            计算产生正态分布随机变量
%-------------------------------------------------
clc; clear; close all;
 
m = 100;              % 序列数目
num = 1000;           % 单个序列的数据长度
 
x = zeros(1,1000);
for i = 1 : m
    u = rand(1,num);       % 产生均匀分布序列
    x = x + u;
end
 
xax=[min(x):.1:max(x)];
nx=hist(x,xax);
plot(xax,nx); title('中心极限定理 num='+string(num));

rand函数产生均匀分布的随机序列,叠加m=100个序列,则理论上的数学期望为m/2=50,方差为m/12=8.33。单个序列的长度num将极大影响到生成随机序列的质量。下面给出不同num下的测试结果。
在这里插入图片描述

显而易见,num越大,叠加序列越接近于服从正态分布的随机序列。

2.2 联合正态分布

利用中心极限定理生成正态分布随机序列,显而易见的弊端就是数据量太大。本节介绍的方法利用log函数和三角函数产生独立的高斯随机变量对。假设U_1和U_2是两个0到1之间的均匀分布。定义:
X = ( − 2 l n U 1 ) c o s ⁡ ( 2 π U 2 ) X=sqrt{(-2lnU_1 )} cos⁡(2πU_2) X=(2lnU1) cos(2πU2)
Y = ( − 2 l n U 1 ) s i n ⁡ ( 2 π U 2 ) Y=sqrt{(-2lnU_1 )} sin⁡(2πU_2) Y=(2lnU1) sin(2πU2)
则随机变量X、Y服从数学期望为0、方差为1的联合正态分布。设计MATLAB程序如下(R2017a版本下编写):

%-------------------------------------------------
%            计算产生正态分布随机变量
%-------------------------------------------------
clc; clear; close all;
num = 100000;
 
ui = rand(1,num);
uq = rand(1,num);
x = zeros(1,num);
y = zeros(1,num);
for i=1:num
   x(i)=((-2.*log(ui(i)))^.5)*cos(2*pi*uq(i));
   y(i)=((-2.*log(ui(i)))^.5)*sin(2*pi*uq(i));
end
 
xax=[-5:.1:5];
yax=[-5:.1:5];
nx=hist(x,xax);
ny=hist(y,yax);
 
p=nx'*ny;
mesh(xax,yax,p)
hold on
xlabel('x'); ylabel('y');
zlabel('p_X_Y(x,y)')

结果如下图:
在这里插入图片描述
今天看书时,对这块比较感兴趣,就结合《信号检测与估计-理论与应用》第二版中文版p18-p21的内容,结合这本书的源程序实现了一下。当然实际中我们不会用这么复杂的方法产生随机序列,直接用random函数就行了。

我对理论类书籍中用代码实现的部分都比较感兴趣。我相信只有锻炼多了,做自己的算法仿真时才能得心应手。

最后

以上就是忧虑茉莉为你收集整理的MATLAB数字信号处理(3)计算方式生成随机序列1.指数分布随机序列2.正态分布随机变量的全部内容,希望文章能够帮你解决MATLAB数字信号处理(3)计算方式生成随机序列1.指数分布随机序列2.正态分布随机变量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部