Mathcad到Matlab - 随机过程和NPS

时间:2015-01-30 14:39:55

标签: matlab random noise spectrum mathcad

我试图将一个简单的Mathcad文件转换为MATLAB脚本,但我得到的结果很奇怪。兰特函数有什么不同吗?我忘记了那些与这两种环境不同的必要条件吗?

这就是Mathcad文件的样子:

enter image description here

enter image description here

这是我目前正在使用的代码:

clear all
clc

N=100;
data=poissrnd(1000,N,N);
data2=zeros(N);
for l=1:N
    for k=1:N
       drozp=zeros(1,3);
       eta_fot=data(l,k);
       for m=1:eta_fot
          ran=rand(1);
          if ran<0.25
              drozp(1)=drozp(1)+1;
          elseif ran>=0.75
              drozp(3)=drozp(3)+1;
          else
              drozp(2)=drozp(2)+1;
          end
       end
       if (k>1) && (k<N)
          data2(l,k)=data2(l,k)+drozp(2);
          data2(l,k-1)=data2(l,k-1)+drozp(1);
          data2(l,k+1)=data2(l,k+1)+drozp(3);
       elseif k==1
          data2(l,k)=data2(l,k)+drozp(2);
          data2(l,N)=data2(l,N)+drozp(1);
          data2(l,k+1)=data2(l,k+1)+drozp(3);
       else
          data2(l,k)=data2(l,k)+drozp(2);
          data2(l,1)=data2(l,1)+drozp(3);
          data2(l,k-1)=data2(l,k-1)+drozp(1);
       end

    end
end

data2 = data2 - mean(data2(:));
data_w = (1/sqrt(N))*fftshift(fft(data2, [], 2));

NPS1=(abs(data_w)).^2;
NPS2=sum(NPS1);
NPS=(1/N)*NPS2;

plot(NPS)

现在,我知道它可以更快地运行,最初是这个块:

for m=1:eta_fot
          ran=rand(1);
          if ran<0.25
              drozp(1)=drozp(1)+1;
          elseif ran>=0.75
              drozp(3)=drozp(3)+1;
          else
              drozp(2)=drozp(2)+1;
          end
       end

看起来像这样:

[~,R] = histc(rand(1,eta_fot),cumsum([0;w(:)./sum(w)]));
R=a(R);
drozp=histc(R,a)

其中:

a=1:3;
w=[0.25,0.5,0.25];

但是我试图接近Mathcad文件。然后,我得到的结果(无论我采用哪种方式)都看起来很糟糕。见下图。

enter image description here

我可以获得与Mathcad文件类似的结果的唯一方法是将整个rand循环更改为“刚性”&#39; drozp(1)=0.25*eta_fotdrozp(2)=0.5*eta_fotdrozp(3)=0.25*eta_fot,但之后它与概率无关。然后rand循环看起来(至少在功能上)就像在Mathcad中使用的那样,所以我不知道出了什么问题。

我有什么遗失的东西吗?我无法理解的东西?我不知所措。

0 个答案:

没有答案