c语言 白噪声,高斯白噪声 C语言实现

c语言 白噪声,高斯白噪声 C语言实现用C语言编程实现高斯白噪声,可以应用于各种软件仿真等。今天编了一个用C语言实现高斯白噪声的程序,一方面自己的项目要用,另一方面可以开源的,希望可以给大家带来方便。请大家使用时也注明是baiguangyu001白栎旸写的,这样我就满足了,呵呵。做出来的序列*n,其方差比预先规定的要小10的-2次方量级,但是总体来说是比较准确的。可以通过改变量化精度Stride来增加概率估计的准确性。/*本程序用…

大家好,欢迎来到IT知识分享网。c语言 白噪声,高斯白噪声 C语言实现

用C语言编程实现高斯白噪声,可以应用于各种软件仿真等。

今天编了一个用C语言实现高斯白噪声的程序,一方面自己的项目要用,另一方面可以开源的,希望可以给大家带来方便。请大家使用时也注明是baiguangyu001 白栎旸写的,这样我就满足了,呵呵。

做出来的序列*n,其方差比预先规定的要小10的-2次方量级,但是总体来说是比较准确的。可以通过改变量化精度Stride来增加概率估计的准确性。

/* 本程序用于产生SNR=db(dB)的均值为0的白噪声序列,编写人:白栎旸,baiguangyu001 */

/* db是信噪比, length是n的长度,n是产生出的白噪声 */

# include

# include

# define PI (3.14)

# define Stride (0.005)

short interleaver[length] = {………..};

注:interleaver是个交织器,长度与参数length一致就行,里面是乱序排列,这个在matlab里用randperm实现就行。

例如:short interleaver[10] = {7,1,9,6,3,2,5,8,4,0};

void awgn(float db, int length, float *n)

{

float pdf[10000] = {0};

float *amp;

float delta=0, amplitude = 0, sum = 0, temp1=0, temp2=0;

int *num;

int counter, counter1, counter2, counter3;

int half_length;

delta = 1 / ( 2 * pow(10,0.1*db) ); // 计算噪声功率

counter = 0; // 通过概率密度计算幅度集合和对应的概率密度

while( sum < (0.5/Stride) )

{

pdf[counter] = 1/sqrt(2*PI*delta)*exp(-0.5*pow(amplitude,2)/delta);

sum += pdf[counter];

amplitude += Stride;

counter++;

} // 最后得到的counter是幅度集合的长度

num = (int *)calloc(counter,sizeof(int)); // num每个幅度在序列中出现的次数,幅度放在amp中

amp = (float *)calloc(counter,sizeof(float));

amplitude = 0;

sum = 0;

temp1 = length*Stride;

temp2 = 0;

for(counter1=0;counter1

{

temp2 = temp1*pdf[counter1];

if( (int)(temp2+0.5)>(int)temp2 )

*(num+counter1) = (int)(temp2+1);

else

*(num+counter1) = (int)temp2;

sum += *(num+counter1);

*(amp+counter1)=amplitude;

amplitude += Stride;

}

temp1 = 0;

half_length = length>>1;

if(sum

{

temp1 = half_length-sum;

for(counter1=0;counter1

(*(num+counter-1-counter1))++;

}

else if(sum>half_length)

{

temp1 = sum-half_length;

*num -= temp1;

}

counter3 = 0;

for(counter1=0;counter1

{

for(counter2=0;counter2

{

*(n+counter3) = *(amp+counter1);

*(n+length-1-counter3) = -*(amp+counter1);

counter3++;

}

}

for(counter1=0;counter1

{

temp1 = *(n+counter1);

*(n+counter1) = *(n+interleaver[counter1]);

*(n+interleaver[co

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12563.html

(0)
上一篇 2024-03-12 16:45
下一篇 2024-03-13 11:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信