您的位置:首页 > 其它

高斯信号和非高斯信号中偏斜度和峭度的问题

2013-11-13 22:02 155 查看


转自:http://blog.163.com/xi_beijing2008/blog/static/139615561201012344329261/

感谢:xi_beijing2008


一楼:

最近看到这个问题,我就查了一些相关的资料。后来发现即使在百度和google的搜索引擎里也没有发现特别令人满意的定义和令人信服的区分方法。最后就将搜索范围转到了中国期刊网,还真找到了一篇大牛的文章。拿来分享一下,同时由发现了不少问题,欢迎大家讨论。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

概率密度分布为非正态分布的随机信号统称非高斯信号,在工程中通常用偏斜度S和峭度K两个参数来描述。高斯随机过程的偏斜度和峭度恒等于零,而非高斯随机过程的偏斜度和峭度至少有一个不恒为零,S和K的定义见附图

偏斜度是衡量随机信号的分布偏离对称分布的歪斜程度,偏斜度不等于零的信号必定服从非对称分布。而峭度表征统计频率曲线接近分布中心时的大致状态,它不仅可以用来区分高斯和非高斯信号,而且还可进一步将非高斯信号分为亚高斯信号(峭度值小于零)和超高斯信号(峭度值大于零)。在工程仿真应用中(例如随机振动分析和疲劳可靠性分析等),常常要求模拟同时具有指定功率谱、偏斜度和峭度值大小的非高斯随机过程。引自“指定功率谱密度、偏斜度和峭度值下的非高斯随机过程数字模拟”一文(系统仿真学报)  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这里我想自己编一段程序来验证一下上边的结论,就是对一个高斯白噪声序列求一下它的偏斜度和峭度是否为零。先来看一下高斯白噪声序列的产生问题。在matlab里产生高斯白噪声可以用randn、wgn和normrnd,后2者都是功能上(内部都调用randn)更强,本质上产生高斯白噪声的就只有randn函数。在数字信号处理 (第二版   胡广书 清华大学出版社)这本书的45页这样介绍randn的“本文件可以用来产生均值为零、方差为1、服从高斯分布的白噪声信号u(n)其调用格式和rand相同.....”。下边就看看这个函数的一些问题:

>> mean(randn(1,100))

ans =

-0.0235

>> mean(randn(1,1000))

ans =

-0.0170

>> mean(randn(1,10000))

ans =

0.0032

>> mean(randn(1,100000))

ans =

0.0044

>> mean(randn(1,1000000))

ans =

   9.6919e-004

可以看到这里所指的均值为零,是有条件的即序列长度无穷大的时候。序列长度为10万的时候均值为0.0044,这个数说大不大,可是等于零还是非常有问题的。怎么解决这个问题呢?后来搜索一下看到有人解决了这个问题所以就拿来用了,为了验证用randn产生的高白噪声是一个高斯随机信号。根据附图的公式计算偏斜度S和峭度K看其是否为零,验证程序如下:

clear;

x=randn(1,10000); 

x=x/std(x); 

x=x-mean(x); 

a=0; %均值 

b=1; %方差

y=a+sqrt(b)*x;   %产生均值零,方差为1的高斯噪声

Y=fft(y);

subplot(121),plot(y); title('白噪声y')          %此处可以看到高斯白噪声的频谱还是白噪声

subplot(122),plot(abs(Y)); title('y的幅值谱') %高斯函数的傅立叶变换还是高斯函数

S=mean(y.^3)./(mean(y.^2)).^1.5;%此处计算偏斜度

K=mean(y.^4)./(mean(y.^2)).^2-3;%此处计算峭度

>> mean(y)

ans =

   3.6515e-017

>> var(y)

ans =

1.0000

>> S

S =

-0.0018

>> K

K =

0.0353

可以看到均值已经非常小,可以认为是零。方差挺准确,可惜计算的偏斜度和峭度就和零差距不小。序列长度取到100万的时候S= 0.0012,K=-2.8134e-004 是我的计算的程序有问题,还是什么原因导致的误差?欢迎高手批评指导

五楼:

1。随机问题都有取样误差的问题,只有当样本趋于无穷大,样本才正确,而任何有限样本肯定存在误差。

2。randn是通过非线性叠代产生的伪随机数,并非真正的随机数。任何基于有限自动机理论上面的随机数生成函数都是伪随机数

六楼:

这么说,程序计算的偏斜度和峭度应该没有问题吧?看来果然是我信号本身的问题。顺便请教一下VibrationMaster老师,高斯噪声应该如何消除呢

七楼:
1。统计性能最好的是最大似然估计。

2。在很多常用的情形下,上述估计退化为最小二乘法

3。如果数据很长,而且感兴趣的信号的频带比较集中,则滤波法是最方便的方法

十楼:

好贴,另外matlab里面也有两个函数用来计算偏斜度和峭度:skewness和kurtosis。当然楼主直接按公式计算意义更加明确。

同时可以通过下面的语句画出信号幅值的概率密度分布函数,以获取直观了解。

[f,xi] = ksdensity(x); 

plot(xi,f); % 画概率密度曲线

十二楼:

“归一化时先减均值后除方差”只是我个人的观点而已,不知道大家的意见是否一致

十三楼:

大致想了一下个人觉得应该关系不大,先除方差不会影响均值,同样先减去均值也不会影响方差。

可以做下面的数值试验:

引用:
x=randn(1,5000);%t=[0.001:0.001:10];x = cos(20*pi*t)+1;

x1=x-mean(x);

x1=x1/std(x1);

x2=x/std(x);

x2=x2-mean(x2);

mean(x1)

mean(x2)

std(x1)

std(x2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: