資源簡介
實現用c++實現高斯噪聲的產生,可以對圖像進行添加,可以設定高斯噪聲的均值和方差。

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?N_gauss 2000 //產生1000個點高斯序列
#define?N_perpoint 100 //每個高斯點需要100個均勻分布的隨機數
#define?N_h 2000 //產生1000個點H(n)
#define?N_ans 4000 //輸出序列長度
#define?PI 3.1415926f
#define?GAUSS 0 //在printans時的type,使用代表gauss
#define?ANS 1 //在printans時的type,使用代表ans
void?init_gauss(double?gauss[]) //清gauss[N_gauss]序列全部為0
{
int?i;
for?(i=0;?i {
gauss[i]?=?0;
}
}
void?gauss_gen(double?x[]?double?gauss[])//產生長度為N_gauss的高斯序列
{
int i?n?stime;
long ltime;
for(i=0;?i {
ltime?=?time(NULL);
stime?=?(unsigned?int)ltime;
stime?=?stime+i; //隨機的stime
srand(stime); //獲取隨機種子next
for(n=0;?n x[n]?=?0;
for(n=0;?n {
//初始化隨機數序列x[N_perpoint]為隨機數范圍0~1
x[n]?=?(double)rand()/(RAND_MAX);
gauss[i]?=?gauss[i]?+?x[n]; //gauss范圍-N_perpoint~N_perpoint
}
//使gauss有正有負,對半分,gauss范圍-N_perpoint/2~N_perpoint/2
gauss[i]?=?gauss[i]?-?(N_perpoint/2);
gauss[i]?=?gauss[i]/(N_perpoint); //gauss范圍-1/2~1/2
}
}
void?dft(double?x[]?int?len?double?rx[]?double?ix[]?double?y[])//離散傅里葉變換
{
int?k?n;
for?(k=0;?k {
rx[k]?=?0;
ix[k]?=?0;
y[k]?=?0;
for?(n=0;?n {
rx[k]?=?rx[k]?+?x[k]*cos(2*PI*n*k/len);
ix[k]?=?ix[k]?-?x[k]*sin(2*PI*n*k/len);
}
y[k]?=?sqrt(rx[k]*rx[k]?+?ix[k]*ix[k]);
}
}
void?bp_gauss_gen(double?rh[]?double?ih[])//通過已有的高斯噪聲序列,產生帶通高斯白噪聲
{
int?i;
for?(i=0;?i<500;?i++)
{
rh[i]?=?0;
ih[i]?=?0;
}
for?(i=1501;?i {
rh[i]?=?0;
ih[i]?=?0;
}
}
//頻域相乘
void?multiply(double?rx[]?double?ix[]?double?rh[]?double?ih[]?double?real[]?double?imag[])
{
int?i;
for(i=0;i<(N_gauss+N_h);i++)
????{
real[i]=rx[i]*rh[i]-ix[i]*ih[i];
imag[i]=rx[i]*rh[i]+ix[i]*rh[i];
????}
}
void?idft_(double?rx[]?double?ix[]?double?y[])//離散傅里葉逆變換
{
int k?n?length;
length?=?N_gauss+N_h;
double ry[(N_gauss+N_h)]?iy[(N_gauss+N_h)];
for?(k=0;?k {
ry[k]?=?0;
iy[k]?=?0;
y[k]?=?0;
for?(n=0;?n {
ry[k]?=?ry[k]?+?rx[n]*cos(2*PI*n*k/length)-ix[n]*sin(2*PI*n*k/length);
iy[k]?=?iy[k]?+?rx[n]*sin(2*PI*n*k/length)+ix[n]*cos(2*PI*n*k/length);
}
y[k]?=?sqrt(ry[k]*ry[k]?+?iy[k]*iy[k]);
}
}
void?printans(double?x[]?bool?type)//各種輸出
{
int?i?len;
char*?str;
switch(type)
{
case?0: //如果輸出gauss
str?=?“gauss“;
len?=?N_gauss;
break;
case?1: //如果輸出ans
str?=?“ans“;
len?=?N_gauss+N_h;
break;
}
for?(i=0;?i {
if?(i%3?==?0)
{
cout< }
cout< < < }
if?(str?==?“gauss“)
cout< }
void?output(double?ans[]
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????249900??2009-12-08?21:41??高斯噪聲\Debug\gaosi.exe
?????文件?????305516??2009-12-08?21:41??高斯噪聲\Debug\gaosi.ilk
?????文件??????23665??2009-12-08?21:41??高斯噪聲\Debug\gaosi.obj
?????文件?????341448??2009-12-08?21:03??高斯噪聲\Debug\gaosi.pch
?????文件?????590848??2009-12-08?21:41??高斯噪聲\Debug\gaosi.pdb
?????文件??????50176??2009-12-08?21:41??高斯噪聲\Debug\vc60.idb
?????文件??????61440??2009-12-08?21:41??高斯噪聲\Debug\vc60.pdb
?????文件???????4024??2009-12-08?21:41??高斯噪聲\gaosi.cpp
?????文件???????3389??2009-12-08?21:25??高斯噪聲\gaosi.dsp
?????文件????????535??2009-12-08?22:43??高斯噪聲\gaosi.dsw
?????文件??????33792??2009-12-08?22:43??高斯噪聲\gaosi.ncb
?????文件??????48640??2009-12-08?22:43??高斯噪聲\gaosi.opt
?????文件????????741??2009-12-08?21:41??高斯噪聲\gaosi.plg
?????目錄??????????0??2009-12-08?21:41??高斯噪聲\Debug
?????目錄??????????0??2009-12-08?22:43??高斯噪聲
-----------?---------??----------?-----??----
??????????????1714114????????????????????15
- 上一篇:c++遠程控制源代碼
- 下一篇:MFC窗體設計
評論
共有 條評論