我正在尝试在 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);
我对 rayryeng 修复的代码所做的唯一更改是使噪声矩阵为正方形 (1000x1000),平均值也为 1000,并使用整个变换向量 W1 而不是它的“一半”。我知道它确实对我的老师有用,但对我没有用...关于matlab fft还有其他我忽略的东西还是我使用的“相关方法”?
经过一些快速更改后在 Mathcad 中添加它的外观(一些细微的差异,但总体上它显示了我应该得到的效果)。它切断了扫描的开始,但它与我在本文开头放置的 1 完全相同。
[编辑2]
Nvm,这只是 fft 函数中的维度问题。将其更改为 fft(dataw, [], 2) 后看起来更好。