高斯信号和非高斯信号的问题
最近看到这个问题,我就查了一些相关的资料。后来发现即使在百度和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 是我的计算的程序有问题,还是什么原因导致的误差?欢迎高手批评指导
[ 本帖最后由 花如月 于 2007-12-20 18:45 编辑 ] 太感激了,这个问题分析得很清晰,而且还有计算说明,对于我这样的初学者受益匪浅!
回复 #2 无水1324 的帖子
院长太谦虚了,我昨天看到你的问题。后来就查了资料,结果计算的时候和理论还是有出入。也不知道哪里出了问题(猜测可能是信号本身的问题带来的,想产生严格意义上的高斯分布信号估计也不容易)。路过的高手们都给看看哦、、、[ 本帖最后由 花如月 于 2007-7-26 09:19 编辑 ] 而且正在考虑高斯白噪声信号的滤除问题,大家有好什么好的办法呢?频域滤波肯定行不通 1。随机问题都有取样误差的问题,只有当样本趋于无穷大,样本才正确,而任何有限样本肯定存在误差。
2。randn是通过非线性叠代产生的伪随机数,并非真正的随机数。任何基于有限自动机理论上面的随机数生成函数都是伪随机数 这么说,程序计算的偏斜度和峭度应该没有问题吧?看来果然是我信号本身的问题。顺便请教一下VibrationMaster老师,高斯噪声应该如何消除呢?
[ 本帖最后由 花如月 于 2007-7-26 09:48 编辑 ] 1。统计性能最好的是最大似然估计。
2。在很多常用的情形下,上述估计退化为最小二乘法
3。如果数据很长,而且感兴趣的信号的频带比较集中,则滤波法是最方便的方法 原帖由 VibrationMaster 于 2007-7-26 11:38 发表
3。如果数据很长,而且感兴趣的信号的频带比较集中,则滤波法是最方便的方法
能说的详细些么,比如一个正弦信号加了高斯白噪声,具体该怎么滤除呢?我用了1维中值滤波,不过效果非常一般 原帖由 花如月 于 2007-7-26 11:44 发表
能说的详细些么,比如一个正弦信号加了高斯白噪声,具体该怎么滤除呢?我用了1维中值滤波,不过效果非常一般
可以使用EMD、小波等试试 好贴,另外matlab里面也有两个函数用来计算偏斜度和峭度:skewness和kurtosis。当然楼主直接按公式计算意义更加明确。
同时可以通过下面的语句画出信号幅值的概率密度分布函数,以获取直观了解。
= ksdensity(x);
plot(xi,f); % 画概率密度曲线
利用楼主上面程序得到信号y后,画出概率密度曲线如下图中的蓝线所示。图中红线为标准正态分布曲线,直接观察差别不大。
[ 本帖最后由 zhlong 于 2007-8-9 15:32 编辑 ]
回复 #1 花如月 的帖子
花版主这两句x=x/std(x);
x=x-mean(x);
似乎和eight的精华帖http://forum.vibunion.com/forum/vi ... p%3Bfilter%3Ddigest
有点出入。1. 首先更正一个错误,我认为在“生成N ( 0.0128, 0.9596 ) 的高斯分布序列”的程序中,应该改为以下的代码:
%===================eight=====================================%
y=randn(1,2500);
y=y-mean(y);
y=y/std(y);
a=0.0128;
b=sqrt(0.9596);
y=a+b*y;
%==========================================================%
原帖由 zhlong 于 2007-8-10 08:05 发表
花版主这两句
x=x/std(x);
x=x-mean(x);
似乎和eight的精华帖http://www.chinavib.com/forum/vi ... p%3Bfilter%3Ddigest
有点出入。
“归一化时先减均值后除方差”只是我个人的观点而已,不知道大家的意见是否一致
回复 #12 eight 的帖子
大致想了一下个人觉得应该关系不大,先除方差不会影响均值,同样先减去均值也不会影响方差。可以做下面的数值试验:
x=randn(1,5000);%t=;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)
[ 本帖最后由 zhlong 于 2007-8-10 15:01 编辑 ] subplot(121),plot(y); %此处可以看到高斯白噪声的频谱还是白噪声
这个是我看的问题还是。。。。。没有变换到频域啊,怎么说能看出是白噪声呢
回复 #14 后知后觉 的帖子
经验证偏斜度和峭度的误差较大,不过abs(Y)的概率密度曲线仍然和高斯函数曲线基本吻合。你可用13楼龙的方法测试一下。如VibrationMaster 老师所说,这里边的分析误差肯定是有。只能大
致上接近理论分析
页:
[1]
2