将fortran中的高斯噪声添加到数据数组

时间:2015-10-01 07:09:48

标签: fortran

我需要一些帮助才能将高斯噪声添加到我的Fortran代码中。我必须基本上构造一个大小为4的数组。我在数组中输入值,然后我必须添加噪声。我已经尝试在互联网上查找这个并找到使用随机数组的解决方案然后在阵列中添加guassian噪声,但无法找到将噪声添加到预设数组的解决方案。

我已经给出了下面代码的一部分

real, dimesnsion(1:4):: stoke

!create an array
stoke(1)=sum_iu
stoke(2)=diff_iu
stoke(3)=sum_iq
stoke(4)=diff_iq

do ij=1,4

   print*, 'stoke=' ,ij,'=',stoke(ij)

end do

! add gaussian noise to the data

do ij=1,xx-1,2

      temp= sd*sqrt(-2.0*log(stoke(ij)))*cos(2*pi*(stoke(ij+1)))+mean
      stoke(ij+1)=sd*sqrt(-2.0*log(stoke(ij))) * sin(2*pi*(stoke(ij+1)))+mean
      stoke(ij)=temp

print*,'the values are= ','stoke(ij)',stoke(ij),'stoke(ij+1)',stoke(ij+1)
end do

当我运行它时,它将结果输出为四个输出值的NaN。但是如果我使用随机数array(size=4)代替stokes(4),它会显示数字。

1 个答案:

答案 0 :(得分:1)

我认为您可能正在使用Box-Muller方法从两个均匀随机数生成两个高斯随机数。那么,如果要将高斯噪声添加到现有数组(这里是stoke),我想代码将会变成这样:

do ij = 1, size( stoke )-1, 2   !! assuming the array size is even...

    u = rand()   !! uniform random number in [0,1)
    v = rand()   !! same as above (another sample)

    stoke( ij   ) = stoke( ij   ) + sd * sqrt(-2.0*log( u )) * cos( 2*pi * v ) + mean
    stoke( ij+1 ) = stoke( ij+1 ) + sd * sqrt(-2.0*log( u )) * sin( 2*pi * v ) + mean
end do