Mathcad到Matlab-白噪声、fft和NPS测试

Mathcad到Matlab-白噪声、fft和NPS测试,matlab,fft,noise,spectrum,mathcad,Matlab,Fft,Noise,Spectrum,Mathcad,我试图在Matlab中编写简单的函数来计算和绘制噪声功率谱(NPS)。首先,我想测试我从老师那里得到的算法是否正确。在这里(它是用mathcad制作的) 因此,我尝试将其复制粘贴到Matlab脚本中,最终得到以下代码: clear all; clc; N=1000; O=1024; mn=zeros(N,O); n0=1500; s=sqrt(n0); W=zeros(N,O/2); W1=zeros(N,O); for k=1:N for l=1:O mn(k,

我试图在Matlab中编写简单的函数来计算和绘制噪声功率谱(NPS)。首先,我想测试我从老师那里得到的算法是否正确。在这里(它是用mathcad制作的)

因此,我尝试将其复制粘贴到Matlab脚本中,最终得到以下代码:

clear all;
clc;


N=1000;
O=1024;
mn=zeros(N,O);
n0=1500;
s=sqrt(n0);
W=zeros(N,O/2);
W1=zeros(N,O);

for k=1:N
    for l=1:O
        mn(k,l)=n0+round(sin(randn)*s);
    end
end

for k=1:N
    for l=1:O
        mn(k,l)=mn(k,l)-n0;
    end
end

for k=1:N
    W1(k,:)=fft(mn(k,:));
end

for k=1:N
   for l=1:O/2
       W(k,l)=W1(k,l);
   end
end

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

plot(NPS);
我没有使用泊松分布,我已经切换了行-列索引,但这不重要(对吧?)。问题是,我的图中的值几乎比预期值大400倍

下面是它的外观:

我试图找出我做错了什么,但经过一段时间的测试,我又回到了原点。。。唯一让我担心的是,也许Matlab fft函数的工作原理与Mathcad中使用的函数有点不同(不能说我完全理解它)。 任何一个善良的灵魂都能告诉我这是关于fft函数的吗?还是我只是个瞎子,看不见自己犯的愚蠢错误? 为我糟糕的英语干杯并道歉

[编辑]

过了一段时间,我的老师让我检查这个方法是否适用于mathcad中的相关噪声。 关联后,其NPS应在较高频率下“下降”。问题是它没有。我用来测试的代码如下所示:

clear all;
clc;

N=1000;

mn = poissrnd(N, N, N);
dataw=zeros(N);

for k=1:N ## loop used for my teacher's correlation method
    for l=1:N
        if l>1 && l<N
            dataw(k,l)=dataw(k,l)+mn(k,l)*0.5+mn(k,l-1)*0.25+mn(k,l+1)*0.25;
        elseif l==1
            dataw(k,l)=dataw(k,l)+mn(k,l)*0.75+mn(k,l+1)*0.25;
        else
            dataw(k,l)=dataw(k,l)+mn(k,l)*0.75+mn(k,l-1)*0.25;
        end
    end
end

dataw = dataw - mean(dataw(:));
W1 = (1/sqrt(N))*fft(dataw, [], 1);

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

plot(NPS);
全部清除;
clc;
N=1000;
mn=poissrnd(N,N,N);
数据w=零(N);
对于k=1:N##循环,用于我老师的相关方法
对于l=1:N

如果l>1&&l则其不起作用的主要原因是MathCad和MATLAB之间FFT的比例因子。对于MathCad,有一个额外的比例因子
1/sqrt(N)
,而MATLAB不包含该比例因子。因此,如果要模拟MathCad的结果,需要将FFT结果乘以该比例因子

另外,我对您的代码有一些建议:

  • 我们可以完全使其矢量化,而无需任何循环
  • 诸如
    fft
    randn
    之类的函数可以对矩阵进行操作,您可以将该函数专门应用于一个特定维度 注意,我已经用泊松随机噪声(from)替换了随机噪声分布,这样我就可以模拟老师看到的结果


    基本上,您的代码可以替换为:

    clear all;
    clc;
    
    N=1000;
    O=1024;
    n0=1500;
    s=sqrt(n0);
    
    %mn = round(sin(randn(N,O)*s));
    mn = poissrnd(n0, N, O); %// CHANGE
    mn = mn - mean(mn(:)); %// Remove mean
    W1 = (1/sqrt(N))*fft(mn, [], 1); %// CHANGE FROM ABOVE
    W = W1(:,1:O/2);
    
    NPS1=(abs(W)).^2;
    NPS2=sum(NPS1);
    NPS=(1/N)*NPS2;
    
    plot(NPS);
    

    请注意,在生成随机数据时,您添加了平均值1500。。。。仅从中再次减去1500,而不对偏移数据进行任何处理。我刚刚从你的正弦舍入随机噪声代码中删除了它。我把代码注释掉了,因为我现在无论如何都不会运行它。另外,请注意,
    randn
    可以接受行数和列数,以便生成随机的矩阵。此外,<代码> FFT可以在行或列上操作,并将该维度中的每个信号视为1D信号。在本例中,您希望对每列进行操作,并对行进行处理,这就是为什么我们将
    1
    参数指定为第三个参数

    这是我运行上述代码时得到的结果:


    你可以看到它徘徊在1500左右,这是我们从泊松随机分布中得出的期望值,λ=1500。如果确实希望使图形看起来像老师的图形,请将y轴的限制从0更改为2000,如下所示:

    ylim([0 2000]);
    
    因此,我们得到:


    我已经写了答案。它不起作用的原因很微妙。我还介绍了一些如何使代码运行更快的技巧。祝你好运非常感谢,伙计!真的(我的意思是真的)感谢您提供的深入分析和提示。我真的很感激@华纳-我的荣幸:)信号处理是我每天做的事情。这个问题我忍不住要回答!祝你好运再次感谢你的帮助!能够进一步推动整个项目,但又回到了核动力源问题上:你们在主要职位的下面看看会不会有问题?这似乎是个简单的问题,但我没有主意了\@华纳-你能发布MathCad代码以及预期的频谱吗?我很难理解你在做什么来关联噪音。好的,我明白了。将它们添加到主帖子中。