白噪声 java_白噪声 高斯白噪声
发布日期:2021-06-24 13:22:21 浏览次数:2 分类:技术文章

本文共 3222 字,大约阅读时间需要 10 分钟。

使用2D矢量场的 LIC(line integral convolution) 算法时,需要使用 白噪声图片 作为输入。查阅了相关资料。整理如下:

1. 白噪声的定义

白光是所有颜色的光的叠加而成,不同颜色的光本质区别是他们的频率不同(如 红光频率低、紫光频率高)。与白光类似,白噪声在功率谱密度上(若以频率为横轴,信号幅度的平方为功率(在纵轴上))分布为常值,即从高频到低频各种频率的噪声都有(从频域上考虑),也即每个时刻出现的噪声幅值都是随机的(从时域上考虑)。

2. 高斯白噪声的定义

曲线的形状由两个参数决定:均值 和方差

a. 均值公式:

9a4469d48869558294f4a6d455a82360.png   。均值决定了曲线的对称中线;

b.方差公式:

c82074276ba99c54fee4eb2dacf21044.png。 方差决定曲线的胖瘦,即贴近中线的程度。

概率密度定义了信号出现的频率随幅值的变化情况,以信号幅值为横轴,以出现的频率为纵轴。因此,从概率密度角度来说,高斯白噪声的幅度服从高斯分布。

下面给出了图示说明:

(1) 白噪声

功率谱:(y轴表示噪声值,已归一化至【0,1】区间。)           概率谱:

bde8d33622b198472c4243d1aa24d7de.png     

6459fc410bf27ea11829e15c34572c69.png

(2) 高斯白噪声

功率谱:(未作归一化)                                                      概率谱:

0ede7fd976c7ec21f17d4d4011b8e1e7.png   

9041ef6e54b9430d78b5acd887a9c35e.png

代码 1.1. 使用乘同余法  生成 白噪声

/**************************

用乘同余法产生均匀分布白噪声(一串随机序列)。算法及程序实现叙述如下。

1) 在函数之外设定随机种子,随机序列为sequence,长度 n

2) 取 M =2^35,x = (A*x)mod M;e[i]= x/M ; 循环n次,得到均匀分布白噪声序列e[].该伪随机数的循环周期为2^(35-2)。

3) 实际实现中,将 e[i]= x/M ; 替换为 取ei的 小数部分 再赋值给ei+1,循环n次,就得到均匀分布白噪声序列;

*************************/

void whiteNoise(vector &sequence,intn)

{int x =rand();int A = 3125;double M = pow(2.0f,35.0f);

sequence.resize(n);double seed =double(x/M);

sequence[0]= ( A * seed - int( A * seed ));//取小数部分

double average = 0,serror=0; //统计均值、方差

for (int i=1;i

{

sequence[i]=( A * sequence[i-1] - int( A * sequence[i-1] ));//取小数部分,获得均匀分布白噪声序列

average+=sequence[i];

}

average/=n;//得到均值

for(int i=0;i

{

serror+=(sequence[i]-average)*(sequence[i]-average);

}

serror/=n;//得到方差

counter1.resize(pieceNum);//用vecotr counter 进行概率统计,共分为 pieceNum 份 进行统计

int max=0;for(int i=0;i

{int index = sequence[i]/double(10.0f/pieceNum)+pieceNum/2;

counter1[index]++;if(counter1[index] >max)

max=counter1[index];

}for(int i=0;i

{

counter1[i]/=(double)max; //归一化

}

}

代码 1.2. 使用 迭代取中法  生成 白噪声

/*************************************

用迭代取中法产生均匀分布白噪声

***************************************/

void MakeWhiteNoise(vector &sequence,intn)

{

sequence.resize(n);for(int j = 0; j < n; j ++)

{int r =rand();

r= ( (r & 0xff) + ( (r & 0xff00) >> 8 ) ) & 0xff;//截取后8位

sequence[j] = (unsigned char) r/(double)0xff;//归一化

}

counter1.resize(pieceNum);//用vecotr counter 进行概率统计,共分为 pieceNum 份 进行统计

int max=0;for(int i=0;i

{int index = sequence[i]/double(10.0f/pieceNum)+pieceNum/2;

counter1[index]++;if(counter1[index] >max)

max=counter1[index];

}for(int i=0;i

{

counter1[i]/=(double)max; //归一化

}

}

代码 2.1.  使用公式生成 高斯白噪声

/*************************

先生成两个(0,1)间随机白噪声序列 sq1,sq2,再利用公式: c[i]=serror*(–2*log sq1[i])^0.5*cos(2*pi*sq2[i]) +average 循环n次

计算得到均值和方差可任意调整的白噪声序列。

*************************/

void guassWhiteNoise(vector &vdGuassSequence,int n,double average,doubleserror)

{//根据均值和方差得到调整后的白噪声序列

vectorsq1,sq2;

whiteNoise(sq1,n);//使用乘同余法

whiteNoise(sq2,n);/*MakeWhiteNoise(sq1,n); //或使用迭代取中法

MakeWhiteNoise(sq2,n);*/vdGuassSequence.resize(n);double average2 = 0,serror2=0;//均值、方差

for (int i=0;i

{if(sq1[i]!=0)

vdGuassSequence[i]= serror* sqrt((-2) *log(sq1[i])) * sin( 2*PI* sq2[i]) +average;elsevdGuassSequence[i]= serror* sqrt((-2) *log(0.0000001)) * sin( 2*PI* sq2[i]) +average;

average2+=vdGuassSequence[i];

}

average2/=n;//得到均值

for(int i=0;i

{

serror2+=(vdGuassSequence[i]-average2)*(vdGuassSequence[i]-average2);

}

serror2/=n;//得到方差

counter2.resize(pieceNum+1);//用vecotr counter2 进行概率统计,共分为 pieceNum 份 进行统计

int max=0;for(int i=0;i

{int index = vdGuassSequence[i]/double(20.0f/pieceNum)+pieceNum/2;

counter2[index]++;if(counter2[index] >max)

max=counter2[index];

}for(int i=0;i

{

counter2[i]/=(double)max; //归一化

}

}

转载地址:https://blog.csdn.net/weixin_33102135/article/details/114850374 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql索引调试工具_mysql 优化调试命令
下一篇:Java线程信息传递_java – Restlet – 安全地(线程方式)将信息从Filter传递给Resource...

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月02日 15时47分00秒