Mathcad到Matlab-白噪声、fft和NPS测试
我试图在Matlab中编写简单的函数来计算和绘制噪声功率谱(NPS)。首先,我想测试我从老师那里得到的算法是否正确。在这里(它是用mathcad制作的) 因此,我尝试将其复制粘贴到Matlab脚本中,最终得到以下代码: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,
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代码以及预期的频谱吗?我很难理解你在做什么来关联噪音。好的,我明白了。将它们添加到主帖子中。