首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab中的Mathcad白噪声fft和NPS测试

Matlab中的Mathcad白噪声fft和NPS测试
EN

Stack Overflow用户
提问于 2014-12-12 17:54:42
回答 1查看 904关注 0票数 2

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

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

代码语言:javascript
复制
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);

我不使用Poisson分布,我已经切换了行列索引,但这不重要(对吗?)问题是,我的作品中的值几乎比预期的要大400倍。

下面是它应该是什么样子:

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

编辑

过了一段时间后,我的老师让我检查这种方法是否适用于相关的(某种)噪声,因为它同样适用于数学。相关后,其NPS应在较高频率处“下降”。问题是它没有。我用来测试这个的代码如下所示:

代码语言:javascript
复制
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中添加一些快速更改后的外观(一些微小的差异,但总的来说,它显示了我应该得到的效果)。它切断了扫描的乞求,但与我在这篇文章的开头所写的完全相同。

EDIT2

Nvm,它只是fft函数的一个维数问题。在将其转换为fft(dataw,[],2)后,它看起来更好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-12 18:30:42

它不工作的主要原因是由于MathCad和MATLAB之间的快速傅立叶变换的比例因子。对于MathCad,有一个额外的缩放因子1/sqrt(N),而MATLAB 不包括这个所谓的缩放因子。因此,如果您想要模拟使用MathCad看到的结果,则需要将快速傅立叶变换的结果乘以这个缩放因子。

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

  1. 我们可以在没有任何循环的情况下完全实现这个矢量化。
  2. fftrandn这样的函数可以对矩阵进行操作,您可以具体地将该函数应用于一个特定的维度。

请注意,我已经将您的随机噪声分布替换为Poisson随机噪声(来自poissrnd),这样我就可以模拟您老师看到的结果。

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

代码语言:javascript
复制
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可以对行或列进行操作,并将该维度中的每个信号视为一维信号。在本例中,您希望对每一列进行操作,并对行进行处理,这就是为什么我们将1的参数指定为第三个参数的原因。

这就是当我运行上面的代码时得到的结果:

你看,它徘徊在1500平均值左右,这就是我们从泊松随机分布中得出的lambda=1500分布的预期。如果您真的想使图形看起来像您的老师,那么将y轴的限制从0改为2000,如下所示:

代码语言:javascript
复制
ylim([0 2000]);

因此,我们得到:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27449358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档