永发信息网

求高斯白噪声的matlab源程序,,

答案:2  悬赏:20  手机版
解决时间 2021-11-21 14:29
  • 提问者网友:蓝琪梦莎
  • 2021-11-21 01:15
求高斯白噪声的matlab源程序,,
最佳答案
  • 五星知识达人网友:由着我着迷
  • 2021-11-21 02:16
#include
#include
#include
#include
#define PI 3.1415926
#define FRAME 1000
#define VARIANCE 1.0
double WhiteNoise[FRAME];
int PdfCount[16];
//白噪声子程序
void F_CreatWhiteNoise(double fSigma)
{
int i;
int nTemp;
double RandomData1[FRAME],RandomData2[FRAME];
srand((unsigned)time(NULL));
for(i=0;i {
do
{
nTemp = rand();
}
while((nTemp==0)||(nTemp==RAND_MAX));
RandomData1[i]=(double)nTemp/(double)RAND_MAX;
}
for(i=0;i {
do
{
nTemp = rand();
}
while((nTemp==0)||(nTemp==RAND_MAX));
RandomData2[i]=(double)nTemp/(double)RAND_MAX;
}
for(i=0;i {
WhiteNoise[i] = sqrt(-2.0*fSigma*log(RandomData1[i]))*cos(2.0*PI*RandomData2[i]);
}
}
double F_ComputeMean(double* pData ,int nCount)
{
int i;
double LSum,LMean;
LSum = 0.0;
for(i=0;i {
LSum += *pData;
pData ++;
}
LMean = LSum/(double)nCount;
return LMean;
}
double F_ComputeVar(double* pData ,int nCount)
{
int i;
double LSum,LPower,LData;
double LMean,LVariance;
LSum = 0.0;
LPower = 0.0;
for(i=0;i {
LData = *pData;
LSum += LData;
LPower += LData*LData;
pData ++;
}
LMean = LSum/double(nCount);
LVariance = LPower/double(nCount) - LMean*LMean;
return LVariance;
}
void F_ComputePdf(void)
{
int i;
double LData;
double LSigma,LMean;
LMean = F_ComputeMean(&WhiteNoise[0],FRAME);
LSigma = sqrt(F_ComputeVar(&WhiteNoise[0],FRAME));
for(i=0;i<16;i++)
{
PdfCount[i] = 0;
}
for(i=0;i {
LData = WhiteNoise[i];
if(LData < (LMean - 3.5*LSigma))
{
PdfCount[0] ++;
}
if((LData>(LMean-3.5*LSigma)) && (LData<(LMean-3.0*LSigma)))
{
PdfCount[1] ++;
}
if((LData>(LMean-3.0*LSigma)) && (LData<(LMean-2.5*LSigma)))
{
PdfCount[2] ++;
}
if((LData>(LMean-2.5*LSigma)) && (LData<(LMean-2.0*LSigma)))
{
PdfCount[3] ++;
}
if((LData>(LMean-2.0*LSigma)) && (LData<(LMean-1.5*LSigma)))
{
PdfCount[4] ++;
}
if((LData>(LMean-1.5*LSigma)) && (LData<(LMean-1.0*LSigma)))
{
PdfCount[5] ++;
}
if((LData>(LMean-1.0*LSigma)) && (LData<(LMean-0.5*LSigma)))
{
PdfCount[6] ++;
}
if((LData>(LMean-0.5*LSigma)) && (LData {
PdfCount[7] ++;
}
if((LData>LMean) && (LData<(LMean+0.5*LSigma)))
{
PdfCount[8] ++;
}
if((LData>(LMean+0.5*LSigma)) && (LData<(LMean+1.0*LSigma)))
{
PdfCount[9] ++;
}
if((LData>(LMean+1.0*LSigma)) && (LData<(LMean+1.5*LSigma)))
{
PdfCount[10] ++;
}
if((LData>(LMean+1.5*LSigma)) && (LData<(LMean+2.0*LSigma)))
{
PdfCount[11] ++;
}
if((LData>(LMean+2.0*LSigma)) && (LData<(LMean+2.5*LSigma)))
{
PdfCount[12] ++;
}
if((LData>(LMean+2.5*LSigma)) && (LData<(LMean+3.0*LSigma)))
{
PdfCount[13] ++;
}
if((LData>(LMean+3.0*LSigma)) && (LData<(LMean+3.5*LSigma)))
{
PdfCount[14] ++;
}
if(LData>(LMean+3.5*LSigma))
{
PdfCount[15] ++;
}
}
}
////////////////////////////////////////////////////////////////////
void main(void)
{
FILE *fp1,*fp2;;
int i;
F_CreatWhiteNoise(VARIANCE);
F_ComputePdf();
//存储噪声的采样值
if((fp1 = fopen("noise.dat","w+")) == NULL)
{
printf("Open file error !");
exit(1);
};
for(i=0;i {
fprintf(fp1,"%d %f\n",i,WhiteNoise[i]);
}
fclose(fp1);
//存储噪声的概率分布
if((fp2 = fopen("gausspdf.dat","w+")) == NULL)
{
printf("Open file 'gausspdf.dat' error !");
exit(1);
};
for(i=0;i<16;i++)
{
fprintf(fp2,"%d %d\n",i-7,PdfCount[i]);
}
fclose(fp2);
全部回答
  • 1楼网友:毛毛
  • 2021-11-21 02:30
y=randn(1,2500);
y=y/std(y);
y=y-mean(y);
a=0;
b=sqrt(5);
y=a+b*y;

就得到了 N ( 0, 5 ) ,均值为0,方差为5的高斯白噪声序列。

MATLAB中产生高斯白噪声的两个函数
MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。

1. WGN:产生高斯白噪声
y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度。
y = wgn(m,n,p,imp) 以欧姆(Ohm)为单位指定负载阻抗。
y = wgn(m,n,p,imp,state) 重置RANDN的状态。

在数值变量后还可附加一些标志性参数:
y = wgn(…,POWERTYPE) 指定p的单位。POWERTYPE可以是'dBW', 'dBm'或'linear'。线性强度(linear power)以瓦特(Watt)为单位。
y = wgn(…,OUTPUTTYPE) 指定输出类型。OUTPUTTYPE可以是'real'或'complex'。

2. AWGN:在某一信号中加入高斯白噪声
y = awgn(x,SNR) 在信号x中加入高斯白噪声。信噪比SNR以dB为单位。x的强度假定为0dBW。如果x是复数,就加入复噪声。
y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是数值,则其代表以dBW为单位的信号强度;如果SIGPOWER为'measured',则函数将在加入噪声之前测定信号强度。
y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的状态。
y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的单位。POWERTYPE可以是'dB'或'linear'。如果POWERTYPE是'dB',那么SNR以dB为单位,而SIGPOWER以dBW为单位。如果POWERTYPE是'linear',那么SNR作为比值来度量,而SIGPOWER以瓦特为单位。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯