【问题标题】:How to generate noise using specific variance如何使用特定方差产生噪声
【发布时间】:2017-01-06 00:38:06
【问题描述】:

在用于向信号添加噪声的matlab函数awgn()中,有没有办法指定方差?

一般来说,我会简单地完成noisevec = sqrt(2)*randn(length(X),1); 创建方差为 2 的噪声向量。然后噪声观察是

Y = X+noisevec

但是,我想应用 awgn() 然后检查噪声的方差是否确实如用户指定的那样。该怎么做?

         % add noise to produce
         % an SNR of 10dB, use:
         X = sin(0:pi/8:6*pi);
         Y = awgn(X,10,'measured');

更新:根据解决方案,使用提供的答案/解决方案中给出的 awgn() 和不使用 awgn() 生成具有特定方差的噪声时,输出应该相同。我的理解有问题吗?这是我检查的方式。

x =  rand(1,10); $generating source input
snr =10;
variance = 0.1;
%This procedure is  based on the answer
y1 = awgn(x, snr, 'measured');
y1 = x + (y1 - x) * sqrt(variance / var(y1 - x));

%This is the traditional way, without using awgn()

 y2 = x+sqrt(variance)*randn(1,10);

y1 不等于 y2。我想知道为什么?

【问题讨论】:

  • 不清楚你在问什么。您是否正在尝试验证 awgn() 的方差是否真的如其所说?
  • @OliverCharlesworth:我想知道我们是否可以使用 awgn() 来生成具有特定噪声方差的噪声信号。
  • var(Y-X) 会起作用吗?我认为这会给你awgn() 应用的差异。

标签: matlab noise


【解决方案1】:

awgn 不会产生具有特定方差的噪声。但是,如果您必须生成具有特定方差的噪声,您可以考虑定义自己的噪声生成器,它可以简单地将噪声放大或缩小到所需的水平:

function y = AddMyNoise(x, variance)
    y = awgn(x, 10, 'measured');
    y = x + (y - x) * sqrt(variance / var(y - x));
end

更新:请注意,这种强制输出具有特定方差的方法可能很危险:如果 x 的元素很少,它会给出奇怪的输出。在 x 为标量的限制下,这种方法将 +-sqrt(variance) 的固定值添加到 x。没有白噪声了。但是,如果您有多个数据点,您会得到一个合理的白噪声。

【讨论】:

  • 这是一个很奇怪的函数——snr 在这里没有任何作用。为什么不直接使用 randn 的缩放版本?
  • 您对snr、@OliverCharlesworth 的看法是正确的。我相应地编辑了我的答案。但是randn 的输出与所谓的noise 之间存在很大差异。 在信号处理中,白噪声是具有恒定功率谱密度的随机信号。这意味着噪声的频谱很重要。看看the definition of white noise.
  • 在最近一次编辑之后,我认为这个答案是有道理的。
  • @erfan - 我明白 - 但randn 会给你 WGN(它的样本是高斯分布的,并且是独立的)。我怀疑如果你深入研究awgn 的实现,你会发现它只是调用randn
  • @SKM 在我的回答中查看更新。这是我所期望的唯一区别。除此之外,确实输出总是不同的,因为它们无论如何都是随机的。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 2014-10-25
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
相关资源
最近更新 更多